diff --git a/app/chain/douban_sync.py b/app/chain/douban_sync.py index b0d80ced..73c33255 100644 --- a/app/chain/douban_sync.py +++ b/app/chain/douban_sync.py @@ -74,7 +74,7 @@ class DoubanSyncChain(ChainBase): # 加入缓存 caches.append(douban_id) # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(mediainfo=mediainfo) + exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo) if exist_flag: logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在') continue diff --git a/app/chain/download.py b/app/chain/download.py index 83236a1f..78162dad 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -322,9 +322,11 @@ class DownloadChain(ChainBase): # 返回下载的资源,剩下没下完的 return downloaded_list, need_tvs - def get_no_exists_info(self, mediainfo: MediaInfo, no_exists: dict = None) -> Tuple[bool, dict]: + def get_no_exists_info(self, meta: MetaBase, + mediainfo: MediaInfo, no_exists: dict = None) -> Tuple[bool, dict]: """ 检查媒体库,查询是否存在,对于剧集同时返回不存在的季集信息 + :param meta: 元数据 :param mediainfo: 已识别的媒体信息 :param no_exists: 在调用该方法前已经存储的不存在的季集信息,有传入时该函数搜索的内容将会叠加后输出 :return: 当前媒体是否缺失,各标题总的季集和缺失的季集 @@ -333,6 +335,12 @@ class DownloadChain(ChainBase): def __append_no_exists(_season: int, _episodes: list, _total: int, _start: int): """ 添加不存在的季集信息 + {tmdbid: [ + "season": int, + "episodes": list, + "total_episodes": int, + "start_episode": int + ]} """ if not no_exists.get(mediainfo.tmdb_id): no_exists[mediainfo.tmdb_id] = [ @@ -378,11 +386,17 @@ class DownloadChain(ChainBase): # 所有剧集均缺失 for season, episodes in mediainfo.seasons.items(): # 全季不存在 + if meta.get_season_list() \ + and season not in meta.get_season_list(): + continue __append_no_exists(_season=season, _episodes=[], _total=len(episodes), _start=min(episodes)) return False, no_exists else: # 存在一些,检查缺失的季集 for season, episodes in mediainfo.seasons.items(): + if meta.get_season_list() \ + and season not in meta.get_season_list(): + continue exist_seasons = exists_tvs.get("seasons") if exist_seasons.get(season): # 取差集 diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index dd317af8..ba692107 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -89,7 +89,7 @@ class SubscribeChain(ChainBase): image=mediainfo.get_message_image(), userid=userid) else: - logger.error(f'{mediainfo.get_title_string()} 添加订阅成功') + logger.error(f'{mediainfo.get_title_string()}{metainfo.get_season_string()} 添加订阅成功') # 广而告之 self.post_message(title=f"{mediainfo.get_title_string()}{metainfo.get_season_string()} 已添加订阅", text=f"来自用户:{username or userid}", @@ -125,7 +125,7 @@ class SubscribeChain(ChainBase): logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}') continue # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(mediainfo=mediainfo) + exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo) if exist_flag: logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅') self.subscribes.delete(subscribe.id) @@ -133,6 +133,15 @@ class SubscribeChain(ChainBase): self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅', image=mediainfo.get_message_image()) continue + # 使用订阅的总集数和开始集数替换no_exists + no_exists = self.__get_subscribe_no_exits( + no_exists=no_exists, + tmdb_id=mediainfo.tmdb_id, + begin_season=meta.begin_season, + total_episode=subscribe.total_episode, + start_episode=subscribe.start_episode, + + ) # 搜索 contexts = self.searchchain.process(meta=meta, mediainfo=mediainfo, @@ -212,7 +221,7 @@ class SubscribeChain(ChainBase): logger.warn(f'未识别到媒体信息,标题:{subscribe.name},tmdbid:{subscribe.tmdbid}') continue # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(mediainfo=mediainfo) + exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=meta, mediainfo=mediainfo) if exist_flag: logger.info(f'{mediainfo.get_title_string()} 媒体库中已存在,完成订阅') self.subscribes.delete(subscribe.id) @@ -220,6 +229,15 @@ class SubscribeChain(ChainBase): self.post_message(title=f'{mediainfo.get_title_string()}{meta.get_season_string()} 已完成订阅', image=mediainfo.get_message_image()) continue + # 使用订阅的总集数和开始集数替换no_exists + no_exists = self.__get_subscribe_no_exits( + no_exists=no_exists, + tmdb_id=mediainfo.tmdb_id, + begin_season=meta.begin_season, + total_episode=subscribe.total_episode, + start_episode=subscribe.start_episode, + + ) # 遍历缓存种子 _match_context = [] for domain, contexts in self._torrents_cache.items(): @@ -253,3 +271,59 @@ class SubscribeChain(ChainBase): self.subscribes.update(subscribe.id, { "lack_episode": len(left_episodes) }) + + @staticmethod + def __get_subscribe_no_exits(no_exists: Dict[int, List[dict]], + tmdb_id: int, + begin_season: int, + total_episode: int, + start_episode: int): + """ + 根据订阅开始集数和总结数,结合TMDB信息计算当前订阅的缺失集数 + :param no_exists: 缺失季集列表 + :param tmdb_id: TMDB ID + :param begin_season: 开始季 + :param total_episode: 总集数 + :param start_episode: 开始集数 + """ + # 使用订阅的总集数和开始集数替换no_exists + if no_exists \ + and no_exists.get(tmdb_id) \ + and (total_episode or start_episode): + # 原缺失集列表 + episode_list = no_exists.get(tmdb_id)[0].get("episodes") + if total_episode and start_episode: + # 有开始集和总集数 + episodes = list(range(start_episode, total_episode + 1)) + no_exists[tmdb_id] = [ + { + "season": begin_season, + "episodes": episodes, + "total_episodes": total_episode, + "start_episode": start_episode + } + ] + elif not start_episode: + # 有总集数没有开始集 + episodes = list(range(min(episode_list), total_episode + 1)) + no_exists[tmdb_id] = [ + { + "season": begin_season, + "episodes": episodes, + "total_episodes": total_episode, + "start_episode": min(episode_list) + } + ] + else: + # 有开始集没有总集数 + episodes = list(range(start_episode, max(episode_list) + 1)) + no_exists[tmdb_id] = [ + { + "season": begin_season, + "episodes": episodes, + "total_episodes": max(episode_list), + "start_episode": start_episode + } + ] + + return no_exists diff --git a/app/chain/user_message.py b/app/chain/user_message.py index 264d65ba..f58b828c 100644 --- a/app/chain/user_message.py +++ b/app/chain/user_message.py @@ -21,7 +21,7 @@ class UserMessageChain(ChainBase): # 当前页面 _current_page: int = 0 # 当前元数据 - _current_meta: Optional[MetaInfo] = None + _current_meta: Optional[MetaBase] = None # 当前媒体信息 _current_media: Optional[MediaInfo] = None @@ -82,9 +82,11 @@ class UserMessageChain(ChainBase): mediainfo: MediaInfo = cache_list[int(text) + self._current_page * self._page_size - 1] self._current_media = mediainfo # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(mediainfo=self._current_media) + exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=self._current_meta, + mediainfo=self._current_media) if exist_flag: - self.post_message(title=f"{self._current_media.get_title_string()} 媒体库中已存在", + self.post_message(title=f"{self._current_media.get_title_string()}" + f"{self._current_meta.get_season_string()} 媒体库中已存在", userid=userid) return # 发送缺失的媒体信息 @@ -134,9 +136,11 @@ class UserMessageChain(ChainBase): if int(text) == 0: # 自动选择下载 # 查询缺失的媒体信息 - exist_flag, no_exists = self.downloadchain.get_no_exists_info(mediainfo=self._current_media) + exist_flag, no_exists = self.downloadchain.get_no_exists_info(meta=self._current_meta, + mediainfo=self._current_media) if exist_flag: - self.post_message(title=f"{self._current_media.get_title_string()} 媒体库中已存在", + self.post_message(title=f"{self._current_media.get_title_string()}" + f"{self._current_meta.get_season_string()} 媒体库中已存在", userid=userid) return # 批量下载 diff --git a/app/modules/slack/slack.py b/app/modules/slack/slack.py index c56451d0..b47ed183 100644 --- a/app/modules/slack/slack.py +++ b/app/modules/slack/slack.py @@ -106,7 +106,7 @@ class Slack: "type": "section", "text": { "type": "mrkdwn", - "text": f"*{title}*\n{text}" + "text": f"*{title}*\n{text or ''}" } } # 消息图片 diff --git a/tests/test_recognize.py b/tests/test_recognize.py index 4bd6f0ed..840774d1 100644 --- a/tests/test_recognize.py +++ b/tests/test_recognize.py @@ -4,6 +4,7 @@ from unittest import TestCase from app.chain.download import DownloadChain from app.chain.identify import IdentifyChain +from app.core.metainfo import MetaInfo class RecognizeTest(TestCase): @@ -16,5 +17,5 @@ class RecognizeTest(TestCase): def test_recognize(self): result = IdentifyChain().process(title="我和我的祖国 2019") self.assertEqual(result.media_info.tmdb_id, 612845) - exists = DownloadChain().get_no_exists_info(result.media_info) + exists = DownloadChain().get_no_exists_info(MetaInfo("我和我的祖国 2019"), result.media_info) self.assertTrue(exists[0])