mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-08 08:57:09 +08:00
Merge pull request #2993 from Akimio521/v2
This commit is contained in:
@@ -7,6 +7,7 @@ from fastapi.security import OAuth2PasswordRequestForm
|
|||||||
from app import schemas
|
from app import schemas
|
||||||
from app.chain.tmdb import TmdbChain
|
from app.chain.tmdb import TmdbChain
|
||||||
from app.chain.user import UserChain
|
from app.chain.user import UserChain
|
||||||
|
from app.chain.mediaserver import MediaServerChain
|
||||||
from app.core import security
|
from app.core import security
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.helper.sites import SitesHelper
|
from app.helper.sites import SitesHelper
|
||||||
@@ -53,10 +54,12 @@ def wallpaper() -> Any:
|
|||||||
"""
|
"""
|
||||||
获取登录页面电影海报
|
获取登录页面电影海报
|
||||||
"""
|
"""
|
||||||
if settings.WALLPAPER == "tmdb":
|
if settings.WALLPAPER == "bing":
|
||||||
url = TmdbChain().get_random_wallpager()
|
|
||||||
else:
|
|
||||||
url = WebUtils.get_bing_wallpaper()
|
url = WebUtils.get_bing_wallpaper()
|
||||||
|
elif settings.WALLPAPER == "mediaserver":
|
||||||
|
url = MediaServerChain().get_latest_wallpaper()
|
||||||
|
else:
|
||||||
|
url = TmdbChain().get_random_wallpager()
|
||||||
if url:
|
if url:
|
||||||
return schemas.Response(
|
return schemas.Response(
|
||||||
success=True,
|
success=True,
|
||||||
@@ -70,7 +73,9 @@ def wallpapers() -> Any:
|
|||||||
"""
|
"""
|
||||||
获取登录页面电影海报
|
获取登录页面电影海报
|
||||||
"""
|
"""
|
||||||
if settings.WALLPAPER == "tmdb":
|
if settings.WALLPAPER == "bing":
|
||||||
return TmdbChain().get_trending_wallpapers()
|
|
||||||
else:
|
|
||||||
return WebUtils.get_bing_wallpapers()
|
return WebUtils.get_bing_wallpapers()
|
||||||
|
elif settings.WALLPAPER == "mediaserver":
|
||||||
|
url = MediaServerChain().get_latest_wallpapers()
|
||||||
|
else:
|
||||||
|
url = TmdbChain().get_trending_wallpapers()
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import threading
|
import threading
|
||||||
from typing import List, Union, Optional, Generator
|
from typing import List, Union, Optional, Generator
|
||||||
|
|
||||||
|
from cachetools import cached, TTLCache
|
||||||
|
|
||||||
from app import schemas
|
from app import schemas
|
||||||
from app.chain import ChainBase
|
from app.chain import ChainBase
|
||||||
from app.core.config import global_vars
|
from app.core.config import global_vars
|
||||||
@@ -92,6 +94,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))
|
||||||
|
def get_latest_wallpapers(self, server:str, count=20) -> List[str]:
|
||||||
|
"""
|
||||||
|
获取最新最新入库条目海报作为壁纸,缓存1小时
|
||||||
|
"""
|
||||||
|
return self.run_module("mediaserver_latest_images", server=server, count=count)
|
||||||
|
|
||||||
|
def get_latest_wallpaper(self, server:str) -> Optional[str]:
|
||||||
|
"""
|
||||||
|
获取最新最新入库条目海报作为壁纸,缓存1小时
|
||||||
|
"""
|
||||||
|
return self.get_latest_wallpapers(server=server, count=20)[0]
|
||||||
|
|
||||||
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]:
|
||||||
"""
|
"""
|
||||||
获取播放地址
|
获取播放地址
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@ class ConfigModel(BaseModel):
|
|||||||
API_TOKEN: Optional[str] = None
|
API_TOKEN: Optional[str] = None
|
||||||
# 网络代理 IP:PORT
|
# 网络代理 IP:PORT
|
||||||
PROXY_HOST: Optional[str] = None
|
PROXY_HOST: Optional[str] = None
|
||||||
# 登录页面电影海报,tmdb/bing
|
# 登录页面电影海报,tmdb/bing/mediaserver
|
||||||
WALLPAPER: str = "tmdb"
|
WALLPAPER: str = "tmdb"
|
||||||
# 媒体搜索来源 themoviedb/douban/bangumi,多个用,分隔
|
# 媒体搜索来源 themoviedb/douban/bangumi,多个用,分隔
|
||||||
SEARCH_SOURCE: str = "themoviedb,douban,bangumi"
|
SEARCH_SOURCE: str = "themoviedb,douban,bangumi"
|
||||||
|
|||||||
@@ -280,3 +280,35 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]):
|
|||||||
if not server:
|
if not server:
|
||||||
return []
|
return []
|
||||||
return server.get_latest(num=count, username=username)
|
return server.get_latest(num=count, username=username)
|
||||||
|
|
||||||
|
def mediaserver_latest_images(self,
|
||||||
|
server: str,
|
||||||
|
count: int = 20,
|
||||||
|
username: str = None,
|
||||||
|
host_type: bool = True,
|
||||||
|
) -> List[str]:
|
||||||
|
"""
|
||||||
|
获取媒体服务器最新入库条目的图片
|
||||||
|
|
||||||
|
:param server: 媒体服务器名称
|
||||||
|
:param count: 获取数量
|
||||||
|
:param username: 用户名
|
||||||
|
:param host_type: True为外网链接, False为内网链接
|
||||||
|
:return: 图片链接列表
|
||||||
|
"""
|
||||||
|
server: Emby = self.get_instance(server)
|
||||||
|
if not server:
|
||||||
|
return []
|
||||||
|
|
||||||
|
links = []
|
||||||
|
items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(num=count, username=username)
|
||||||
|
for item in items:
|
||||||
|
if host_type and item.id:
|
||||||
|
_link = server.generate_external_image_link(id=item.id, image_type="Backdrop")
|
||||||
|
if _link:
|
||||||
|
links.append(_link)
|
||||||
|
elif item.image:
|
||||||
|
links.append(item.image)
|
||||||
|
|
||||||
|
return links
|
||||||
|
|
||||||
|
|||||||
@@ -278,3 +278,31 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]):
|
|||||||
if not server:
|
if not server:
|
||||||
return []
|
return []
|
||||||
return server.get_latest(num=count, username=username)
|
return server.get_latest(num=count, username=username)
|
||||||
|
|
||||||
|
def mediaserver_latest_images(self,
|
||||||
|
server: str,
|
||||||
|
count: int = 20,
|
||||||
|
username: str = None,
|
||||||
|
host_type: bool = True,
|
||||||
|
) -> List[str]:
|
||||||
|
"""
|
||||||
|
获取媒体服务器最新入库条目的图片
|
||||||
|
|
||||||
|
:param server: 媒体服务器名称
|
||||||
|
:param count: 获取数量
|
||||||
|
:param username: 用户名
|
||||||
|
:param host_type: True为外网链接, False为内网链接
|
||||||
|
:return: 图片链接列表
|
||||||
|
"""
|
||||||
|
server: Jellyfin = self.get_instance(server)
|
||||||
|
if not server:
|
||||||
|
return []
|
||||||
|
|
||||||
|
links = []
|
||||||
|
items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(num=count, username=username)
|
||||||
|
for item in items:
|
||||||
|
link = server.generate_image_link(item_id=item.id, image_type="Backdrop",host_type=host_type)
|
||||||
|
if link:
|
||||||
|
links.append(link)
|
||||||
|
|
||||||
|
return links
|
||||||
|
|||||||
@@ -274,6 +274,34 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]):
|
|||||||
return []
|
return []
|
||||||
return server.get_latest(num=count)
|
return server.get_latest(num=count)
|
||||||
|
|
||||||
|
def mediaserver_latest_images(self,
|
||||||
|
server: str,
|
||||||
|
count: int = 20,
|
||||||
|
username: str = None,
|
||||||
|
) -> List[str]:
|
||||||
|
"""
|
||||||
|
获取媒体服务器最新入库条目的图片
|
||||||
|
|
||||||
|
:param server: 媒体服务器名称
|
||||||
|
:param count: 获取数量
|
||||||
|
:param username: 用户名
|
||||||
|
:return: 图片链接列表
|
||||||
|
"""
|
||||||
|
server: Plex = self.get_instance(server)
|
||||||
|
if not server:
|
||||||
|
return []
|
||||||
|
|
||||||
|
links = []
|
||||||
|
items: List[schemas.MediaServerPlayItem] = self.mediaserver_latest(num=count, username=username)
|
||||||
|
for item in items:
|
||||||
|
link = server.get_remote_image_by_id(item_id=item.id,
|
||||||
|
image_type="Backdrop",
|
||||||
|
plex_url=False)
|
||||||
|
if link:
|
||||||
|
links.append(link)
|
||||||
|
|
||||||
|
return links
|
||||||
|
|
||||||
def mediaserver_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]:
|
def mediaserver_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
获取媒体库播放地址
|
获取媒体库播放地址
|
||||||
|
|||||||
@@ -293,13 +293,18 @@ class Plex:
|
|||||||
season_episodes[episode.seasonNumber].append(episode.index)
|
season_episodes[episode.seasonNumber].append(episode.index)
|
||||||
return videos.key, season_episodes
|
return videos.key, season_episodes
|
||||||
|
|
||||||
def get_remote_image_by_id(self, item_id: str, image_type: str, depth: int = 0) -> Optional[str]:
|
def get_remote_image_by_id(self,
|
||||||
|
item_id: str,
|
||||||
|
image_type: str,
|
||||||
|
depth: int = 0,
|
||||||
|
plex_url: bool = True) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
根据ItemId从Plex查询图片地址
|
根据ItemId从Plex查询图片地址
|
||||||
:param item_id: 在Plex中的ID
|
:param item_id: 在Plex中的ID
|
||||||
:param image_type: 图片的类型,Poster或者Backdrop等
|
:param image_type: 图片的类型,Poster或者Backdrop等
|
||||||
:param depth: 当前递归深度,默认为0
|
:param depth: 当前递归深度,默认为0
|
||||||
:return: 图片对应在TMDB中的URL
|
:param plex_url: 是否返回Plex的URL,默认为True(仅在配置了外网地址和Token时有效)
|
||||||
|
:return: 图片对应在plex服务器或TMDB中的URL
|
||||||
"""
|
"""
|
||||||
if not self._plex or depth > 2 or not item_id:
|
if not self._plex or depth > 2 or not item_id:
|
||||||
return None
|
return None
|
||||||
@@ -310,7 +315,7 @@ class Plex:
|
|||||||
if not item:
|
if not item:
|
||||||
return None
|
return None
|
||||||
# 如果配置了外网播放地址以及Token,则默认从Plex媒体服务器获取图片,否则返回有外网地址的图片资源
|
# 如果配置了外网播放地址以及Token,则默认从Plex媒体服务器获取图片,否则返回有外网地址的图片资源
|
||||||
if self._playhost and self._token:
|
if self._playhost and self._token and plex_url:
|
||||||
query = {"X-Plex-Token": self._token}
|
query = {"X-Plex-Token": self._token}
|
||||||
if image_type == "Poster":
|
if image_type == "Poster":
|
||||||
if item.thumb:
|
if item.thumb:
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ META_CACHE_EXPIRE=0
|
|||||||
AUTO_UPDATE_RESOURCE=true
|
AUTO_UPDATE_RESOURCE=true
|
||||||
# 【*】API密钥,未设置时系统将随机生成,建议使用复杂字符串,用于Jellyseerr/Overseerr、媒体服务器Webhook等配置以及部分支持API_TOKEN的API请求
|
# 【*】API密钥,未设置时系统将随机生成,建议使用复杂字符串,用于Jellyseerr/Overseerr、媒体服务器Webhook等配置以及部分支持API_TOKEN的API请求
|
||||||
API_TOKEN=''
|
API_TOKEN=''
|
||||||
# 登录页面电影海报,tmdb/bing,tmdb要求能正常连接api.themoviedb.org
|
# 登录页面电影海报,tmdb/bing/mediaserver,tmdb要求能正常连接api.themoviedb.org
|
||||||
WALLPAPER=tmdb
|
WALLPAPER=tmdb
|
||||||
# TMDB图片地址,无需修改需保留默认值,如果默认地址连通性不好可以尝试修改为:`static-mdb.v.geilijiasu.com`
|
# TMDB图片地址,无需修改需保留默认值,如果默认地址连通性不好可以尝试修改为:`static-mdb.v.geilijiasu.com`
|
||||||
TMDB_IMAGE_DOMAIN=image.tmdb.org
|
TMDB_IMAGE_DOMAIN=image.tmdb.org
|
||||||
|
|||||||
Reference in New Issue
Block a user