mirror of
https://github.com/EstrellaXD/Auto_Bangumi.git
synced 2026-04-27 03:51:03 +08:00
自动下载功能完成
This commit is contained in:
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user