diff --git a/AutoBangumi/app/app.py b/AutoBangumi/app/app.py index c4f40281..13159dee 100644 --- a/AutoBangumi/app/app.py +++ b/AutoBangumi/app/app.py @@ -48,6 +48,7 @@ def run(): try: rss_collector.collect(bangumi_data) download_client.add_rules(bangumi_data["bangumi_info"]) + download_client.eps_collect(bangumi_data["bangumi_info"]) renamer.run() save_data_file(bangumi_data) time.sleep(settings.sleep_time) @@ -56,5 +57,6 @@ def run(): raise e logger.exception(e) + if __name__ == "__main__": run() \ No newline at end of file diff --git a/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py b/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py index 74dbb9f9..39bd1c0c 100644 --- a/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py +++ b/AutoBangumi/app/bangumi_parser/analyser/rss_parser.py @@ -1,13 +1,24 @@ import logging import re from bangumi_parser.episode import Episode +from utils import json_config +from conf import settings logger = logging.getLogger(__name__) class ParserLV2: def __init__(self) -> None: - self.name = None + self.info = json_config.load(settings.rule_path) + self.type = None + + def get_group(self, name): + for i in self.info: + for group in i["group_name"]: + if re.search(group, name) is not None: + self.type = i["type"] + return group + logger.warning(f"no Group match {name}") def pre_process(self, raw_name): if re.search(r"新番|月?番", raw_name): @@ -31,21 +42,23 @@ class ParserLV2: seasons = re.findall(season_rule, name_season) if not seasons: name = name_season - season = 1 + season_number = 1 + season_raw = "" else: name = re.sub(season_rule, "", name_season) for season in seasons: + season_raw = season if re.search(r"S|Season", season) is not None: - season = int(re.sub(r"S|Season", "", season)) + season_number = int(re.sub(r"S|Season", "", season)) break elif re.search(r"[第 ].*[季期]", season) is not None: season_pro = re.sub(r"[第季期 ]", "", season) try: - season = int(season_pro) + season_number = int(season_pro) except ValueError: - season = season_map[season_pro] + season_number = season_map[season_pro] break - return name, season + return name, season_number, season_raw def name_process(self, name): split = re.split("/| |- ", name.replace("(仅限港澳台地区)", "")) @@ -70,20 +83,24 @@ class ParserLV2: raw_name = raw_name.replace("【", "[").replace("】", "]") match_obj = re.match(r"(.*|\[.*])( -? \d{1,3} |\[\d{1,3}]|\[\d{1,3}.?[vV]\d{1}]|[第第]\d{1,3}[话話集集]|\[\d{1,3}.?END])(.*)", raw_name) name_season = self.pre_process(match_obj.group(1)) - name, season = self.season_process(name_season) + name, season_number, season_raw = self.season_process(name_season) name = self.name_process(name).strip() episode = int(re.findall(r"\d{1,3}", match_obj.group(2))[0]) other = match_obj.group(3).strip() language = None - return name, season, episode + return name, season_number, season_raw, episode - def run(self, raw) -> Episode: + def analyse(self, raw) -> Episode: try: - name, season, episode = self.process(raw) info = Episode() + info.group = self.get_group(raw) + name, season, season_raw, episode = self.process(raw) info.title = name info.season_info.number = season - info.EpisodeInfo.number = episode + info.season_info.raw = season_raw + info.ep_info.number = episode + + return info except: logger.warning(f"ERROR match {raw}") @@ -93,6 +110,7 @@ if __name__ == "__main__": sys.path.append(os.path.dirname("..")) from const import BCOLORS + from bangumi_parser.episode import Episode parser = ParserLV2() with (open("bangumi_parser/names.txt", "r", encoding="utf-8") as f): @@ -101,7 +119,7 @@ if __name__ == "__main__": if name != "": try: print(name) - title, season, episode = parser.process(name) + title, season, episode = parser.analyse(name) print(title) print(season) print(episode) diff --git a/AutoBangumi/app/bangumi_parser/episode.py b/AutoBangumi/app/bangumi_parser/episode.py index d56e2ed6..f0f45e78 100644 --- a/AutoBangumi/app/bangumi_parser/episode.py +++ b/AutoBangumi/app/bangumi_parser/episode.py @@ -33,6 +33,6 @@ class Episode: self.group: str = None self.title_info = Episode.TitleInfo() self.season_info = Episode.SeasonInfo() - self.number_info = Episode.EpisodeInfo() + self.ep_info = Episode.EpisodeInfo() self.format: str = None self.subtitle: str = None diff --git a/AutoBangumi/app/const_dev.py b/AutoBangumi/app/const_dev.py index be374ae5..e119b47f 100644 --- a/AutoBangumi/app/const_dev.py +++ b/AutoBangumi/app/const_dev.py @@ -2,7 +2,7 @@ DEV_SETTINGS = { "host_ip": "192.168.31.10:10101", "user_name": "admin", "password": "adminadmin", - "rss_link": "https://mikanani.me/RSS/classic", + "rss_link": "https://mikanani.me/RSS/MyBangumi?token=Td8ceWZZv3s2OZm5ji9RoMer8vk5VS3xzC1Hmg8A26E%3d", "sleep_time": 10, "info_path": "../config/bangumi.json", "rule_path": "../config/rule.json", diff --git a/AutoBangumi/app/core/download_client.py b/AutoBangumi/app/core/download_client.py index 3baaa4b7..690a332b 100644 --- a/AutoBangumi/app/core/download_client.py +++ b/AutoBangumi/app/core/download_client.py @@ -8,6 +8,9 @@ from downloader.exceptions import ConflictError from conf import settings from utils import json_config +from core.eps_complete import FullSeasonGet + + logger = logging.getLogger(__name__) @@ -33,7 +36,7 @@ class DownloadClient: os.path.join( settings.download_path, re.sub(settings.rule_name_re, " ", bangumi_name).strip(), - season, + f"S0{season}", ) ), } @@ -64,6 +67,13 @@ class DownloadClient: info["added"] = True logger.debug("Finished.") + def eps_collect(self, bangumi_info): + logger.debug("Start collect past eps.") + for info in bangumi_info: + if not info["download_past"]: + FullSeasonGet(info["group"], info["title"], info["season"]).run() + + def get_torrent_info(self): return self.client.torrents_info( status_filter="completed", category="Bangumi" diff --git a/AutoBangumi/app/core/eps_complete.py b/AutoBangumi/app/core/eps_complete.py index 9f70d158..57b22930 100644 --- a/AutoBangumi/app/core/eps_complete.py +++ b/AutoBangumi/app/core/eps_complete.py @@ -25,7 +25,7 @@ class FullSeasonGet: else: season = self.season season = requests.get( - f"https://mikanani.me/RSS/Search?searchstr={self.group}+{self.bangumi_name}+{season}" + f"https://mikanani.me/RSS/Search?searchstr={self.group}+{self.bangumi_name}+{season}+1080" ) soup = BeautifulSoup(season.content, "xml") self.torrents = soup.find_all("enclosure") diff --git a/AutoBangumi/app/core/rss_collector.py b/AutoBangumi/app/core/rss_collector.py index c1765f67..214518b8 100644 --- a/AutoBangumi/app/core/rss_collector.py +++ b/AutoBangumi/app/core/rss_collector.py @@ -5,14 +5,14 @@ import requests from bs4 import BeautifulSoup from conf import settings -from bangumi_parser.analyser.simple_analyser import SimpleAnalyser +from bangumi_parser.analyser.rss_parser import ParserLV2 logger = logging.getLogger(__name__) class RSSCollector: def __init__(self): - self._simple_analyser = SimpleAnalyser() + self._simple_analyser = ParserLV2() def collect(self, bangumi_data): try: @@ -27,19 +27,24 @@ class RSSCollector: # debug 用 if settings.get_rule_debug: logger.debug(f"Raw {name}") - episoda = self._simple_analyser.analyse(name) - if episoda: - title, group, season = episoda.title, episoda.group, episoda.season_info.raw + episode = self._simple_analyser.analyse(name) + if episode: + group, title, season, ep = episode.group, episode.title, episode.season_info, episode.ep_info for d in bangumi_data["bangumi_info"]: if d["title"] == title: break else: + if ep.number > 1 and settings.eps_complete: + download_past = True + else: + download_past = False bangumi_data["bangumi_info"].append( { "title": title, - "season": season, + "season": season.raw, "group": group, "added": False, + "download_past": download_past } ) - logger.debug(f"add {title} {season}") + logger.debug(f"add {title} Season {season.raw}") diff --git a/AutoBangumi/config/rule.json b/AutoBangumi/config/rule.json index b612d558..c0f07750 100644 --- a/AutoBangumi/config/rule.json +++ b/AutoBangumi/config/rule.json @@ -30,12 +30,7 @@ "爱恋&漫猫字幕组", "MingY", "VCB-Studio", - "虹咲学园烤肉同好会" - ], - "name_position": 1 - }, - { - "group_name": [ + "虹咲学园烤肉同好会", "喵萌奶茶屋", "爱恋字母社", "诸神字幕组", @@ -46,14 +41,21 @@ "SweetSub&圆环记录攻略组", "动漫萌", "极影字幕社", - "喵萌Production" + "喵萌Production", + "ANi", + "爱恋字母社", + "熔岩字幕", + "熔岩动画", + "c.c动漫", + "霜庭云花Sub" ], - "name_position": 2 + "type": 1 }, { "group_name": [ - "爱恋字母社" + "澄空学园&华盟字幕社", + "PoInSu" ], - "name_position": 3 + "type": 2 } ] \ No newline at end of file