From fa6f2c01e0260cee7075cbfd0aae6c604f1a9c59 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 29 Aug 2023 10:48:27 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#313=20=E6=A3=80=E6=9F=A5=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=AD=98=E5=9C=A8=E6=97=B6=E6=9C=AA=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=80=BB=E9=9B=86=E6=95=B0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/download.py | 36 ++++++++++++++++++------ app/chain/rss.py | 8 ++++++ app/chain/subscribe.py | 64 +++++++++++++++++++++++++++++------------- 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/app/chain/download.py b/app/chain/download.py index 05958595..289d2259 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -490,13 +490,15 @@ class DownloadChain(ChainBase): def get_no_exists_info(self, meta: MetaBase, mediainfo: MediaInfo, - no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None + no_exists: Dict[int, Dict[int, NotExistMediaInfo]] = None, + totals: Dict[int, int] = None ) -> Tuple[bool, Dict[int, Dict[int, NotExistMediaInfo]]]: """ 检查媒体库,查询是否存在,对于剧集同时返回不存在的季集信息 :param meta: 元数据 :param mediainfo: 已识别的媒体信息 :param no_exists: 在调用该方法前已经存储的不存在的季集信息,有传入时该函数搜索的内容将会叠加后输出 + :param totals: 电视剧每季的总集数 :return: 当前媒体是否缺失,各标题总的季集和缺失的季集 """ @@ -529,6 +531,10 @@ class DownloadChain(ChainBase): if not no_exists: no_exists = {} + + if not totals: + totals = {} + if mediainfo.type == MediaType.MOVIE: # 电影 itemid = self.mediaserver.get_item_id(mtype=mediainfo.type.value, @@ -563,30 +569,42 @@ class DownloadChain(ChainBase): if meta.begin_season \ and season not in meta.season_list: continue - __append_no_exists(_season=season, _episodes=[], _total=len(episodes), _start=min(episodes)) + # 总集数 + total_ep = totals.get(season) or len(episodes) + __append_no_exists(_season=season, _episodes=[], + _total=total_ep, _start=min(episodes)) return False, no_exists else: - # 存在一些,检查缺失的季集 + # 存在一些,检查每季缺失的季集 for season, episodes in mediainfo.seasons.items(): if meta.begin_season \ and season not in meta.season_list: continue if not episodes: continue - exist_seasons = exists_tvs.seasons - if exist_seasons.get(season): - # 取差集 - lack_episodes = list(set(episodes).difference(set(exist_seasons[season]))) + # 该季总集数 + season_total = totals.get(season) or len(episodes) + # 该季已存在的集 + exist_episodes = exists_tvs.seasons.get(season) + if exist_episodes: + # 已存在取差集 + if totals.get(season): + # 按总集数计算缺失集(开始集为TMDB中的最小集) + lack_episodes = list(set(range(min(episodes), + season_total + 1)).difference(set(exist_episodes))) + else: + # 按TMDB集数计算缺失集 + lack_episodes = list(set(episodes).difference(set(exist_episodes))) if not lack_episodes: # 全部集存在 continue # 添加不存在的季集信息 __append_no_exists(_season=season, _episodes=lack_episodes, - _total=len(episodes), _start=min(episodes)) + _total=season_total, _start=min(episodes)) else: # 全季不存在 __append_no_exists(_season=season, _episodes=[], - _total=len(episodes), _start=min(episodes)) + _total=season_total, _start=min(episodes)) # 存在不完整的剧集 if no_exists: logger.debug(f"媒体库中已存在部分剧集,缺失:{no_exists}") diff --git a/app/chain/rss.py b/app/chain/rss.py index 47f5798f..f8607158 100644 --- a/app/chain/rss.py +++ b/app/chain/rss.py @@ -219,6 +219,13 @@ class RssChain(ChainBase): rss_meta.year = rss_task.year rss_meta.begin_season = rss_task.season rss_meta.type = MediaType(rss_task.type) + # 每季总集数 + totals = {} + if rss_task.season and rss_task.total_episode: + totals = { + rss_task.season: rss_task.total_episode + } + # 检查缺失 exist_flag, no_exists = self.downloadchain.get_no_exists_info( meta=rss_meta, mediainfo=MediaInfo( @@ -227,6 +234,7 @@ class RssChain(ChainBase): tmdb_id=rss_task.tmdbid, season=rss_task.season ), + totals=totals ) if exist_flag: logger.info(f'{rss_task.name} 媒体库中已存在,完成订阅') diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 317d802a..6a0e5639 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -202,8 +202,18 @@ class SubscribeChain(ChainBase): # 非洗版状态 if not subscribe.best_version: + # 每季总集数 + totals = {} + if subscribe.season and subscribe.total_episode: + totals = { + subscribe.season: subscribe.total_episode + } # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo) + exist_flag, no_exists = self.downloadchain.get_no_exists_info( + meta=meta, + mediainfo=mediainfo, + totals=totals + ) if exist_flag: logger.info(f'{mediainfo.title_year} 媒体库中已存在,完成订阅') self.subscribeoper.delete(subscribe.id) @@ -394,8 +404,18 @@ class SubscribeChain(ChainBase): continue # 非洗版 if not subscribe.best_version: + # 每季总集数 + totals = {} + if subscribe.season and subscribe.total_episode: + totals = { + subscribe.season: subscribe.total_episode + } # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo) + exist_flag, no_exists = self.downloadchain.get_no_exists_info( + meta=meta, + mediainfo=mediainfo, + totals=totals + ) if exist_flag: logger.info(f'{mediainfo.title_year} 媒体库中已存在,完成订阅') self.subscribeoper.delete(subscribe.id) @@ -677,32 +697,38 @@ class SubscribeChain(ChainBase): if no_exists \ and no_exists.get(tmdb_id) \ and (total_episode or start_episode): + # 该季原缺失信息 no_exist_season = no_exists.get(tmdb_id).get(begin_season) if no_exist_season: - # 原季集列表 + # 原集列表 episode_list = no_exist_season.episodes # 原总集数 total = no_exist_season.total_episode + # 原开始集数 + start = no_exist_season.start_episode + # 更新剧集列表、开始集数、总集数 - if not episode_list and not start_episode: - # 整季缺失且没有开始集 + if not episode_list: + # 整季缺失 episodes = [] - start_episode = 1 + start_episode = start_episode or start total_episode = total_episode or total - elif total_episode and start_episode: - # 有开始集和总集数 - episodes = list(range(start_episode, total_episode + 1)) - elif not start_episode: - # 有总集数没有开始集 - episodes = list(range(min(episode_list or [1]), total_episode + 1)) - start_episode = min(episode_list or [1]) - elif not total_episode: - # 有开始集没有总集数 - episodes = list(range(start_episode, max(episode_list or [total]) + 1)) - total_episode = no_exist_season.total_episode else: - return no_exists - # 处理集合 + # 部分缺失 + if not start_episode \ + and not total_episode: + # 无需调整 + return no_exists + if not start_episode: + # 没有自定义开始集 + start_episode = start + if not total_episode: + # 没有自定义总集数 + total_episode = total + # 新的集列表 + episodes = list(range(start_episode, total_episode + 1)) + + # 更新集合 no_exists[tmdb_id][begin_season] = NotExistMediaInfo( season=begin_season, episodes=episodes,