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

View File

@@ -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,

View File

@@ -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]:

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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:

View File

@@ -279,6 +279,7 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]):
server: str = None,
count: int = 20,
username: str = None,
**kwargs
) -> List[str]:
"""
获取媒体服务器最新入库条目的图片

View File

@@ -173,3 +173,4 @@ class MediaServerPlayItem(BaseModel):
image: Optional[str] = None
link: Optional[str] = None
percent: Optional[float] = None
BackdropImageTags: Optional[list] = []