diff --git a/auto_bangumi/app.py b/auto_bangumi/app.py index 895fbb0c..2d7be96e 100644 --- a/auto_bangumi/app.py +++ b/auto_bangumi/app.py @@ -39,8 +39,6 @@ def save_data_file(bangumi_data): def run(): args = parse() - # from const_dev import DEV_SETTINGS - # settings.init(DEV_SETTINGS) if args.debug: try: from const_dev import DEV_SETTINGS @@ -48,16 +46,18 @@ def run(): logger.debug("Please copy `const_dev.py` to `const_dev.py` to use custom settings") settings.init(DEV_SETTINGS) else: - # init_switch() settings.init() setup_logger() time.sleep(3) download_client = DownloadClient() download_client.init_downloader() + if settings.rss_link is None: + logger.error("Please add RIGHT RSS url.") + quit() download_client.rss_feed() rss_collector = RSSCollector() renamer = Renamer(download_client) - loop = 0 + loop_zero = True while True: bangumi_data = load_data_file() try: @@ -66,16 +66,16 @@ def run(): download_client.eps_collect(bangumi_data["bangumi_info"]) download_client.add_rules(bangumi_data["bangumi_info"]) save_data_file(bangumi_data) - if loop == 0: + if loop_zero: logger.info(f"Waiting for downloading torrents...") - time.sleep(600) + time.sleep(0) renamer.run() time.sleep(settings.sleep_time) except Exception as e: if args.debug: raise e logger.exception(e) - loop += 1 + loop_zero = False if __name__ == "__main__": diff --git a/auto_bangumi/bangumi_parser/analyser/download_parser.py b/auto_bangumi/bangumi_parser/analyser/download_parser.py new file mode 100644 index 00000000..7f9cfb49 --- /dev/null +++ b/auto_bangumi/bangumi_parser/analyser/download_parser.py @@ -0,0 +1,45 @@ +import re +import logging +from os import path + + +logger = logging.getLogger(__name__) + +class EPParser: + def __init__(self): + self.rules = [ + r"(.*)\[(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)", + r"(.*)\[E(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)", + r"(.*)\[第(\d*\.*\d*)话(?:END)?\](.*)", + r"(.*)\[第(\d*\.*\d*)話(?:END)?\](.*)", + r"(.*)第(\d*\.*\d*)话(?:END)?(.*)", + r"(.*)第(\d*\.*\d*)話(?:END)?(.*)", + r"(.*)- (\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)? (.*)", + ] + + def rename_normal(self, name): + for rule in self.rules: + matchObj = re.match(rule, name, re.I) + if matchObj is not None: + new_name = f"{matchObj.group(1).strip()} E{matchObj.group(2)}{matchObj.group(3)}" + return new_name + + def rename_pn(self, name): + n = re.split(r"[\[\]()【】()]", name) + file_name = name.replace(f"[{n[1]}]", "") + for rule in self.rules: + matchObj = re.match(rule, file_name, re.I) + if matchObj is not None: + new_name = re.sub( + r"[\[\]]", + "", + f"{matchObj.group(1).strip()} E{matchObj.group(2)}{path.splitext(name)[-1]}", + ) + return new_name + + +if __name__ == "__main__": + name = "[NC-Raws]间谍过家家 - 09(B-Global 3840x2160 HEVC AAC MKV).mkv" + rename = EPParser() + new_name = rename.rename_pn(name) + print(new_name) \ No newline at end of file diff --git a/auto_bangumi/bangumi_parser/analyser/rss_parser.py b/auto_bangumi/bangumi_parser/analyser/rss_parser.py index c9db73cb..bc7e2e6d 100644 --- a/auto_bangumi/bangumi_parser/analyser/rss_parser.py +++ b/auto_bangumi/bangumi_parser/analyser/rss_parser.py @@ -41,10 +41,7 @@ class ParserLV2: if not seasons: name = name_season season_number = 1 - if settings.season_one_tag: - season_raw = "S01" - else: - season_raw = "" + season_raw = "S01" if settings.season_one_tag else "" else: name = re.sub(season_rule, "", name_season) for season in seasons: diff --git a/auto_bangumi/bangumi_parser/fuzz_match.py b/auto_bangumi/bangumi_parser/fuzz_match.py new file mode 100644 index 00000000..66bddf1b --- /dev/null +++ b/auto_bangumi/bangumi_parser/fuzz_match.py @@ -0,0 +1,12 @@ +#from thefuzz import fuzz + + +# TODO 模糊匹配模块 + + +# class FuzzMatch: +# def __init__(self, anidb_data): +# self.match_data = anidb_data +# +# def fuzz(self, raw_name): +# fuzz.radio() \ No newline at end of file diff --git a/auto_bangumi/const.py b/auto_bangumi/const.py index ecdaee68..783a4b14 100644 --- a/auto_bangumi/const.py +++ b/auto_bangumi/const.py @@ -1,14 +1,13 @@ # -*- encoding: utf-8 -*- DEFAULT_SETTINGS = { - "host_ip": "localhost:8080", + "host_ip": "localhost:8181", "sleep_time": 1800, "user_name": "admin", "password": "adminadmin", - "rss_link": "https://mikanani.me/RSS/classic", "download_path": "/downloads/Bangumi", "method": "pn", - "enable_group_tag": True, + "enable_group_tag": False, "info_path": "/config/bangumi.json", "not_contain": "720", "rule_url": "https://raw.githubusercontent.com/EstrellaXD/Bangumi_Auto_Collector/main/AutoBangumi/config/rule.json", @@ -17,8 +16,9 @@ DEFAULT_SETTINGS = { "debug_mode": False, "season_one_tag": True, "remove_bad_torrent": False, - "add_pause": False, - "data_version": 3.0 + "dev_debug": False, + "data_version": 3.0, + "enable_eps_complete": False } ENV_TO_ATTR = { diff --git a/auto_bangumi/core/download_client.py b/auto_bangumi/core/download_client.py index c3483c22..384c442f 100644 --- a/auto_bangumi/core/download_client.py +++ b/auto_bangumi/core/download_client.py @@ -39,7 +39,7 @@ class DownloadClient: "affectedFeeds": [settings.rss_link], "ignoreDays": 0, "lastMatch": "", - "addPaused": False, + "addPaused": settings.dev_debug, "assignedCategory": "Bangumi", "savePath": str( os.path.join( @@ -49,10 +49,7 @@ class DownloadClient: ) ), } - if settings.enable_group_tag: - rule_name = f"[{group}] {bangumi_name}" - else: - rule_name = bangumi_name + rule_name = f"[{group}] {bangumi_name}" if settings.enable_group_tag else bangumi_name self.client.rss_set_rule(rule_name=rule_name, rule_def=rule) @@ -95,7 +92,7 @@ class DownloadClient: save_path=download["save_path"], category="Bangumi" ) - time.sleep(0.1) + time.sleep(settings.connect_retry_interval) info["download_past"] = False def get_torrent_info(self): diff --git a/auto_bangumi/core/eps_complete.py b/auto_bangumi/core/eps_complete.py index 6a256ecd..ca2541bd 100644 --- a/auto_bangumi/core/eps_complete.py +++ b/auto_bangumi/core/eps_complete.py @@ -34,7 +34,7 @@ class FullSeasonGet: else: season = self.season search_str = re.sub(r"[& ]", "+", - f"{self.group}+{self.bangumi_name}+{season}+{self.subtitle}+{self.source}+{self.dpi}") + f"{self.group} {self.bangumi_name} {season} {self.subtitle} {self.source} {self.dpi}") season = requests.get( f"https://mikanani.me/RSS/Search?searchstr={search_str}" ) diff --git a/auto_bangumi/core/fuzz_match.py b/auto_bangumi/core/fuzz_match.py deleted file mode 100644 index 778f6a1f..00000000 --- a/auto_bangumi/core/fuzz_match.py +++ /dev/null @@ -1,12 +0,0 @@ -from thefuzz import fuzz - - -# TODO 模糊匹配模块 - - -class FuzzMatch: - def __init__(self, anidb_data): - self.match_data = anidb_data - - def fuzz(self, raw_name): - fuzz.radio() \ No newline at end of file diff --git a/auto_bangumi/core/renamer.py b/auto_bangumi/core/renamer.py index 2ccccb8c..7373420b 100644 --- a/auto_bangumi/core/renamer.py +++ b/auto_bangumi/core/renamer.py @@ -4,6 +4,7 @@ from pathlib import PurePath from conf import settings from core.download_client import DownloadClient +from bangumi_parser.analyser.download_parser import EPParser logger = logging.getLogger(__name__) @@ -11,51 +12,23 @@ logger = logging.getLogger(__name__) class Renamer: def __init__(self, downloadClient: DownloadClient): self.client = downloadClient - self.rules = [ - r"(.*)\[(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)", - r"(.*)\[E(\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)?\](.*)", - r"(.*)\[第(\d*\.*\d*)话(?:END)?\](.*)", - r"(.*)\[第(\d*\.*\d*)話(?:END)?\](.*)", - r"(.*)第(\d*\.*\d*)话(?:END)?(.*)", - r"(.*)第(\d*\.*\d*)話(?:END)?(.*)", - r"(.*)- (\d{1,3}|\d{1,3}\.\d{1,2})(?:v\d{1,2})?(?:END)? (.*)", - ] + self._renamer = EPParser() + self.recent_info = self.client.get_torrent_info() + self.rename_count = 0 + self.torrent_count = len(self.recent_info) - def rename_normal(self, name): - for rule in self.rules: - matchObj = re.match(rule, name, re.I) - if matchObj is not None: - new_name = f"{matchObj.group(1).strip()} E{matchObj.group(2)}{matchObj.group(3)}" - return new_name - - def rename_pn(self, name): - n = re.split(r"[\[\]]", name) - file_name = name.replace(f"[{n[1]}]", "") - for rule in self.rules: - matchObj = re.match(rule, file_name, re.I) - if matchObj is not None: - new_name = re.sub( - r"[\[\]]", - "", - f"{matchObj.group(1).strip()} E{matchObj.group(2)}{n[-1]}", - ) - return new_name - - def print_result(self, torrent_count, rename_count): - logger.info(f"Finished checking {torrent_count} file's name.") - logger.info(f"Renamed {rename_count} files.") + def print_result(self): + logger.info(f"Finished checking {self.torrent_count} file's name.") + logger.info(f"Renamed {self.rename_count} files.") logger.info(f"Finished rename process.") def run(self): - recent_info = self.client.get_torrent_info() - rename_count = 0 - torrent_count = len(recent_info) - method_dict = {"pn": self.rename_pn, "normal": self.rename_normal} + method_dict = {"pn": self._renamer.rename_pn, "normal": self._renamer.rename_normal} if settings.method not in method_dict: logger.error(f"error method") else: - for i in range(0, torrent_count): - info = recent_info[i] + for i in range(0, self.torrent_count): + info = self.recent_info[i] try: name = info.name hash = info.hash @@ -63,10 +36,14 @@ class Renamer: new_name = method_dict[settings.method](name) if path_name != new_name: self.client.rename_torrent_file(hash, path_name, new_name) - rename_count += 1 + self.rename_count += 1 except: logger.warning(f"{info.name} rename failed") if settings.remove_bad_torrent: self.client.delete_torrent(info.hash) - self.print_result(torrent_count, rename_count) + self.print_result() + +if __name__ == "__main__": + client = DownloadClient() + rename = Renamer(client) diff --git a/auto_bangumi/core/rss_collector.py b/auto_bangumi/core/rss_collector.py index 114ad8cc..64147219 100644 --- a/auto_bangumi/core/rss_collector.py +++ b/auto_bangumi/core/rss_collector.py @@ -1,4 +1,5 @@ # -*- coding: UTF-8 -*- +import os import logging import requests from bs4 import BeautifulSoup @@ -24,7 +25,7 @@ class RSSCollector: for item in items: name = item.title.string # debug 用 - if settings.get_rule_debug: + if settings.debug_mode: logger.debug(f"Raw {name}") episode = self._simple_analyser.analyse(name) if episode: @@ -34,6 +35,10 @@ class RSSCollector: if d["title"] == title: break else: + if ep.number > 1 and settings.enable_eps_complete: + download_past = True + else: + download_past = False bangumi_data["bangumi_info"].append( { "title": title, @@ -43,7 +48,7 @@ class RSSCollector: "source": source, "dpi": dpi, "added": False, - "download_past": ep.number > 1 + "download_past": download_past } ) logger.info(f"Adding {title} Season {season.number}") diff --git a/auto_bangumi/downloader/qb_downloader.py b/auto_bangumi/downloader/qb_downloader.py index fee5eb95..22795a72 100644 --- a/auto_bangumi/downloader/qb_downloader.py +++ b/auto_bangumi/downloader/qb_downloader.py @@ -24,7 +24,7 @@ class QbDownloader: break except LoginFailed: logger.warning( - f"Can't log in qBittorrent Server {host} by {username}, retry in {settings.connect_retry_interval}" + f"Can't login qBittorrent Server {host} by {username}, retry in {settings.connect_retry_interval}" ) time.sleep(settings.connect_retry_interval) @@ -36,7 +36,7 @@ class QbDownloader: def torrents_add(self, urls, save_path, category): return self._client.torrents_add( - is_paused=settings.add_pause, + is_paused=settings.dev_debug, urls=urls, save_path=save_path, category=category, diff --git a/auto_bangumi/log.py b/auto_bangumi/log.py index 1bdab91c..1641d34a 100644 --- a/auto_bangumi/log.py +++ b/auto_bangumi/log.py @@ -3,10 +3,7 @@ from conf import settings def setup_logger(): - if settings.debug_mode: - level = logging.DEBUG - else: - level = logging.INFO + level = logging.DEBUG if settings.debug_mode else logging.INFO DATE_FORMAT = "%Y-%m-%d %X" LOGGING_FORMAT = "%(asctime)s %(levelname)s: %(message)s" logging.basicConfig( diff --git a/docs/docker-compose/All-in-one/docker-compose.yml b/docs/docker-compose/All-in-one/docker-compose.yml index d56b3f75..0efb97e2 100644 --- a/docs/docker-compose/All-in-one/docker-compose.yml +++ b/docs/docker-compose/All-in-one/docker-compose.yml @@ -34,7 +34,6 @@ services: - AB_NOT_CONTAIN=720 - AB_DOWNLOAD_PATH=/downloads/Bangumi - AB_RSS=${RSS} - - AB_RULE_DEBUG=False - AB_DEBUG_MODE=False - AB_EP_COMPLETE=False - AB_SEASON_ONE=True @@ -58,7 +57,9 @@ services: - PGID=${GID} - VERSION=docker networks: - - host + - auto_bangumi + ports: + - 32400:32400 volumes: - plex_config:/config - ${DOWNLOAD_PATH}/Bangumi:/tv diff --git a/docs/docker-compose/AutoBangumi/docker-compose.yml b/docs/docker-compose/AutoBangumi/docker-compose.yml index f5b8ea63..086cc2f1 100644 --- a/docs/docker-compose/AutoBangumi/docker-compose.yml +++ b/docs/docker-compose/AutoBangumi/docker-compose.yml @@ -13,7 +13,6 @@ services: - AB_NOT_CONTAIN=720 - AB_DOWNLOAD_PATH=${DOWNLOAD_PATH} - AB_RSS=${RSS} - - AB_RULE_DEBUG=False - AB_DEBUG_MODE=False - AB_EP_COMPLETE=False - AB_SEASON_ONE=True diff --git a/docs/docker-compose/qBittorrent+AutoBangumi/docker-compose.yml b/docs/docker-compose/qBittorrent+AutoBangumi/docker-compose.yml index 5ab3d303..5500b5c4 100644 --- a/docs/docker-compose/qBittorrent+AutoBangumi/docker-compose.yml +++ b/docs/docker-compose/qBittorrent+AutoBangumi/docker-compose.yml @@ -34,7 +34,6 @@ services: - AB_NOT_CONTAIN=720 - AB_DOWNLOAD_PATH=/downloads/Bangumi - AB_RSS=${RSS} - - AB_RULE_DEBUG=False - AB_DEBUG_MODE=False - AB_EP_COMPLETE=False - AB_SEASON_ONE=True diff --git a/docs/部署说明.md b/docs/部署说明.md index 5efb1ecc..978a24b0 100644 --- a/docs/部署说明.md +++ b/docs/部署说明.md @@ -180,8 +180,7 @@ docker run -d \ | `AB_DOWNLOAD_PATH` | qBittorrent 中的下载路径 | 必填项 | | `AB_RSS` | RSS 订阅地址 | 必填项 | | `AB_NOT_CONTAIN` | 输入想要过滤的元素 | `720` | -| `AB_RULE_DEBUG` | RSS 解析器 debug 模式 | `False` | -| `AB_DEBUG_MODE` | | `Fasle` | +| `AB_DEBUG_MODE` | 调试模式 | `False` | | `AB_EP_COMPLETE` | 历史番剧下载 | `False` | | `AB_SEASON_ONE`| 开启后如果没有 Season 信息自动添加为 S01 | `True` | | `AB_REMOVE_BAD_BT`| 碰到无法重命名的合集等,自动删除种子 | `False` |