feat:错误变量类型兼容

This commit is contained in:
jxxghp 2024-02-15 13:28:52 +08:00
parent 9f450dd8be
commit b8fac86c6e
2 changed files with 74 additions and 44 deletions

View File

@ -3,7 +3,7 @@ import sys
from pathlib import Path from pathlib import Path
from typing import List, Optional from typing import List, Optional
from pydantic import BaseSettings from pydantic import BaseSettings, validator
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
@ -32,7 +32,7 @@ class Settings(BaseSettings):
# 是否开发模式 # 是否开发模式
DEV: bool = False DEV: bool = False
# 配置文件目录 # 配置文件目录
CONFIG_DIR: str = None CONFIG_DIR: Optional[str] = None
# 超级管理员 # 超级管理员
SUPERUSER: str = "admin" SUPERUSER: str = "admin"
# API密钥需要更换 # API密钥需要更换
@ -40,7 +40,7 @@ class Settings(BaseSettings):
# 登录页面电影海报,tmdb/bing # 登录页面电影海报,tmdb/bing
WALLPAPER: str = "tmdb" WALLPAPER: str = "tmdb"
# 网络代理 IP:PORT # 网络代理 IP:PORT
PROXY_HOST: str = None PROXY_HOST: Optional[str] = None
# 媒体识别来源 themoviedb/douban # 媒体识别来源 themoviedb/douban
RECOGNIZE_SOURCE: str = "themoviedb" RECOGNIZE_SOURCE: str = "themoviedb"
# 刮削来源 themoviedb/douban # 刮削来源 themoviedb/douban
@ -82,27 +82,27 @@ class Settings(BaseSettings):
# 用户认证站点 # 用户认证站点
AUTH_SITE: str = "" AUTH_SITE: str = ""
# 交互搜索自动下载用户ID使用,分割 # 交互搜索自动下载用户ID使用,分割
AUTO_DOWNLOAD_USER: str = None AUTO_DOWNLOAD_USER: Optional[str] = None
# 消息通知渠道 telegram/wechat/slack多个通知渠道用,分隔 # 消息通知渠道 telegram/wechat/slack多个通知渠道用,分隔
MESSAGER: str = "telegram" MESSAGER: str = "telegram"
# WeChat企业ID # WeChat企业ID
WECHAT_CORPID: str = None WECHAT_CORPID: Optional[str] = None
# WeChat应用Secret # WeChat应用Secret
WECHAT_APP_SECRET: str = None WECHAT_APP_SECRET: Optional[str] = None
# WeChat应用ID # WeChat应用ID
WECHAT_APP_ID: str = None WECHAT_APP_ID: Optional[str] = None
# WeChat代理服务器 # WeChat代理服务器
WECHAT_PROXY: str = "https://qyapi.weixin.qq.com" WECHAT_PROXY: str = "https://qyapi.weixin.qq.com"
# WeChat Token # WeChat Token
WECHAT_TOKEN: str = None WECHAT_TOKEN: Optional[str] = None
# WeChat EncodingAESKey # WeChat EncodingAESKey
WECHAT_ENCODING_AESKEY: str = None WECHAT_ENCODING_AESKEY: Optional[str] = None
# WeChat 管理员 # WeChat 管理员
WECHAT_ADMINS: str = None WECHAT_ADMINS: Optional[str] = None
# Telegram Bot Token # Telegram Bot Token
TELEGRAM_TOKEN: str = None TELEGRAM_TOKEN: Optional[str] = None
# Telegram Chat ID # Telegram Chat ID
TELEGRAM_CHAT_ID: str = None TELEGRAM_CHAT_ID: Optional[str] = None
# Telegram 用户ID使用,分隔 # Telegram 用户ID使用,分隔
TELEGRAM_USERS: str = "" TELEGRAM_USERS: str = ""
# Telegram 管理员ID使用,分隔 # Telegram 管理员ID使用,分隔
@ -122,11 +122,11 @@ class Settings(BaseSettings):
# 下载器监控开关 # 下载器监控开关
DOWNLOADER_MONITOR: bool = True DOWNLOADER_MONITOR: bool = True
# Qbittorrent地址IP:PORT # Qbittorrent地址IP:PORT
QB_HOST: str = None QB_HOST: Optional[str] = None
# Qbittorrent用户名 # Qbittorrent用户名
QB_USER: str = None QB_USER: Optional[str] = None
# Qbittorrent密码 # Qbittorrent密码
QB_PASSWORD: str = None QB_PASSWORD: Optional[str] = None
# Qbittorrent分类自动管理 # Qbittorrent分类自动管理
QB_CATEGORY: bool = False QB_CATEGORY: bool = False
# Qbittorrent按顺序下载 # Qbittorrent按顺序下载
@ -134,21 +134,21 @@ class Settings(BaseSettings):
# Qbittorrent忽略队列限制强制继续 # Qbittorrent忽略队列限制强制继续
QB_FORCE_RESUME: bool = False QB_FORCE_RESUME: bool = False
# Transmission地址IP:PORT # Transmission地址IP:PORT
TR_HOST: str = None TR_HOST: Optional[str] = None
# Transmission用户名 # Transmission用户名
TR_USER: str = None TR_USER: Optional[str] = None
# Transmission密码 # Transmission密码
TR_PASSWORD: str = None TR_PASSWORD: Optional[str] = None
# 种子标签 # 种子标签
TORRENT_TAG: str = "MOVIEPILOT" 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 DOWNLOAD_CATEGORY: bool = False
# 下载站点字幕 # 下载站点字幕
@ -158,33 +158,33 @@ class Settings(BaseSettings):
# 媒体服务器同步间隔(小时) # 媒体服务器同步间隔(小时)
MEDIASERVER_SYNC_INTERVAL: Optional[int] = 6 MEDIASERVER_SYNC_INTERVAL: Optional[int] = 6
# 媒体服务器同步黑名单,多个媒体库名称,分割 # 媒体服务器同步黑名单,多个媒体库名称,分割
MEDIASERVER_SYNC_BLACKLIST: str = None MEDIASERVER_SYNC_BLACKLIST: Optional[str] = None
# EMBY服务器地址IP:PORT # EMBY服务器地址IP:PORT
EMBY_HOST: str = None EMBY_HOST: Optional[str] = None
# EMBY外网地址http(s)://DOMAIN:PORT未设置时使用EMBY_HOST # EMBY外网地址http(s)://DOMAIN:PORT未设置时使用EMBY_HOST
EMBY_PLAY_HOST: str = None EMBY_PLAY_HOST: Optional[str] = None
# EMBY Api Key # EMBY Api Key
EMBY_API_KEY: str = None EMBY_API_KEY: Optional[str] = None
# Jellyfin服务器地址IP:PORT # Jellyfin服务器地址IP:PORT
JELLYFIN_HOST: str = None JELLYFIN_HOST: Optional[str] = None
# Jellyfin外网地址http(s)://DOMAIN:PORT未设置时使用JELLYFIN_HOST # Jellyfin外网地址http(s)://DOMAIN:PORT未设置时使用JELLYFIN_HOST
JELLYFIN_PLAY_HOST: str = None JELLYFIN_PLAY_HOST: Optional[str] = None
# Jellyfin Api Key # Jellyfin Api Key
JELLYFIN_API_KEY: str = None JELLYFIN_API_KEY: Optional[str] = None
# Plex服务器地址IP:PORT # Plex服务器地址IP:PORT
PLEX_HOST: str = None PLEX_HOST: Optional[str] = None
# Plex外网地址http(s)://DOMAIN:PORT未设置时使用PLEX_HOST # Plex外网地址http(s)://DOMAIN:PORT未设置时使用PLEX_HOST
PLEX_PLAY_HOST: str = None PLEX_PLAY_HOST: Optional[str] = None
# Plex Token # Plex Token
PLEX_TOKEN: str = None PLEX_TOKEN: Optional[str] = None
# 转移方式 link/copy/move/softlink # 转移方式 link/copy/move/softlink
TRANSFER_TYPE: str = "copy" TRANSFER_TYPE: str = "copy"
# CookieCloud服务器地址 # CookieCloud服务器地址
COOKIECLOUD_HOST: str = "https://movie-pilot.org/cookiecloud" COOKIECLOUD_HOST: str = "https://movie-pilot.org/cookiecloud"
# CookieCloud用户KEY # CookieCloud用户KEY
COOKIECLOUD_KEY: str = None COOKIECLOUD_KEY: Optional[str] = None
# CookieCloud端对端加密密码 # CookieCloud端对端加密密码
COOKIECLOUD_PASSWORD: str = None COOKIECLOUD_PASSWORD: Optional[str] = None
# CookieCloud同步间隔分钟 # CookieCloud同步间隔分钟
COOKIECLOUD_INTERVAL: Optional[int] = 60 * 24 COOKIECLOUD_INTERVAL: Optional[int] = 60 * 24
# OCR服务器地址 # OCR服务器地址
@ -192,13 +192,13 @@ class Settings(BaseSettings):
# CookieCloud对应的浏览器UA # 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" 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_MOVIE_NAME: str = "电影"
# 电视剧媒体库目录名 # 电视剧媒体库目录名
LIBRARY_TV_NAME: str = "电视剧" LIBRARY_TV_NAME: str = "电视剧"
# 动漫媒体库目录名,不设置时使用电视剧目录 # 动漫媒体库目录名,不设置时使用电视剧目录
LIBRARY_ANIME_NAME: str = None LIBRARY_ANIME_NAME: Optional[str] = None
# 二级分类 # 二级分类
LIBRARY_CATEGORY: bool = True LIBRARY_CATEGORY: bool = True
# 电视剧动漫的分类genre_ids # 电视剧动漫的分类genre_ids
@ -219,10 +219,37 @@ class Settings(BaseSettings):
# 插件市场仓库地址,多个地址使用,分隔,地址以/结尾 # 插件市场仓库地址,多个地址使用,分隔,地址以/结尾
PLUGIN_MARKET: str = "https://github.com/jxxghp/MoviePilot-Plugins" PLUGIN_MARKET: str = "https://github.com/jxxghp/MoviePilot-Plugins"
# Github token提高请求api限流阈值 ghp_**** # Github token提高请求api限流阈值 ghp_****
GITHUB_TOKEN: str = None GITHUB_TOKEN: Optional[str] = None
# 自动检查和更新站点资源包(站点索引、认证等) # 自动检查和更新站点资源包(站点索引、认证等)
AUTO_UPDATE_RESOURCE: bool = True 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 @property
def INNER_CONFIG_PATH(self): def INNER_CONFIG_PATH(self):
return self.ROOT_PATH / "config" return self.ROOT_PATH / "config"

