From b8fac86c6e2720b262eeae999a1938f58a2d414d Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 15 Feb 2024 13:28:52 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E9=94=99=E8=AF=AF=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=B1=BB=E5=9E=8B=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 101 ++++++++++++++++++++++++++++----------------- app/scheduler.py | 17 ++++---- 2 files changed, 74 insertions(+), 44 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index a329149f..24945634 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -3,7 +3,7 @@ import sys from pathlib import Path from typing import List, Optional -from pydantic import BaseSettings +from pydantic import BaseSettings, validator from app.utils.system import SystemUtils @@ -32,7 +32,7 @@ class Settings(BaseSettings): # 是否开发模式 DEV: bool = False # 配置文件目录 - CONFIG_DIR: str = None + CONFIG_DIR: Optional[str] = None # 超级管理员 SUPERUSER: str = "admin" # API密钥,需要更换 @@ -40,7 +40,7 @@ class Settings(BaseSettings): # 登录页面电影海报,tmdb/bing WALLPAPER: str = "tmdb" # 网络代理 IP:PORT - PROXY_HOST: str = None + PROXY_HOST: Optional[str] = None # 媒体识别来源 themoviedb/douban RECOGNIZE_SOURCE: str = "themoviedb" # 刮削来源 themoviedb/douban @@ -82,27 +82,27 @@ class Settings(BaseSettings): # 用户认证站点 AUTH_SITE: str = "" # 交互搜索自动下载用户ID,使用,分割 - AUTO_DOWNLOAD_USER: str = None + AUTO_DOWNLOAD_USER: Optional[str] = None # 消息通知渠道 telegram/wechat/slack,多个通知渠道用,分隔 MESSAGER: str = "telegram" # WeChat企业ID - WECHAT_CORPID: str = None + WECHAT_CORPID: Optional[str] = None # WeChat应用Secret - WECHAT_APP_SECRET: str = None + WECHAT_APP_SECRET: Optional[str] = None # WeChat应用ID - WECHAT_APP_ID: str = None + WECHAT_APP_ID: Optional[str] = None # WeChat代理服务器 WECHAT_PROXY: str = "https://qyapi.weixin.qq.com" # WeChat Token - WECHAT_TOKEN: str = None + WECHAT_TOKEN: Optional[str] = None # WeChat EncodingAESKey - WECHAT_ENCODING_AESKEY: str = None + WECHAT_ENCODING_AESKEY: Optional[str] = None # WeChat 管理员 - WECHAT_ADMINS: str = None + WECHAT_ADMINS: Optional[str] = None # Telegram Bot Token - TELEGRAM_TOKEN: str = None + TELEGRAM_TOKEN: Optional[str] = None # Telegram Chat ID - TELEGRAM_CHAT_ID: str = None + TELEGRAM_CHAT_ID: Optional[str] = None # Telegram 用户ID,使用,分隔 TELEGRAM_USERS: str = "" # Telegram 管理员ID,使用,分隔 @@ -122,11 +122,11 @@ class Settings(BaseSettings): # 下载器监控开关 DOWNLOADER_MONITOR: bool = True # Qbittorrent地址,IP:PORT - QB_HOST: str = None + QB_HOST: Optional[str] = None # Qbittorrent用户名 - QB_USER: str = None + QB_USER: Optional[str] = None # Qbittorrent密码 - QB_PASSWORD: str = None + QB_PASSWORD: Optional[str] = None # Qbittorrent分类自动管理 QB_CATEGORY: bool = False # Qbittorrent按顺序下载 @@ -134,21 +134,21 @@ class Settings(BaseSettings): # Qbittorrent忽略队列限制,强制继续 QB_FORCE_RESUME: bool = False # Transmission地址,IP:PORT - TR_HOST: str = None + TR_HOST: Optional[str] = None # Transmission用户名 - TR_USER: str = None + TR_USER: Optional[str] = None # Transmission密码 - TR_PASSWORD: str = None + TR_PASSWORD: Optional[str] = None # 种子标签 TORRENT_TAG: str = "MOVIEPILOT" # 下载保存目录,容器内映射路径需要一致 - DOWNLOAD_PATH: str = None + DOWNLOAD_PATH: Optional[str] = None # 电影下载保存目录,容器内映射路径需要一致 - DOWNLOAD_MOVIE_PATH: str = None + DOWNLOAD_MOVIE_PATH: Optional[str] = None # 电视剧下载保存目录,容器内映射路径需要一致 - DOWNLOAD_TV_PATH: str = None + DOWNLOAD_TV_PATH: Optional[str] = None # 动漫下载保存目录,容器内映射路径需要一致 - DOWNLOAD_ANIME_PATH: str = None + DOWNLOAD_ANIME_PATH: Optional[str] = None # 下载目录二级分类 DOWNLOAD_CATEGORY: bool = False # 下载站点字幕 @@ -158,33 +158,33 @@ class Settings(BaseSettings): # 媒体服务器同步间隔(小时) MEDIASERVER_SYNC_INTERVAL: Optional[int] = 6 # 媒体服务器同步黑名单,多个媒体库名称,分割 - MEDIASERVER_SYNC_BLACKLIST: str = None + MEDIASERVER_SYNC_BLACKLIST: Optional[str] = None # EMBY服务器地址,IP:PORT - EMBY_HOST: str = None + EMBY_HOST: Optional[str] = None # EMBY外网地址,http(s)://DOMAIN:PORT,未设置时使用EMBY_HOST - EMBY_PLAY_HOST: str = None + EMBY_PLAY_HOST: Optional[str] = None # EMBY Api Key - EMBY_API_KEY: str = None + EMBY_API_KEY: Optional[str] = None # Jellyfin服务器地址,IP:PORT - JELLYFIN_HOST: str = None + JELLYFIN_HOST: Optional[str] = None # Jellyfin外网地址,http(s)://DOMAIN:PORT,未设置时使用JELLYFIN_HOST - JELLYFIN_PLAY_HOST: str = None + JELLYFIN_PLAY_HOST: Optional[str] = None # Jellyfin Api Key - JELLYFIN_API_KEY: str = None + JELLYFIN_API_KEY: Optional[str] = None # Plex服务器地址,IP:PORT - PLEX_HOST: str = None + PLEX_HOST: Optional[str] = None # Plex外网地址,http(s)://DOMAIN:PORT,未设置时使用PLEX_HOST - PLEX_PLAY_HOST: str = None + PLEX_PLAY_HOST: Optional[str] = None # Plex Token - PLEX_TOKEN: str = None + PLEX_TOKEN: Optional[str] = None # 转移方式 link/copy/move/softlink TRANSFER_TYPE: str = "copy" # CookieCloud服务器地址 COOKIECLOUD_HOST: str = "https://movie-pilot.org/cookiecloud" # CookieCloud用户KEY - COOKIECLOUD_KEY: str = None + COOKIECLOUD_KEY: Optional[str] = None # CookieCloud端对端加密密码 - COOKIECLOUD_PASSWORD: str = None + COOKIECLOUD_PASSWORD: Optional[str] = None # CookieCloud同步间隔(分钟) COOKIECLOUD_INTERVAL: Optional[int] = 60 * 24 # OCR服务器地址 @@ -192,13 +192,13 @@ class Settings(BaseSettings): # CookieCloud对应的浏览器UA USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57" # 媒体库目录,多个目录使用,分隔 - LIBRARY_PATH: str = None + LIBRARY_PATH: Optional[str] = None # 电影媒体库目录名 LIBRARY_MOVIE_NAME: str = "电影" # 电视剧媒体库目录名 LIBRARY_TV_NAME: str = "电视剧" # 动漫媒体库目录名,不设置时使用电视剧目录 - LIBRARY_ANIME_NAME: str = None + LIBRARY_ANIME_NAME: Optional[str] = None # 二级分类 LIBRARY_CATEGORY: bool = True # 电视剧动漫的分类genre_ids @@ -219,10 +219,37 @@ class Settings(BaseSettings): # 插件市场仓库地址,多个地址使用,分隔,地址以/结尾 PLUGIN_MARKET: str = "https://github.com/jxxghp/MoviePilot-Plugins" # Github token,提高请求api限流阈值 ghp_**** - GITHUB_TOKEN: str = None + GITHUB_TOKEN: Optional[str] = None # 自动检查和更新站点资源包(站点索引、认证等) AUTO_UPDATE_RESOURCE: bool = True + @validator("SUBSCRIBE_RSS_INTERVAL", pre=True, always=True) + def convert_rss_interval(cls, value): + if not value: + return 0 + try: + return int(value) + except (ValueError, TypeError): + raise ValueError("SUBSCRIBE_RSS_INTERVAL设置有误,不是数字!") + + @validator("COOKIECLOUD_INTERVAL", pre=True, always=True) + def convert_cookiecloud_interval(cls, value): + if not value: + return 0 + try: + return int(value) + except (ValueError, TypeError): + raise ValueError("COOKIECLOUD_INTERVAL设置有误,不是数字!") + + @validator("MEDIASERVER_SYNC_INTERVAL", pre=True, always=True) + def convert_mediaserver_sync_interval(cls, value): + if not value: + return 0 + try: + return int(value) + except (ValueError, TypeError): + raise ValueError("MEDIASERVER_SYNC_INTERVAL设置有误,不是数字!") + @property def INNER_CONFIG_PATH(self): return self.ROOT_PATH / "config" diff --git a/app/scheduler.py b/app/scheduler.py index b1b92787..1bb7852d 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -93,13 +93,14 @@ class Scheduler(metaclass=Singleton): return # CookieCloud定时同步 - if settings.COOKIECLOUD_INTERVAL: + if settings.COOKIECLOUD_INTERVAL \ + and str(settings.COOKIECLOUD_INTERVAL).isdigit(): self._scheduler.add_job( self.start, "interval", id="cookiecloud", name="同步CookieCloud站点", - minutes=settings.COOKIECLOUD_INTERVAL, + minutes=int(settings.COOKIECLOUD_INTERVAL), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1), kwargs={ 'job_id': 'cookiecloud' @@ -107,13 +108,14 @@ class Scheduler(metaclass=Singleton): ) # 媒体服务器同步 - if settings.MEDIASERVER_SYNC_INTERVAL: + if settings.MEDIASERVER_SYNC_INTERVAL \ + and str(settings.MEDIASERVER_SYNC_INTERVAL).isdigit(): self._scheduler.add_job( self.start, "interval", id="mediaserver_sync", name="同步媒体服务器", - hours=settings.MEDIASERVER_SYNC_INTERVAL, + hours=int(settings.MEDIASERVER_SYNC_INTERVAL), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5), kwargs={ 'job_id': 'mediaserver_sync' @@ -173,16 +175,17 @@ class Scheduler(metaclass=Singleton): }) else: # RSS订阅模式 - if not settings.SUBSCRIBE_RSS_INTERVAL: + if not settings.SUBSCRIBE_RSS_INTERVAL \ + or not str(settings.SUBSCRIBE_RSS_INTERVAL).isdigit(): settings.SUBSCRIBE_RSS_INTERVAL = 30 - elif settings.SUBSCRIBE_RSS_INTERVAL < 5: + elif int(settings.SUBSCRIBE_RSS_INTERVAL) < 5: settings.SUBSCRIBE_RSS_INTERVAL = 5 self._scheduler.add_job( self.start, "interval", id="subscribe_refresh", name="RSS订阅刷新", - minutes=settings.SUBSCRIBE_RSS_INTERVAL, + minutes=int(settings.SUBSCRIBE_RSS_INTERVAL), kwargs={ 'job_id': 'subscribe_refresh' }