From 7e6ef04554a4cff36a70678f32ad53073ca69215 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 5 Nov 2024 18:21:08 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BC=98=E5=8C=96=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=9B=BE=E7=89=87=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=80=A7=E8=83=BD=20#2993?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/login.py | 2 +- app/chain/mediaserver.py | 10 ++++++---- app/modules/emby/__init__.py | 18 +++++++++--------- app/modules/emby/emby.py | 24 ++++++++++++++---------- app/modules/jellyfin/__init__.py | 17 ++++++++++------- app/modules/jellyfin/jellyfin.py | 20 ++++++++++++-------- app/modules/plex/__init__.py | 1 + app/schemas/mediaserver.py | 1 + 8 files changed, 54 insertions(+), 39 deletions(-) diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py index 00559e1b..262a84ff 100644 --- a/app/api/endpoints/login.py +++ b/app/api/endpoints/login.py @@ -59,7 +59,7 @@ def wallpaper() -> Any: elif settings.WALLPAPER == "mediaserver": url = MediaServerChain().get_latest_wallpaper() else: - url = TmdbChain().get_random_wallpager() + url = TmdbChain().get_random_wallpager() if url: return schemas.Response( success=True, diff --git a/app/chain/mediaserver.py b/app/chain/mediaserver.py index fd6ca05b..68e2c776 100644 --- a/app/chain/mediaserver.py +++ b/app/chain/mediaserver.py @@ -95,17 +95,19 @@ class MediaServerChain(ChainBase): return self.run_module("mediaserver_latest", count=count, server=server, username=username) @cached(cache=TTLCache(maxsize=1, ttl=3600)) - def get_latest_wallpapers(self, server: str = None, count=20) -> List[str]: + def get_latest_wallpapers(self, server: str = None, count: int = 10, + remote: bool = False, username: str = None) -> List[str]: """ 获取最新最新入库条目海报作为壁纸,缓存1小时 """ - return self.run_module("mediaserver_latest_images", server=server, count=count) + return self.run_module("mediaserver_latest_images", server=server, count=count, + remote=remote, username=username) - def get_latest_wallpaper(self, server: str = None) -> Optional[str]: + def get_latest_wallpaper(self, server: str = None, remote: bool = False, username: str = None) -> Optional[str]: """ 获取最新最新入库条目海报作为壁纸,缓存1小时 """ - wallpapers = self.get_latest_wallpapers(server=server, count=20) + wallpapers = self.get_latest_wallpapers(server=server, count=1, remote=remote, username=username) return wallpapers[0] if wallpapers else None def get_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]: diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index accd03f9..d417de92 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -283,9 +283,9 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]): def mediaserver_latest_images(self, server: str = None, - count: int = 20, + count: int = 10, username: str = None, - host_type: bool = True, + remote: bool = False ) -> List[str]: """ 获取媒体服务器最新入库条目的图片 @@ -293,7 +293,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]): :param server: 媒体服务器名称 :param count: 获取数量 :param username: 用户名 - :param host_type: True为外网链接, False为内网链接 + :param remote: True为外网链接, False为内网链接 :return: 图片链接列表 """ server_obj: Emby = self.get_instance(server) @@ -304,10 +304,10 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]): items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(server=server, count=count, username=username) for item in items: - if host_type and item.id: - _link = server_obj.generate_external_image_link(item_id=item.id, image_type="Backdrop") - if _link: - links.append(_link) - elif item.image: - links.append(item.image) + if item.BackdropImageTags: + image_url = server_obj.get_backdrop_url(item_id=item.id, + image_tag=item.BackdropImageTags[0], + remote=remote) + if image_url: + links.append(image_url) return links diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 4259c22b..7662be57 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -1077,20 +1077,23 @@ class Emby: return f"{self._playhost or self._host}web/index.html#!" \ f"/item?id={item_id}&context=home&serverId={self.serverid}" - def __get_backdrop_url(self, item_id: str, image_tag: str) -> str: + def get_backdrop_url(self, item_id: str, image_tag: str, remote: bool = False) -> str: """ 获取Emby的Backdrop图片地址 :param: item_id: 在Emby中的ID :param: image_tag: 图片的tag :param: remote 是否远程使用,TG微信等客户端调用应为True - :param: inner 是否NT内部调用,为True是会使用NT中转 """ if not self._host or not self._apikey: return "" if not image_tag or not item_id: return "" - return f"{self._host}Items/{item_id}/" \ - f"Images/Backdrop?tag={image_tag}&fillWidth=666&api_key={self._apikey}" + if remote: + host_url = self._playhost or self._host + else: + host_url = self._host + return f"{host_url}Items/{item_id}/" \ + f"Images/Backdrop?tag={image_tag}&api_key={self._apikey}" def __get_local_image_by_id(self, item_id: str) -> str: """ @@ -1146,13 +1149,13 @@ class Emby: subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}' if item_type == MediaType.MOVIE.value: if item.get("BackdropImageTags"): - image = self.__get_backdrop_url(item_id=item.get("Id"), - image_tag=item.get("BackdropImageTags")[0]) + image = self.get_backdrop_url(item_id=item.get("Id"), + image_tag=item.get("BackdropImageTags")[0]) else: image = self.__get_local_image_by_id(item.get("Id")) else: - image = self.__get_backdrop_url(item_id=item.get("SeriesId"), - image_tag=item.get("SeriesPrimaryImageTag")) + image = self.get_backdrop_url(item_id=item.get("SeriesId"), + image_tag=item.get("SeriesPrimaryImageTag")) if not image: image = self.__get_local_image_by_id(item.get("SeriesId")) ret_resume.append(schemas.MediaServerPlayItem( @@ -1185,7 +1188,7 @@ class Emby: params = { "Limit": 100, "MediaTypes": "Video", - "Fields": "ProductionYear,Path", + "Fields": "ProductionYear,Path,BackdropImageTags", "api_key": self._apikey } try: @@ -1213,7 +1216,8 @@ class Emby: subtitle=item.get("ProductionYear"), type=item_type, image=image, - link=link + link=link, + BackdropImageTags=item.get("BackdropImageTags") )) return ret_latest else: diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 1fb339cc..15c03c7c 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -269,8 +269,8 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): return None return server_obj.get_play_url(item_id) - def mediaserver_latest(self, server: str = None, - count: int = 20, username: str = None) -> List[schemas.MediaServerPlayItem]: + def mediaserver_latest(self, server: str = None, count: int = 20, + username: str = None) -> List[schemas.MediaServerPlayItem]: """ 获取媒体服务器最新入库条目 """ @@ -283,7 +283,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): server: str = None, count: int = 20, username: str = None, - host_type: bool = True, + remote: bool = False, ) -> List[str]: """ 获取媒体服务器最新入库条目的图片 @@ -291,7 +291,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): :param server: 媒体服务器名称 :param count: 获取数量 :param username: 用户名 - :param host_type: True为外网链接, False为内网链接 + :param remote: True为外网链接, False为内网链接 :return: 图片链接列表 """ server_obj: Jellyfin = self.get_instance(server) @@ -302,7 +302,10 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(server=server, count=count, username=username) for item in items: - link = server_obj.generate_image_link(item_id=item.id, image_type="Backdrop", host_type=host_type) - if link: - links.append(link) + if item.BackdropImageTags: + image_url = server_obj.get_backdrop_url(item_id=item.id, + image_tag=item.BackdropImageTags[0], + remote=remote) + if image_url: + links.append(image_url) return links diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index 04320a92..e84d4ac4 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -823,20 +823,23 @@ class Jellyfin: return "" return "%sItems/%s/Images/Primary" % (self._host, item_id) - def __get_backdrop_url(self, item_id: str, image_tag: str) -> str: + def get_backdrop_url(self, item_id: str, image_tag: str, remote: bool = False) -> str: """ 获取Backdrop图片地址 :param: item_id: 在Jellyfin中的ID :param: image_tag: 图片的tag :param: remote 是否远程使用,TG微信等客户端调用应为True - :param: inner 是否NT内部调用,为True是会使用NT中转 """ if not self._host or not self._apikey: return "" if not image_tag or not item_id: return "" - return f"{self._host}Items/{item_id}/" \ - f"Images/Backdrop?tag={image_tag}&fillWidth=666&api_key={self._apikey}" + if remote: + host_url = self._playhost or self._host + else: + host_url = self._host + return f"{host_url}Items/{item_id}/" \ + f"Images/Backdrop?tag={image_tag}&api_key={self._apikey}" def get_resume(self, num: int = 12, username: str = None) -> Optional[List[schemas.MediaServerPlayItem]]: """ @@ -875,8 +878,8 @@ class Jellyfin: item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value link = self.get_play_url(item.get("Id")) if item.get("BackdropImageTags"): - image = self.__get_backdrop_url(item_id=item.get("Id"), - image_tag=item.get("BackdropImageTags")[0]) + image = self.get_backdrop_url(item_id=item.get("Id"), + image_tag=item.get("BackdropImageTags")[0]) else: image = self.__get_local_image_by_id(item.get("Id")) # 小部分剧集无[xxx-S01E01-thumb.jpg]图片 @@ -919,7 +922,7 @@ class Jellyfin: params = { "Limit": 100, "MediaTypes": "Video", - "Fields": "ProductionYear,Path", + "Fields": "ProductionYear,Path,BackdropImageTags", "api_key": self._apikey, } try: @@ -947,7 +950,8 @@ class Jellyfin: subtitle=item.get("ProductionYear"), type=item_type, image=image, - link=link + link=link, + BackdropImageTags=item.get("BackdropImageTags") )) return ret_latest else: diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index bbe44f41..0dfbbcac 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -279,6 +279,7 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]): server: str = None, count: int = 20, username: str = None, + **kwargs ) -> List[str]: """ 获取媒体服务器最新入库条目的图片 diff --git a/app/schemas/mediaserver.py b/app/schemas/mediaserver.py index 272e55c4..bb5b8113 100644 --- a/app/schemas/mediaserver.py +++ b/app/schemas/mediaserver.py @@ -173,3 +173,4 @@ class MediaServerPlayItem(BaseModel): image: Optional[str] = None link: Optional[str] = None percent: Optional[float] = None + BackdropImageTags: Optional[list] = []