mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix 优化媒体服务器图片获取性能 #2993
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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]:
|
||||||
|
|||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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]:
|
||||||
"""
|
"""
|
||||||
获取媒体服务器最新入库条目的图片
|
获取媒体服务器最新入库条目的图片
|
||||||
|
|||||||
@@ -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] = []
|
||||||
|
|||||||
Reference in New Issue
Block a user