diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 56de48bc..bd02c189 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -1635,7 +1635,7 @@ class SubscribeChain(ChainBase): info = schemas.SubscribeEpisodeInfo() info.title = episode.name info.description = episode.overview - info.backdrop = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/w500${episode.still_path}" + info.backdrop = settings.TMDB_IMAGE_URL(episode.still_path, "w500") episodes[episode.episode_number] = info elif subscribe.type == MediaType.TV.value: # 根据开始结束集计算集信息 diff --git a/app/core/config.py b/app/core/config.py index c1e58593..0bd9c961 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -843,6 +843,18 @@ class Settings(BaseSettings, ConfigModel, LogConfigModel): rename_format = re.sub(r'/+', '/', rename_format) return rename_format.strip("/") + def TMDB_IMAGE_URL(self, file_path: str, file_size: str = "original") -> str: + """ + 获取TMDB图片网址 + + :param file_path: TMDB API返回的xxx_path + :param file_size: 图片大小,支持的值包括:'original'和'w500' + :return: 图片的完整URL + """ + return ( + f"https://{self.TMDB_IMAGE_DOMAIN}/t/p/{file_size}/{file_path.removeprefix('/')}" + ) + # 实例化配置 settings = Settings() diff --git a/app/core/context.py b/app/core/context.py index f2dd9053..dd52af63 100644 --- a/app/core/context.py +++ b/app/core/context.py @@ -479,11 +479,11 @@ class MediaInfo: self.episode_groups = info.pop("episode_groups").get("results") or [] # 海报 - if info.get('poster_path'): - self.poster_path = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{info.get('poster_path')}" + if path := info.get('poster_path'): + self.poster_path = settings.TMDB_IMAGE_URL(path) # 背景 - if info.get('backdrop_path'): - self.backdrop_path = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{info.get('backdrop_path')}" + if path := info.get('backdrop_path'): + self.backdrop_path = settings.TMDB_IMAGE_URL(path) # 导演和演员 self.directors, self.actors = __directors_actors(info) # 别名和译名 diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index de3fbcf2..5e5832d2 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -867,19 +867,19 @@ class TheMovieDbModule(_ModuleBase): backdrops = images.get("backdrops") if backdrops: backdrops = sorted(backdrops, key=lambda x: x.get("vote_average"), reverse=True) - mediainfo.backdrop_path = backdrops[0].get("file_path") + mediainfo.backdrop_path = settings.TMDB_IMAGE_URL(backdrops[0].get("file_path")) # 标志 if not mediainfo.logo_path: logos = images.get("logos") if logos: logos = sorted(logos, key=lambda x: x.get("vote_average"), reverse=True) - mediainfo.logo_path = logos[0].get("file_path") + mediainfo.logo_path = settings.TMDB_IMAGE_URL(logos[0].get("file_path")) # 海报 if not mediainfo.poster_path: posters = images.get("posters") if posters: posters = sorted(posters, key=lambda x: x.get("vote_average"), reverse=True) - mediainfo.poster_path = posters[0].get("file_path") + mediainfo.poster_path = settings.TMDB_IMAGE_URL(posters[0].get("file_path")) return mediainfo def obtain_images(self, mediainfo: MediaInfo) -> Optional[MediaInfo]: @@ -957,7 +957,7 @@ class TheMovieDbModule(_ModuleBase): image_path = seasoninfo.get(image_type.value) if image_path: - return f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/{image_prefix}{image_path}" + return settings.TMDB_IMAGE_URL(image_path, image_prefix) return None def tmdb_movie_similar(self, tmdbid: int) -> List[MediaInfo]: diff --git a/app/modules/themoviedb/scraper.py b/app/modules/themoviedb/scraper.py index 47ad30d1..ef9ccafc 100644 --- a/app/modules/themoviedb/scraper.py +++ b/app/modules/themoviedb/scraper.py @@ -85,10 +85,10 @@ class TmdbScraper: seasoninfo = self.original_tmdb(mediainfo).get_tv_season_detail(mediainfo.tmdb_id, season) if seasoninfo: episodeinfo = self.__get_episode_detail(seasoninfo, episode) - if episodeinfo and episodeinfo.get("still_path"): + if still_path := episodeinfo.get("still_path"): # TMDB集still图片 still_name = f"{episode}" - still_url = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{episodeinfo.get('still_path')}" + still_url = settings.TMDB_IMAGE_URL(still_path) images[still_name] = still_url else: # 季的图片 @@ -115,7 +115,7 @@ class TmdbScraper: if _mediainfo: for attr_name, attr_value in _mediainfo.items(): if attr_name.endswith("_path") and attr_value is not None: - image_url = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{attr_value}" + image_url = settings.TMDB_IMAGE_URL(attr_value) image_name = attr_name.replace("_path", "") + Path(image_url).suffix images[image_name] = image_url return images @@ -127,11 +127,11 @@ class TmdbScraper: """ # TMDB季poster图片 sea_seq = str(season).rjust(2, '0') - if seasoninfo.get("poster_path"): + if poster_path := seasoninfo.get("poster_path"): # 后缀 - ext = Path(seasoninfo.get('poster_path')).suffix + ext = Path(poster_path).suffix # URL - url = f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{seasoninfo.get('poster_path')}" + url = settings.TMDB_IMAGE_URL(poster_path) # S0海报格式不同 if season == 0: image_name = f"season-specials-poster{ext}" @@ -190,8 +190,8 @@ class TmdbScraper: DomUtils.add_node(doc, xactor, "type", "Actor") DomUtils.add_node(doc, xactor, "role", actor.get("character") or actor.get("role") or "") DomUtils.add_node(doc, xactor, "tmdbid", actor.get("id") or "") - DomUtils.add_node(doc, xactor, "thumb", - f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{actor.get('profile_path')}") + if profile_path := actor.get('profile_path'): + DomUtils.add_node(doc, xactor, "thumb", settings.TMDB_IMAGE_URL(profile_path)) DomUtils.add_node(doc, xactor, "profile", f"https://www.themoviedb.org/person/{actor.get('id')}") # 风格 @@ -330,8 +330,8 @@ class TmdbScraper: DomUtils.add_node(doc, xactor, "name", actor.get("name") or "") DomUtils.add_node(doc, xactor, "type", "Actor") DomUtils.add_node(doc, xactor, "tmdbid", actor.get("id") or "") - DomUtils.add_node(doc, xactor, "thumb", - f"https://{settings.TMDB_IMAGE_DOMAIN}/t/p/original{actor.get('profile_path')}") + if profile_path := actor.get('profile_path'): + DomUtils.add_node(doc, xactor, "thumb", settings.TMDB_IMAGE_URL(profile_path)) DomUtils.add_node(doc, xactor, "profile", f"https://www.themoviedb.org/person/{actor.get('id')}") return doc