View File

@ -93,13 +93,14 @@ class Scheduler(metaclass=Singleton):
return return
# CookieCloud定时同步 # CookieCloud定时同步
if settings.COOKIECLOUD_INTERVAL: if settings.COOKIECLOUD_INTERVAL \
and str(settings.COOKIECLOUD_INTERVAL).isdigit():
self._scheduler.add_job( self._scheduler.add_job(
self.start, self.start,
"interval", "interval",
id="cookiecloud", id="cookiecloud",
name="同步CookieCloud站点", name="同步CookieCloud站点",
minutes=settings.COOKIECLOUD_INTERVAL, minutes=int(settings.COOKIECLOUD_INTERVAL),
next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1),
kwargs={ kwargs={
'job_id': 'cookiecloud' '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._scheduler.add_job(
self.start, self.start,
"interval", "interval",
id="mediaserver_sync", id="mediaserver_sync",
name="同步媒体服务器", name="同步媒体服务器",
hours=settings.MEDIASERVER_SYNC_INTERVAL, hours=int(settings.MEDIASERVER_SYNC_INTERVAL),
next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5), next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5),
kwargs={ kwargs={
'job_id': 'mediaserver_sync' 'job_id': 'mediaserver_sync'
@ -173,16 +175,17 @@ class Scheduler(metaclass=Singleton):
}) })
else: else:
# RSS订阅模式 # 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 settings.SUBSCRIBE_RSS_INTERVAL = 30
elif settings.SUBSCRIBE_RSS_INTERVAL < 5: elif int(settings.SUBSCRIBE_RSS_INTERVAL) < 5:
settings.SUBSCRIBE_RSS_INTERVAL = 5 settings.SUBSCRIBE_RSS_INTERVAL = 5
self._scheduler.add_job( self._scheduler.add_job(
self.start, self.start,
"interval", "interval",
id="subscribe_refresh", id="subscribe_refresh",
name="RSS订阅刷新", name="RSS订阅刷新",
minutes=settings.SUBSCRIBE_RSS_INTERVAL, minutes=int(settings.SUBSCRIBE_RSS_INTERVAL),
kwargs={ kwargs={
'job_id': 'subscribe_refresh' 'job_id': 'subscribe_refresh'
} }