mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-04-13 17:52:28 +08:00
fix 优化媒体服务器图片获取性能 #2993
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -279,6 +279,7 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]):
|
||||
server: str = None,
|
||||
count: int = 20,
|
||||
username: str = None,
|
||||
**kwargs
|
||||
) -> List[str]:
|
||||
"""
|
||||
获取媒体服务器最新入库条目的图片
|
||||
|
||||
@@ -173,3 +173,4 @@ class MediaServerPlayItem(BaseModel):
|
||||
image: Optional[str] = None
|
||||
link: Optional[str] = None
|
||||
percent: Optional[float] = None
|
||||
BackdropImageTags: Optional[list] = []
|
||||
|
||||
Reference in New Issue
Block a user