diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 7cceffb2..3b68c8e6 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -801,15 +801,27 @@ class SubscribeChain(ChainBase): for context in contexts: if global_vars.is_system_stopped: break - # 如果种子未识别,尝试识别 - if not context.media_info or (not context.media_info.tmdb_id - and not context.media_info.douban_id): + # 如果种子未识别且失败次数未超过3次,尝试识别 + if (not context.media_info or (not context.media_info.tmdb_id + and not context.media_info.douban_id)) and context.media_recognize_fail_count < 3: + logger.debug( + f'尝试重新识别种子:{context.torrent_info.title},当前失败次数:{context.media_recognize_fail_count}/3') re_mediainfo = self.recognize_media(meta=context.meta_info) if re_mediainfo: # 清理多余信息 re_mediainfo.clear() # 更新种子缓存 context.media_info = re_mediainfo + # 重置失败次数 + context.media_recognize_fail_count = 0 + logger.debug(f'种子 {context.torrent_info.title} 重新识别成功') + else: + # 识别失败,增加失败次数 + context.media_recognize_fail_count += 1 + logger.debug( + f'种子 {context.torrent_info.title} 媒体识别失败,失败次数:{context.media_recognize_fail_count}/3') + elif context.media_recognize_fail_count >= 3: + logger.debug(f'种子 {context.torrent_info.title} 已达到最大识别失败次数(3次),跳过识别') # 添加已预处理 processed_torrents[domain].append(context) diff --git a/app/chain/torrents.py b/app/chain/torrents.py index 78d8443c..f15c9f58 100644 --- a/app/chain/torrents.py +++ b/app/chain/torrents.py @@ -56,9 +56,14 @@ class TorrentsChain(ChainBase): # 读取缓存 if stype == 'spider': - return self.load_cache(self._spider_file) or {} + torrents_cache = self.load_cache(self._spider_file) or {} else: - return self.load_cache(self._rss_file) or {} + torrents_cache = self.load_cache(self._rss_file) or {} + + # 兼容性处理:为旧版本的Context对象添加失败次数字段 + self._ensure_context_compatibility(torrents_cache) + + return torrents_cache async def async_get_torrents(self, stype: Optional[str] = None) -> Dict[str, List[Context]]: """ @@ -71,9 +76,14 @@ class TorrentsChain(ChainBase): # 异步读取缓存 if stype == 'spider': - return await self.async_load_cache(self._spider_file) or {} + torrents_cache = await self.async_load_cache(self._spider_file) or {} else: - return await self.async_load_cache(self._rss_file) or {} + torrents_cache = await self.async_load_cache(self._rss_file) or {} + + # 兼容性处理:为旧版本的Context对象添加失败次数字段 + self._ensure_context_compatibility(torrents_cache) + + return torrents_cache def clear_torrents(self): """ @@ -274,6 +284,9 @@ class TorrentsChain(ChainBase): mediainfo.clear() # 上下文 context = Context(meta_info=meta, media_info=mediainfo, torrent_info=torrent) + # 如果未识别到媒体信息,设置初始失败次数为1 + if not mediainfo or (not mediainfo.tmdb_id and not mediainfo.douban_id): + context.media_recognize_fail_count = 1 # 添加到缓存 if not torrents_cache.get(domain): torrents_cache[domain] = [context] @@ -300,6 +313,21 @@ class TorrentsChain(ChainBase): return torrents_cache + @staticmethod + def _ensure_context_compatibility(torrents_cache: Dict[str, List[Context]]): + """ + 确保Context对象的兼容性,为旧版本添加缺失的字段 + """ + for domain, contexts in torrents_cache.items(): + for context in contexts: + # 如果Context对象没有media_recognize_fail_count字段,添加默认值 + if not hasattr(context, 'media_recognize_fail_count'): + context.media_recognize_fail_count = 0 + # 如果媒体信息未识别,设置初始失败次数 + if (not context.media_info or + (not context.media_info.tmdb_id and not context.media_info.douban_id)): + context.media_recognize_fail_count = 1 + def __renew_rss_url(self, domain: str, site: dict): """ 保留原配置生成新的rss地址 diff --git a/app/core/context.py b/app/core/context.py index d5b26f5e..9beaff55 100644 --- a/app/core/context.py +++ b/app/core/context.py @@ -814,6 +814,8 @@ class Context: media_info: MediaInfo = None # 种子信息 torrent_info: TorrentInfo = None + # 媒体识别失败次数 + media_recognize_fail_count: int = 0 def to_dict(self): """ @@ -822,5 +824,6 @@ class Context: return { "meta_info": self.meta_info.to_dict() if self.meta_info else None, "torrent_info": self.torrent_info.to_dict() if self.torrent_info else None, - "media_info": self.media_info.to_dict() if self.media_info else None + "media_info": self.media_info.to_dict() if self.media_info else None, + "media_recognize_fail_count": self.media_recognize_fail_count }