From 1dadf56c42c5aae6c404787897a217ea648521bc Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 15 May 2025 08:40:38 +0800 Subject: [PATCH] fix #4276 --- app/api/endpoints/login.py | 10 ++-- app/core/config.py | 5 +- app/helper/wallpaper.py | 100 +++++++++++++++++++++++++++++++++++++ app/utils/web.py | 88 -------------------------------- 4 files changed, 108 insertions(+), 95 deletions(-) create mode 100644 app/helper/wallpaper.py diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py index ea6d900b..26b181ed 100644 --- a/app/api/endpoints/login.py +++ b/app/api/endpoints/login.py @@ -11,7 +11,7 @@ from app.chain.mediaserver import MediaServerChain from app.core import security from app.core.config import settings from app.helper.sites import SitesHelper -from app.utils.web import WebUtils +from app.helper.wallpaper import WallpaperHelper router = APIRouter() @@ -55,11 +55,11 @@ def wallpaper() -> Any: 获取登录页面电影海报 """ if settings.WALLPAPER == "bing": - url = WebUtils.get_bing_wallpaper() + url = WallpaperHelper().get_bing_wallpaper() elif settings.WALLPAPER == "mediaserver": url = MediaServerChain().get_latest_wallpaper() elif settings.WALLPAPER == "customize": - url = WebUtils.get_customize_wallpapers()[0] + url = WallpaperHelper().get_customize_wallpaper() else: url = TmdbChain().get_random_wallpager() if url: @@ -76,12 +76,12 @@ def wallpapers() -> Any: 获取登录页面电影海报 """ if settings.WALLPAPER == "bing": - return WebUtils.get_bing_wallpapers() + return WallpaperHelper().get_bing_wallpapers() elif settings.WALLPAPER == "mediaserver": return MediaServerChain().get_latest_wallpapers() elif settings.WALLPAPER == "tmdb": return TmdbChain().get_trending_wallpapers() elif settings.WALLPAPER == "customize": - return WebUtils.get_customize_wallpapers() + return WallpaperHelper().get_customize_wallpapers() else: return [] diff --git a/app/core/config.py b/app/core/config.py index eb647bfe..e22f421e 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -89,6 +89,8 @@ class ConfigModel(BaseModel): PROXY_HOST: Optional[str] = None # 登录页面电影海报,tmdb/bing/mediaserver WALLPAPER: str = "tmdb" + # 自定义壁纸api地址 + CUSTOMIZE_WALLPAPER_API_URL: Optional[str] = None # 媒体搜索来源 themoviedb/douban/bangumi,多个用,分隔 SEARCH_SOURCE: str = "themoviedb,douban,bangumi" # 媒体识别来源 themoviedb/douban @@ -268,8 +270,7 @@ class ConfigModel(BaseModel): TOKENIZED_SEARCH: bool = False # 为指定默认字幕添加.default后缀 DEFAULT_SUB: Optional[str] = "zh-cn" - # 自定义壁纸api地址 - CUSTOMIZE_WALLPAPER_API_URL: Optional[str] = None + class Settings(BaseSettings, ConfigModel, LogConfigModel): """ diff --git a/app/helper/wallpaper.py b/app/helper/wallpaper.py new file mode 100644 index 00000000..e5162f12 --- /dev/null +++ b/app/helper/wallpaper.py @@ -0,0 +1,100 @@ +from typing import Optional, List + +from app.core.cache import cached +from app.core.config import settings +from app.utils.http import RequestUtils +from app.utils.singleton import Singleton + + +class WallpaperHelper(metaclass=Singleton): + + def __init__(self): + self.req = RequestUtils(timeout=5) + + @cached(maxsize=1, ttl=3600) + def get_bing_wallpaper(self) -> Optional[str]: + """ + 获取Bing每日壁纸 + """ + url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" + resp = self.req.get_res(url) + if resp and resp.status_code == 200: + try: + result = resp.json() + if isinstance(result, dict): + for image in result.get('images') or []: + return f"https://cn.bing.com{image.get('url')}" if 'url' in image else '' + except Exception as err: + print(str(err)) + return None + + @cached(maxsize=1, ttl=3600) + def get_bing_wallpapers(self, num: int = 7) -> List[str]: + """ + 获取7天的Bing每日壁纸 + """ + url = f"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n={num}" + resp = self.req.get_res(url) + if resp and resp.status_code == 200: + try: + result = resp.json() + if isinstance(result, dict): + return [f"https://cn.bing.com{image.get('url')}" for image in result.get('images') or []] + except Exception as err: + print(str(err)) + return [] + + @cached(maxsize=1, ttl=3600) + def get_customize_wallpaper(self) -> Optional[str]: + """ + 获取自定义壁纸api壁纸 + """ + wallpaper_list = self.get_customize_wallpapers() + if wallpaper_list: + return wallpaper_list[0] + return None + + @cached(maxsize=1, ttl=3600) + def get_customize_wallpapers(self) -> List[str]: + """ + 获取自定义壁纸api壁纸 + """ + + def find_files_with_suffixes(obj, suffixes: List[str]) -> List[str]: + """ + 递归查找对象中所有包含特定后缀的文件,返回匹配的字符串列表 + 支持输入:字典、列表、字符串 + """ + _result = [] + + # 处理字符串 + if isinstance(obj, str): + if obj.endswith(tuple(suffixes)): + _result.append(obj) + + # 处理字典 + elif isinstance(obj, dict): + for value in obj.values(): + _result.extend(find_files_with_suffixes(value, suffixes)) + + # 处理列表 + elif isinstance(obj, list): + for item in obj: + _result.extend(find_files_with_suffixes(item, suffixes)) + + return _result + + # 判断是否存在自定义壁纸api + if settings.CUSTOMIZE_WALLPAPER_API_URL: + wallpaper_list = [] + resp = self.req.get_res(settings.CUSTOMIZE_WALLPAPER_API_URL) + if resp and resp.status_code == 200: + try: + result = resp.json() + if isinstance(result, list) or isinstance(result, dict) or isinstance(result, str): + wallpaper_list = find_files_with_suffixes(result, settings.SECURITY_IMAGE_SUFFIXES) + except Exception as err: + print(str(err)) + return wallpaper_list + else: + return [] diff --git a/app/utils/web.py b/app/utils/web.py index 72a0fe86..2a0bfff5 100644 --- a/app/utils/web.py +++ b/app/utils/web.py @@ -1,7 +1,3 @@ -from typing import Optional, List - -from app.core.cache import cached -from app.core.config import settings from app.utils.http import RequestUtils @@ -73,87 +69,3 @@ class WebUtils: except Exception as err: print(str(err)) return "" - - @staticmethod - @cached(maxsize=1, ttl=3600) - def get_bing_wallpaper() -> Optional[str]: - """ - 获取Bing每日壁纸 - """ - url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" - resp = RequestUtils(timeout=5).get_res(url) - if resp and resp.status_code == 200: - try: - result = resp.json() - if isinstance(result, dict): - for image in result.get('images') or []: - return f"https://cn.bing.com{image.get('url')}" if 'url' in image else '' - except Exception as err: - print(str(err)) - return None - - @staticmethod - @cached(maxsize=1, ttl=3600) - def get_bing_wallpapers(num: int = 7) -> List[str]: - """ - 获取7天的Bing每日壁纸 - """ - url = f"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n={num}" - resp = RequestUtils(timeout=5).get_res(url) - if resp and resp.status_code == 200: - try: - result = resp.json() - if isinstance(result, dict): - return [f"https://cn.bing.com{image.get('url')}" for image in result.get('images') or []] - except Exception as err: - print(str(err)) - return [] - - @staticmethod - @cached(maxsize=1, ttl=3600) - def get_customize_wallpapers() -> List[str]: - """ - 递归查找对象中所有包含特定后缀的文件或URL,返回匹配的字符串列表 - 支持输入:字典、列表、字符串(普通文件路径或URL) - """ - def find_files_with_suffixes(obj, suffixes: list[str]) -> list[str]: - """ - 递归查找对象中所有包含特定后缀的文件,返回匹配的字符串列表 - 支持输入:字典、列表、字符串 - """ - result = [] - - # 处理字符串 - if isinstance(obj, str): - if obj.endswith(tuple(suffixes)): - result.append(obj) - - # 处理字典 - elif isinstance(obj, dict): - for value in obj.values(): - result.extend(find_files_with_suffixes(value, suffixes)) - - # 处理列表 - elif isinstance(obj, list): - for item in obj: - result.extend(find_files_with_suffixes(item, suffixes)) - - return result - """ - 获取自定义壁纸api壁纸 - """ - # 判断是否存在自定义壁纸api - if settings.CUSTOMIZE_WALLPAPER_API_URL is not None and len(settings.CUSTOMIZE_WALLPAPER_API_URL) > 0: - url = settings.CUSTOMIZE_WALLPAPER_API_URL - wallpaper_list = [] - resp = RequestUtils(timeout=5).get_res(url) - if resp and resp.status_code == 200: - try: - result = resp.json() - if isinstance(result, list) or isinstance(result, dict) or isinstance(result, str): - wallpaper_list = find_files_with_suffixes(result, settings.SECURITY_IMAGE_SUFFIXES) - except Exception as err: - print(str(err)) - return wallpaper_list - else: - return [] \ No newline at end of file