Add subtitle rename

This commit is contained in:
EstrellaXD
2023-05-03 15:42:25 +08:00
parent ae76c9baf8
commit 3a59838ca3
6 changed files with 133 additions and 45 deletions

View File

@@ -14,9 +14,9 @@ logger = logging.getLogger(__name__)
class Renamer:
def __init__(self, download_client: DownloadClient, settings: Config):
self.client = download_client
self._client = download_client
self._renamer = TitleParser()
self.notification = PostNotification()
self._notification = PostNotification()
self.settings = settings
@staticmethod
@@ -26,49 +26,46 @@ class Renamer:
logger.debug(f"Checked {torrent_count} files")
def get_torrent_info(self, category="Bangumi"):
recent_info = self.client.get_torrent_info(category=category)
recent_info = self._client.get_torrent_info(category=category)
torrent_count = len(recent_info)
return recent_info, torrent_count
@staticmethod
def check_files(info, suffix_type: str = "media"):
if suffix_type == "subtitle":
suffix_list = [".ass", ".srt"]
else:
suffix_list = [".mp4", ".mkv"]
file_list = []
def check_files(info):
media_list = []
subtitle_list = []
for f in info.files:
file_name = f.name
suffix = os.path.splitext(file_name)[-1]
if suffix.lower() in suffix_list:
file_list.append(file_name)
return file_list
if suffix.lower() in [".mp4", ".mkv"]:
media_list.append(file_name)
elif suffix.lower() in [".ass", ".srt"]:
subtitle_list.append(file_name)
return media_list, subtitle_list
def rename_file(self, info, media_path: str, settings: Config):
def rename_file(self, info, media_path: str, rename_method: str, bangumi_name: str, season: int, remove_bad_torrents: bool):
torrent_name = info.name
suffix = os.path.splitext(media_path)[-1]
compare_name = media_path.split(os.path.sep)[-1]
bangumi_name, season = self.get_season_info(info.save_path, settings)
new_path = self._renamer.torrent_parser(
torrent_name=torrent_name,
bangumi_name=bangumi_name,
season=season,
suffix=suffix,
method=settings.bangumi_manage.rename_method
method=rename_method
)
if compare_name != new_path:
try:
self.client.rename_torrent_file(_hash=info.hash, old_path=media_path, new_path=new_path)
self.notification.send_msg(bangumi_name, "update")
self._client.rename_torrent_file(_hash=info.hash, old_path=media_path, new_path=new_path)
self._notification.send_msg(bangumi_name, "最新剧集已经更新,已自动重命名。")
except Exception as e:
logger.warning(f"{torrent_name} rename failed")
logger.warning(f"Season name: {bangumi_name}, Season: {season}, Suffix: {suffix}")
logger.debug(e)
# Delete bad torrent
self.delete_bad_torrent(info, settings)
self.delete_bad_torrent(info, remove_bad_torrents)
def rename_collection(self, info, media_list: list[str], settings: Config):
bangumi_name, season = self.get_season_info(info.save_path, settings)
def rename_collection(self, info, media_list: list[str],bangumi_name: str, season: int, remove_bad_torrents: bool):
_hash = info.hash
for media_path in media_list:
path_len = len(media_path.split(os.path.sep))
@@ -80,41 +77,53 @@ class Renamer:
bangumi_name=bangumi_name,
season=season,
suffix=suffix,
method=settings.bangumi_manage.rename_method
method="pn"
)
if torrent_name != new_name:
try:
self.client.rename_torrent_file(_hash=_hash, old_path=media_path, new_path=new_name)
self._client.rename_torrent_file(_hash=_hash, old_path=media_path, new_path=new_name)
except Exception as e:
logger.warning(f"{torrent_name} rename failed")
logger.warning(f"Bangumi name: {bangumi_name}, Season: {season}, Suffix: {suffix}")
logger.debug(e)
# Delete bad torrent.
self.delete_bad_torrent(info, settings)
self.client.set_category(category="BangumiCollection", hashes=_hash)
self.delete_bad_torrent(info, remove_bad_torrents)
self._client.set_category(category="BangumiCollection", hashes=_hash)
def rename_subtitles(self, subtitle_list: list[str], _hash):
def rename_subtitles(
self,
subtitle_list: list[str],
bangumi_name: str,
season: int,
_hash
):
for subtitle_path in subtitle_list:
suffix = os.path.splitext(subtitle_path)[-1]
old_name = subtitle_path.split(os.path.sep)[-1]
new_name = self._renamer.torrent_parser(old_name, suffix)
new_name = self._renamer.torrent_parser(
method="subtitle",
torrent_name=old_name,
bangumi_name=bangumi_name,
season=season,
suffix=suffix
)
if old_name != new_name:
try:
self.client.rename_torrent_file(_hash=_hash, old_path=subtitle_path, new_path=new_name)
self._client.rename_torrent_file(_hash=_hash, old_path=subtitle_path, new_path=new_name)
except Exception as e:
logger.warning(f"{old_name} rename failed")
logger.warning(f"Suffix: {suffix}")
logger.debug(e)
def delete_bad_torrent(self, info, settings: Config):
if settings.bangumi_manage.remove_bad_torrent:
self.client.delete_torrent(info.hash)
def delete_bad_torrent(self, info, remove_bad_torrent: bool):
if remove_bad_torrent:
self._client.delete_torrent(info.hash)
logger.info(f"{info.name} have been deleted.")
@staticmethod
def get_season_info(save_path: str, settings: Config):
def get_season_info(save_path: str, download_path: str):
# Remove default save path
save_path = save_path.replace(settings.downloader.path, "")
save_path = save_path.replace(download_path, "")
# Check windows or linux path
path_parts = PurePath(save_path).parts \
if PurePath(save_path).name != save_path \
@@ -135,17 +144,63 @@ class Renamer:
def rename(self):
# Get torrent info
download_path = self.settings.downloader.path
rename_method = self.settings.bangumi_manage.rename_method
remove_bad_torrents = self.settings.bangumi_manage.remove_bad_torrent
recent_info, torrent_count = self.get_torrent_info()
rename_count = 0
for info in recent_info:
media_list = self.check_files(info)
media_list, subtitle_list = self.check_files(info)
bangumi_name, season = self.get_season_info(info.save_path, download_path)
if len(media_list) == 1:
self.rename_file(info, media_list[0], self.settings)
rename_count += 1
# TODO: Rename subtitles
self.rename_file(
info=info,
media_path=media_list[0],
rename_method=rename_method,
bangumi_name=bangumi_name,
season=season,
remove_bad_torrents=remove_bad_torrents
)
if len(subtitle_list) > 0:
self.rename_subtitles(
subtitle_list=subtitle_list,
bangumi_name=bangumi_name,
season=season,
_hash=info.hash
)
elif len(media_list) > 1:
logger.info("Start rename collection")
self.rename_collection(info, media_list, self.settings)
rename_count += len(media_list)
self.rename_collection(
info,
media_list,
bangumi_name,
season,
remove_bad_torrents
)
if len(subtitle_list) > 0:
self.rename_subtitles(
subtitle_list=subtitle_list,
bangumi_name=bangumi_name,
season=season,
_hash=info.hash
)
else:
logger.warning(f"{info.name} has no media file")
if __name__ == '__main__':
from module.conf import settings, setup_logger
setup_logger()
client = DownloadClient(settings)
renamer = Renamer(client, settings)
info, _ = renamer.get_torrent_info(category="BangumiCollection")
for i in info:
_hash = i.hash
_, subtitle_list = renamer.check_files(i)
print(_hash)
bangumi_name, season = renamer.get_season_info(i.save_path, settings.downloader.path)
renamer.rename_subtitles(
subtitle_list,
bangumi_name=bangumi_name,
season=season,
_hash=_hash
)

