fix 优化媒体服务器图片获取性能 #2993

This commit is contained in:
jxxghp
2024-11-05 18:21:08 +08:00
parent 08aa5fe50a
commit 7e6ef04554
8 changed files with 54 additions and 39 deletions
+1 -1
View File
@@ -59,7 +59,7 @@ def wallpaper() -> Any:
elif settings.WALLPAPER == "mediaserver": elif settings.WALLPAPER == "mediaserver":
url = MediaServerChain().get_latest_wallpaper() url = MediaServerChain().get_latest_wallpaper()
else: else:
url = TmdbChain().get_random_wallpager() url = TmdbChain().get_random_wallpager()
if url: if url:
return schemas.Response( return schemas.Response(
success=True, success=True,
+6 -4
View File
@@ -95,17 +95,19 @@ class MediaServerChain(ChainBase):
return self.run_module("mediaserver_latest", count=count, server=server, username=username) return self.run_module("mediaserver_latest", count=count, server=server, username=username)
@cached(cache=TTLCache(maxsize=1, ttl=3600)) @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小时 获取最新最新入库条目海报作为壁纸,缓存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小时 获取最新最新入库条目海报作为壁纸,缓存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 return wallpapers[0] if wallpapers else None
def get_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]: def get_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]:
+9 -9
View File
@@ -283,9 +283,9 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]):
def mediaserver_latest_images(self, def mediaserver_latest_images(self,
server: str = None, server: str = None,
count: int = 20, count: int = 10,
username: str = None, username: str = None,
host_type: bool = True, remote: bool = False
) -> List[str]: ) -> List[str]:
""" """
获取媒体服务器最新入库条目的图片 获取媒体服务器最新入库条目的图片
@@ -293,7 +293,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]):
:param server: 媒体服务器名称 :param server: 媒体服务器名称
:param count: 获取数量 :param count: 获取数量
:param username: 用户名 :param username: 用户名
:param host_type: True为外网链接, False为内网链接 :param remote: True为外网链接, False为内网链接
:return: 图片链接列表 :return: 图片链接列表
""" """
server_obj: Emby = self.get_instance(server) 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, items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(server=server, count=count,
username=username) username=username)
for item in items: for item in items:
if host_type and item.id: if item.BackdropImageTags:
_link = server_obj.generate_external_image_link(item_id=item.id, image_type="Backdrop") image_url = server_obj.get_backdrop_url(item_id=item.id,
if _link: image_tag=item.BackdropImageTags[0],
links.append(_link) remote=remote)
elif item.image: if image_url:
links.append(item.image) links.append(image_url)
return links return links
+14 -10
View File
@@ -1077,20 +1077,23 @@ class Emby:
return f"{self._playhost or self._host}web/index.html#!" \ return f"{self._playhost or self._host}web/index.html#!" \
f"/item?id={item_id}&context=home&serverId={self.serverid}" 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图片地址 获取Emby的Backdrop图片地址
:param: item_id: 在Emby中的ID :param: item_id: 在Emby中的ID
:param: image_tag: 图片的tag :param: image_tag: 图片的tag
:param: remote 是否远程使用,TG微信等客户端调用应为True :param: remote 是否远程使用,TG微信等客户端调用应为True
:param: inner 是否NT内部调用,为True是会使用NT中转
""" """
if not self._host or not self._apikey: if not self._host or not self._apikey:
return "" return ""
if not image_tag or not item_id: if not image_tag or not item_id:
return "" return ""
return f"{self._host}Items/{item_id}/" \ if remote:
f"Images/Backdrop?tag={image_tag}&fillWidth=666&api_key={self._apikey}" 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: 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")}' subtitle = f'S{item.get("ParentIndexNumber")}:{item.get("IndexNumber")} - {item.get("Name")}'
if item_type == MediaType.MOVIE.value: if item_type == MediaType.MOVIE.value:
if item.get("BackdropImageTags"): if item.get("BackdropImageTags"):
image = self.__get_backdrop_url(item_id=item.get("Id"), image = self.get_backdrop_url(item_id=item.get("Id"),
image_tag=item.get("BackdropImageTags")[0]) image_tag=item.get("BackdropImageTags")[0])
else: else:
image = self.__get_local_image_by_id(item.get("Id")) image = self.__get_local_image_by_id(item.get("Id"))
else: else:
image = self.__get_backdrop_url(item_id=item.get("SeriesId"), image = self.get_backdrop_url(item_id=item.get("SeriesId"),
image_tag=item.get("SeriesPrimaryImageTag")) image_tag=item.get("SeriesPrimaryImageTag"))
if not image: if not image:
image = self.__get_local_image_by_id(item.get("SeriesId")) image = self.__get_local_image_by_id(item.get("SeriesId"))
ret_resume.append(schemas.MediaServerPlayItem( ret_resume.append(schemas.MediaServerPlayItem(
@@ -1185,7 +1188,7 @@ class Emby:
params = { params = {
"Limit": 100, "Limit": 100,
"MediaTypes": "Video", "MediaTypes": "Video",
"Fields": "ProductionYear,Path", "Fields": "ProductionYear,Path,BackdropImageTags",
"api_key": self._apikey "api_key": self._apikey
} }
try: try:
@@ -1213,7 +1216,8 @@ class Emby:
subtitle=item.get("ProductionYear"), subtitle=item.get("ProductionYear"),
type=item_type, type=item_type,
image=image, image=image,
link=link link=link,
BackdropImageTags=item.get("BackdropImageTags")
)) ))
return ret_latest return ret_latest
else: else:
+10 -7
View File
@@ -269,8 +269,8 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]):
return None return None
return server_obj.get_play_url(item_id) return server_obj.get_play_url(item_id)
def mediaserver_latest(self, server: str = None, def mediaserver_latest(self, server: str = None, count: int = 20,
count: int = 20, username: str = None) -> List[schemas.MediaServerPlayItem]: username: str = None) -> List[schemas.MediaServerPlayItem]:
""" """
获取媒体服务器最新入库条目 获取媒体服务器最新入库条目
""" """
@@ -283,7 +283,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]):
server: str = None, server: str = None,
count: int = 20, count: int = 20,
username: str = None, username: str = None,
host_type: bool = True, remote: bool = False,
) -> List[str]: ) -> List[str]:
""" """
获取媒体服务器最新入库条目的图片 获取媒体服务器最新入库条目的图片
@@ -291,7 +291,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]):
:param server: 媒体服务器名称 :param server: 媒体服务器名称
:param count: 获取数量 :param count: 获取数量
:param username: 用户名 :param username: 用户名
:param host_type: True为外网链接, False为内网链接 :param remote: True为外网链接, False为内网链接
:return: 图片链接列表 :return: 图片链接列表
""" """
server_obj: Jellyfin = self.get_instance(server) 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, items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(server=server, count=count,
username=username) username=username)
for item in items: for item in items:
link = server_obj.generate_image_link(item_id=item.id, image_type="Backdrop", host_type=host_type) if item.BackdropImageTags:
if link: image_url = server_obj.get_backdrop_url(item_id=item.id,
links.append(link) image_tag=item.BackdropImageTags[0],
remote=remote)
if image_url:
links.append(image_url)
return links return links
+12 -8
View File
@@ -823,20 +823,23 @@ class Jellyfin:
return "" return ""
return "%sItems/%s/Images/Primary" % (self._host, item_id) 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图片地址 获取Backdrop图片地址
:param: item_id: 在Jellyfin中的ID :param: item_id: 在Jellyfin中的ID
:param: image_tag: 图片的tag :param: image_tag: 图片的tag
:param: remote 是否远程使用,TG微信等客户端调用应为True :param: remote 是否远程使用,TG微信等客户端调用应为True
:param: inner 是否NT内部调用,为True是会使用NT中转
""" """
if not self._host or not self._apikey: if not self._host or not self._apikey:
return "" return ""
if not image_tag or not item_id: if not image_tag or not item_id:
return "" return ""
return f"{self._host}Items/{item_id}/" \ if remote:
f"Images/Backdrop?tag={image_tag}&fillWidth=666&api_key={self._apikey}" 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]]: 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 item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
link = self.get_play_url(item.get("Id")) link = self.get_play_url(item.get("Id"))
if item.get("BackdropImageTags"): if item.get("BackdropImageTags"):
image = self.__get_backdrop_url(item_id=item.get("Id"), image = self.get_backdrop_url(item_id=item.get("Id"),
image_tag=item.get("BackdropImageTags")[0]) image_tag=item.get("BackdropImageTags")[0])
else: else:
image = self.__get_local_image_by_id(item.get("Id")) image = self.__get_local_image_by_id(item.get("Id"))
# 小部分剧集无[xxx-S01E01-thumb.jpg]图片 # 小部分剧集无[xxx-S01E01-thumb.jpg]图片
@@ -919,7 +922,7 @@ class Jellyfin:
params = { params = {
"Limit": 100, "Limit": 100,
"MediaTypes": "Video", "MediaTypes": "Video",
"Fields": "ProductionYear,Path", "Fields": "ProductionYear,Path,BackdropImageTags",
"api_key": self._apikey, "api_key": self._apikey,
} }
try: try:
@@ -947,7 +950,8 @@ class Jellyfin:
subtitle=item.get("ProductionYear"), subtitle=item.get("ProductionYear"),
type=item_type, type=item_type,
image=image, image=image,
link=link link=link,
BackdropImageTags=item.get("BackdropImageTags")
)) ))
return ret_latest return ret_latest
else: else:
+1
View File
@@ -279,6 +279,7 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]):
server: str = None, server: str = None,
count: int = 20, count: int = 20,
username: str = None, username: str = None,
**kwargs
) -> List[str]: ) -> List[str]:
""" """
获取媒体服务器最新入库条目的图片 获取媒体服务器最新入库条目的图片
+1
View File
@@ -173,3 +173,4 @@ class MediaServerPlayItem(BaseModel):
image: Optional[str] = None image: Optional[str] = None
link: Optional[str] = None link: Optional[str] = None
percent: Optional[float] = None percent: Optional[float] = None
BackdropImageTags: Optional[list] = []