diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index 47611d9b9..e5311d9ba 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -808,7 +808,10 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): continue if meta.name not in item_obj.get("target", {}).get("title"): continue - ret_medias.append(MediaInfo(douban_info=item_obj.get("target"))) + target = item_obj.get("target") + if not isinstance(target, dict): + continue + ret_medias.append(MediaInfo(douban_info=target)) # 将搜索词中的季写入标题中 if ret_medias and meta.begin_season is not None: # 小写数据转大写 @@ -1732,7 +1735,9 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): return persons @staticmethod - def _process_imdbid_result(result: dict, imdbid: str) -> Optional[dict]: + def _process_imdbid_result( + result: Optional[dict[str, Any]], imdbid: str, + ) -> Optional[dict[str, Any]]: """ 处理IMDBID查询结果 :param result: IMDBID查询返回的结果 @@ -1743,7 +1748,10 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): doubanid = result.get("id") if doubanid: if not str(doubanid).isdigit(): - doubanid = re.search(r"\d+", doubanid).group(0) + match = re.search(r"\d+", str(doubanid)) + if not match: + return None + doubanid = match.group(0) result["id"] = doubanid logger.info(f"{imdbid} 查询到豆瓣信息:{result.get('title')}") return result @@ -1751,8 +1759,11 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): return None @staticmethod - def _process_search_results(result: dict, name: str, mtype: MediaType = None, - year: str = None, season: int = None) -> dict: + def _process_search_results( + result: Optional[dict[str, Any]], name: str, + mtype: Optional[MediaType] = None, year: Optional[str] = None, + season: Optional[int] = None, + ) -> dict[str, Any]: """ 处理搜索结果并进行匹配 :param result: 搜索返回的结果 @@ -1776,7 +1787,7 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): logger.warn(f"未找到 {name} 的豆瓣信息") return {} - for item_obj in result.get("items"): + for item_obj in result.get("items") or []: type_name = item_obj.get("type_name") if type_name not in [MediaType.TV.value, MediaType.MOVIE.value]: continue @@ -1907,7 +1918,9 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): return None @staticmethod - def _process_douban_images(mediainfo: MediaInfo, info: dict) -> MediaInfo: + def _process_douban_images( + mediainfo: MediaInfo, info: Optional[dict[str, Any]], + ) -> MediaInfo: """ 处理豆瓣图片数据 :param mediainfo: 媒体信息 @@ -1995,7 +2008,8 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): """ recommend = self.doubanapi.movie_recommendations(subject_id=doubanid) if recommend: - return [MediaInfo(douban_info=info) for info in recommend] + items = recommend.get("items") or [] + return [MediaInfo(douban_info=info) for info in items if isinstance(info, dict)] return [] def douban_tv_recommend(self, doubanid: str) -> List[MediaInfo]: @@ -2005,7 +2019,8 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): """ recommend = self.doubanapi.tv_recommendations(subject_id=doubanid) if recommend: - return [MediaInfo(douban_info=info) for info in recommend] + items = recommend.get("items") or [] + return [MediaInfo(douban_info=info) for info in items if isinstance(info, dict)] return [] @staticmethod @@ -2166,19 +2181,21 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): if not personinfo: return [] collection_id = None - for module in personinfo.get("modules"): + for module in personinfo.get("modules") or []: if module.get("type") == "work_collections": collection_id = module.get("payload", {}).get("id") # 查询作品集内容 if collection_id: collections = self.doubanapi.person_work(subject_id=collection_id, start=(page - 1) * 20, count=20) if collections: - works = collections.get("works") + works = collections.get("works") or [] return [MediaInfo(douban_info=work.get("subject")) for work in works] return [] @staticmethod - def _process_celebrity_data(result: dict) -> List[_SchemaMediaPerson]: + def _process_celebrity_data( + result: Optional[dict[str, Any]], + ) -> List[_SchemaMediaPerson]: """ 处理演职员表数据的公共方法 :param result: API返回的演职员表数据 @@ -2217,7 +2234,8 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): """ recommend = await self.doubanapi.async_movie_recommendations(subject_id=doubanid) if recommend: - return [MediaInfo(douban_info=info) for info in recommend] + items = recommend.get("items") or [] + return [MediaInfo(douban_info=info) for info in items if isinstance(info, dict)] return [] async def async_douban_tv_recommend(self, doubanid: str) -> List[MediaInfo]: @@ -2227,7 +2245,8 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): """ recommend = await self.doubanapi.async_tv_recommendations(subject_id=doubanid) if recommend: - return [MediaInfo(douban_info=info) for info in recommend] + items = recommend.get("items") or [] + return [MediaInfo(douban_info=info) for info in items if isinstance(info, dict)] return [] async def async_douban_movie_interests(self, doubanid: str, start: int = 0, @@ -2308,7 +2327,7 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): if not personinfo: return [] collection_id = None - for module in personinfo.get("modules"): + for module in personinfo.get("modules") or []: if module.get("type") == "work_collections": collection_id = module.get("payload", {}).get("id") # 查询作品集内容 @@ -2316,6 +2335,6 @@ class DoubanModule(MediaAuxiliaryProviderMixin, _ModuleBase): collections = await self.doubanapi.async_person_work(subject_id=collection_id, start=(page - 1) * 20, count=20) if collections: - works = collections.get("works") + works = collections.get("works") or [] return [MediaInfo(douban_info=work.get("subject")) for work in works] return []