View File

@@ -42,6 +42,7 @@ class TelegramNotification:
}
with RequestContent() as req:
resp = req.post_data(self.notification_url, data)
logger.debug(f"Telegram notification: {resp.status_code}")
return resp.status_code == 200
@@ -58,4 +59,5 @@ class ServerChanNotification:
}
with RequestContent() as req:
resp = req.post_data(self.notification_url, data)
logger.debug(f"ServerChan notification: {resp.status_code}")
return resp.status_code == 200

View File

@@ -22,6 +22,11 @@ RULES = [
r"(.*)E(\d{1,4})(.*)",
]
SUBTITLE_LANG = {
"zh-tw": ["TC", "CHT", "", "zh-tw"],
"zh": ["SC", "CHS", "", "zh"],
}
def rename_init(name, folder_name, season, suffix) -> DownloadInfo:
n = re.split(r"[\[\]()【】()]", name)
@@ -87,12 +92,33 @@ def rename_none(info: DownloadInfo):
return info.name
def rename_subtitle(info: DownloadInfo):
subtitle_lang = "zh"
for key, value in SUBTITLE_LANG.items():
for lang in value:
if lang in info.name:
subtitle_lang = key
break
for rule in RULES:
match_obj = re.match(rule, info.file_name, re.I)
if match_obj is not None:
title = re.sub(r"([Ss]|Season )\d{1,3}", "", match_obj.group(1)).strip()
title = title if title != "" else info.folder_name
new_name = re.sub(
r"[\[\]]",
"",
f"{title} S{info.season}E{match_obj.group(2)}.{subtitle_lang}{info.suffix}",
)
return new_name
METHODS = {
"normal": rename_normal,
"pn": rename_pn,
"advance": rename_advance,
"no_season_pn": rename_no_season_pn,
"none": rename_none
"none": rename_none,
"subtitle": rename_subtitle,
}
@@ -108,6 +134,6 @@ def torrent_parser(
if __name__ == "__main__":
name = "[织梦字幕组][鬼灭之刃 锻刀村篇 鬼滅の刃 刀鍛冶の里編][01集][1080P][AVC][简日双语].mp4"
new_name = torrent_parser(name, "异世界舅舅2022", 2, ".mp4", "pn")
name = "Lycoris Recoil S01E08.mp4"
new_name = torrent_parser(name, "Lycoris", 1, ".ass", "subtitle")
print(new_name)