fix schemas default_factory

This commit is contained in:
jxxghp
2024-12-23 11:35:38 +08:00
parent 800a66dc99
commit d45d49edbd
13 changed files with 86 additions and 77 deletions
+22 -22
View File
@@ -1,6 +1,6 @@
from typing import Optional, Dict, List, Union from typing import Optional, Dict, List, Union
from pydantic import BaseModel from pydantic import BaseModel, Field
class MetaInfo(BaseModel): class MetaInfo(BaseModel):
@@ -104,56 +104,56 @@ class MediaInfo(BaseModel):
# 二级分类 # 二级分类
category: Optional[str] = "" category: Optional[str] = ""
# 季季集清单 # 季季集清单
seasons: Optional[Dict[int, list]] = {} seasons: Optional[Dict[int, list]] = Field(default_factory=dict)
# 季详情 # 季详情
season_info: Optional[List[dict]] = [] season_info: Optional[List[dict]] = Field(default_factory=list)
# 别名和译名 # 别名和译名
names: Optional[list] = [] names: Optional[list] = Field(default_factory=list)
# 演员 # 演员
actors: Optional[list] = [] actors: Optional[list] = Field(default_factory=list)
# 导演 # 导演
directors: Optional[list] = [] directors: Optional[list] = Field(default_factory=list)
# 详情链接 # 详情链接
detail_link: Optional[str] = None detail_link: Optional[str] = None
# 其它TMDB属性 # 其它TMDB属性
# 是否成人内容 # 是否成人内容
adult: Optional[bool] = False adult: Optional[bool] = False
# 创建人 # 创建人
created_by: Optional[list] = [] created_by: Optional[list] = Field(default_factory=list)
# 集时长 # 集时长
episode_run_time: Optional[list] = [] episode_run_time: Optional[list] = Field(default_factory=list)
# 风格 # 风格
genres: Optional[List[dict]] = [] genres: Optional[List[dict]] = Field(default_factory=list)
# 首播日期 # 首播日期
first_air_date: Optional[str] = None first_air_date: Optional[str] = None
# 首页 # 首页
homepage: Optional[str] = None homepage: Optional[str] = None
# 语种 # 语种
languages: Optional[list] = [] languages: Optional[list] = Field(default_factory=list)
# 最后上映日期 # 最后上映日期
last_air_date: Optional[str] = None last_air_date: Optional[str] = None
# 流媒体平台 # 流媒体平台
networks: Optional[list] = [] networks: Optional[list] = Field(default_factory=list)
# 集数 # 集数
number_of_episodes: Optional[int] = 0 number_of_episodes: Optional[int] = 0
# 季数 # 季数
number_of_seasons: Optional[int] = 0 number_of_seasons: Optional[int] = 0
# 原产国 # 原产国
origin_country: Optional[list] = [] origin_country: Optional[list] = Field(default_factory=list)
# 原名 # 原名
original_name: Optional[str] = None original_name: Optional[str] = None
# 出品公司 # 出品公司
production_companies: Optional[list] = [] production_companies: Optional[list] = Field(default_factory=list)
# 出品国 # 出品国
production_countries: Optional[list] = [] production_countries: Optional[list] = Field(default_factory=list)
# 语种 # 语种
spoken_languages: Optional[list] = [] spoken_languages: Optional[list] = Field(default_factory=list)
# 状态 # 状态
status: Optional[str] = None status: Optional[str] = None
# 标签 # 标签
tagline: Optional[str] = None tagline: Optional[str] = None
# 风格ID # 风格ID
genre_ids: Optional[list] = [] genre_ids: Optional[list] = Field(default_factory=list)
# 评价数量 # 评价数量
vote_count: Optional[int] = 0 vote_count: Optional[int] = 0
# 流行度 # 流行度
@@ -161,7 +161,7 @@ class MediaInfo(BaseModel):
# 时长 # 时长
runtime: Optional[int] = None runtime: Optional[int] = None
# 下一集 # 下一集
next_episode_to_air: Optional[dict] = {} next_episode_to_air: Optional[dict] = Field(default_factory=dict)
class TorrentInfo(BaseModel): class TorrentInfo(BaseModel):
@@ -213,7 +213,7 @@ class TorrentInfo(BaseModel):
# HR # HR
hit_and_run: Optional[bool] = False hit_and_run: Optional[bool] = False
# 种子标签 # 种子标签
labels: Optional[list] = [] labels: Optional[list] = Field(default_factory=list)
# 种子优先级 # 种子优先级
pri_order: Optional[int] = 0 pri_order: Optional[int] = 0
# 促销 # 促销
@@ -245,13 +245,13 @@ class MediaPerson(BaseModel):
type: Optional[Union[str, int]] = 1 type: Optional[Union[str, int]] = 1
name: Optional[str] = None name: Optional[str] = None
character: Optional[str] = None character: Optional[str] = None
images: Optional[dict] = {} images: Optional[dict] = Field(default_factory=dict)
# themoviedb # themoviedb
profile_path: Optional[str] = None profile_path: Optional[str] = None
gender: Optional[Union[str, int]] = None gender: Optional[Union[str, int]] = None
original_name: Optional[str] = None original_name: Optional[str] = None
credit_id: Optional[str] = None credit_id: Optional[str] = None
also_known_as: Optional[list] = [] also_known_as: Optional[list] = Field(default_factory=list)
birthday: Optional[str] = None birthday: Optional[str] = None
deathday: Optional[str] = None deathday: Optional[str] = None
imdb_id: Optional[str] = None imdb_id: Optional[str] = None
@@ -260,11 +260,11 @@ class MediaPerson(BaseModel):
popularity: Optional[float] = None popularity: Optional[float] = None
biography: Optional[str] = None biography: Optional[str] = None
# douban # douban
roles: Optional[list] = [] roles: Optional[list] = Field(default_factory=list)
title: Optional[str] = None title: Optional[str] = None
url: Optional[str] = None url: Optional[str] = None
avatar: Optional[Union[str, dict]] = None avatar: Optional[Union[str, dict]] = None
latin_name: Optional[str] = None latin_name: Optional[str] = None
# bangumi # bangumi
career: Optional[list] = [] career: Optional[list] = Field(default_factory=list)
relation: Optional[str] = None relation: Optional[str] = None
+3 -3
View File
@@ -1,6 +1,6 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel, Field
class FileItem(BaseModel): class FileItem(BaseModel):
@@ -21,7 +21,7 @@ class FileItem(BaseModel):
# 修改时间 # 修改时间
modify_time: Optional[float] = None modify_time: Optional[float] = None
# 子节点 # 子节点
children: Optional[list] = [] children: Optional[list] = Field(default_factory=list)
# ID # ID
fileid: Optional[str] = None fileid: Optional[str] = None
# 父ID # 父ID
@@ -45,4 +45,4 @@ class StorageUsage(BaseModel):
class StorageTransType(BaseModel): class StorageTransType(BaseModel):
# 传输类型 # 传输类型
transtype: Optional[dict] = {} transtype: Optional[dict] = Field(default_factory=dict)
+5 -5
View File
@@ -1,7 +1,7 @@
from pathlib import Path from pathlib import Path
from typing import Optional, Dict, Union, List, Any from typing import Optional, Dict, Union, List, Any
from pydantic import BaseModel from pydantic import BaseModel, Field
from app.schemas.types import MediaType from app.schemas.types import MediaType
@@ -13,7 +13,7 @@ class ExistMediaInfo(BaseModel):
# 类型 电影、电视剧 # 类型 电影、电视剧
type: Optional[MediaType] type: Optional[MediaType]
# 季 # 季
seasons: Optional[Dict[int, list]] = {} seasons: Optional[Dict[int, list]] = Field(default_factory=dict)
# 媒体服务器类型:plex、jellyfin、emby # 媒体服务器类型:plex、jellyfin、emby
server_type: Optional[str] = None server_type: Optional[str] = None
# 媒体服务器名称 # 媒体服务器名称
@@ -29,7 +29,7 @@ class NotExistMediaInfo(BaseModel):
# 季 # 季
season: Optional[int] = None season: Optional[int] = None
# 剧集列表 # 剧集列表
episodes: Optional[list] = [] episodes: Optional[list] = Field(default_factory=list)
# 总集数 # 总集数
total_episode: Optional[int] = 0 total_episode: Optional[int] = 0
# 开始集 # 开始集
@@ -132,7 +132,7 @@ class MediaServerSeasonInfo(BaseModel):
媒体服务器媒体剧集信息 媒体服务器媒体剧集信息
""" """
season: Optional[int] = None season: Optional[int] = None
episodes: Optional[List[int]] = [] episodes: Optional[List[int]] = Field(default_factory=list)
class WebhookEventInfo(BaseModel): class WebhookEventInfo(BaseModel):
@@ -173,4 +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] = [] BackdropImageTags: Optional[list] = Field(default_factory=list)
+3 -3
View File
@@ -1,6 +1,6 @@
from typing import Optional, Union from typing import Optional, Union
from pydantic import BaseModel from pydantic import BaseModel, Field
from app.schemas.types import NotificationType, MessageChannel from app.schemas.types import NotificationType, MessageChannel
@@ -101,7 +101,7 @@ class Subscription(BaseModel):
客户端消息订阅 客户端消息订阅
""" """
endpoint: Optional[str] endpoint: Optional[str]
keys: Optional[dict] = {} keys: Optional[dict] = Field(default_factory=dict)
class SubscriptionMessage(BaseModel): class SubscriptionMessage(BaseModel):
@@ -112,4 +112,4 @@ class SubscriptionMessage(BaseModel):
body: Optional[str] body: Optional[str]
icon: Optional[str] icon: Optional[str]
url: Optional[str] url: Optional[str]
data: Optional[dict] = {} data: Optional[dict] = Field(default_factory=dict)
+5 -5
View File
@@ -1,6 +1,6 @@
from typing import Optional, List from typing import Optional, List
from pydantic import BaseModel from pydantic import BaseModel, Field
class Plugin(BaseModel): class Plugin(BaseModel):
@@ -43,7 +43,7 @@ class Plugin(BaseModel):
# 安装次数 # 安装次数
install_count: Optional[int] = 0 install_count: Optional[int] = 0
# 更新记录 # 更新记录
history: Optional[dict] = {} history: Optional[dict] = Field(default_factory=dict)
# 添加时间,值越小表示越靠后发布 # 添加时间,值越小表示越靠后发布
add_time: Optional[int] = 0 add_time: Optional[int] = 0
# 插件公钥 # 插件公钥
@@ -60,8 +60,8 @@ class PluginDashboard(Plugin):
# 仪表板key # 仪表板key
key: Optional[str] = None key: Optional[str] = None
# 全局配置 # 全局配置
attrs: Optional[dict] = {} attrs: Optional[dict] = Field(default_factory=dict)
# col列数 # col列数
cols: Optional[dict] = {} cols: Optional[dict] = Field(default_factory=dict)
# 页面元素 # 页面元素
elements: Optional[List[dict]] = [] elements: Optional[List[dict]] = Field(default_factory=list)
+2 -2
View File
@@ -1,6 +1,6 @@
from typing import Optional, Union from typing import Optional, Union
from pydantic import BaseModel from pydantic import BaseModel, Field
class Response(BaseModel): class Response(BaseModel):
@@ -9,4 +9,4 @@ class Response(BaseModel):
# 消息文本 # 消息文本
message: Optional[str] = None message: Optional[str] = None
# 数据 # 数据
data: Optional[Union[dict, list]] = {} data: Optional[Union[dict, list]] = Field(default_factory=dict)
+6 -6
View File
@@ -1,5 +1,5 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel, Field
class RadarrMovie(BaseModel): class RadarrMovie(BaseModel):
@@ -28,9 +28,9 @@ class SonarrSeries(BaseModel):
overview: Optional[str] overview: Optional[str]
network: Optional[str] network: Optional[str]
airTime: Optional[str] airTime: Optional[str]
images: list = [] images: list = Field(default_factory=list)
remotePoster: Optional[str] remotePoster: Optional[str]
seasons: list = [] seasons: list = Field(default_factory=list)
year: Optional[str] year: Optional[str]
path: Optional[str] path: Optional[str]
profileId: Optional[int] profileId: Optional[int]
@@ -49,9 +49,9 @@ class SonarrSeries(BaseModel):
cleanTitle: Optional[str] cleanTitle: Optional[str]
titleSlug: Optional[str] titleSlug: Optional[str]
certification: Optional[str] certification: Optional[str]
genres: list = [] genres: list = Field(default_factory=list)
tags: list = [] tags: list = Field(default_factory=list)
added: Optional[str] added: Optional[str]
ratings: Optional[dict] ratings: Optional[dict]
qualityProfileId: Optional[int] qualityProfileId: Optional[int]
statistics: dict = {} statistics: dict = Field(default_factory=dict)
+4 -4
View File
@@ -1,6 +1,6 @@
from typing import Optional, Any, Union, Dict from typing import Optional, Any, Union, Dict
from pydantic import BaseModel from pydantic import BaseModel, Field
class Site(BaseModel): class Site(BaseModel):
@@ -99,11 +99,11 @@ class SiteUserData(BaseModel):
# 下载体积 # 下载体积
leeching_size: Optional[int] = 0 leeching_size: Optional[int] = 0
# 做种人数, 种子大小 # 做种人数, 种子大小
seeding_info: Optional[list] = [] seeding_info: Optional[list] = Field(default_factory=list)
# 未读消息 # 未读消息
message_unread: Optional[int] = 0 message_unread: Optional[int] = 0
# 未读消息内容 # 未读消息内容
message_unread_contents: Optional[list] = [] message_unread_contents: Optional[list] = Field(default_factory=list)
# 错误信息 # 错误信息
err_msg: Optional[str] = None err_msg: Optional[str] = None
# 更新日期 # 更新日期
@@ -114,4 +114,4 @@ class SiteUserData(BaseModel):
class SiteAuth(BaseModel): class SiteAuth(BaseModel):
site: Optional[str] = None site: Optional[str] = None
params: Optional[Dict[str, Union[int, str]]] = {} params: Optional[Dict[str, Union[int, str]]] = Field(default_factory=dict)
+6 -6
View File
@@ -1,6 +1,6 @@
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
from pydantic import BaseModel from pydantic import BaseModel, Field
class Subscribe(BaseModel): class Subscribe(BaseModel):
@@ -53,7 +53,7 @@ class Subscribe(BaseModel):
# 订阅用户 # 订阅用户
username: Optional[str] = None username: Optional[str] = None
# 订阅站点 # 订阅站点
sites: Optional[List[int]] = [] sites: Optional[List[int]] = Field(default_factory=list)
# 下载器 # 下载器
downloader: Optional[str] = None downloader: Optional[str] = None
# 是否洗版 # 是否洗版
@@ -71,7 +71,7 @@ class Subscribe(BaseModel):
# 自定义媒体类别 # 自定义媒体类别
media_category: Optional[str] = None media_category: Optional[str] = None
# 过滤规则组 # 过滤规则组
filter_groups: Optional[List[str]] = [] filter_groups: Optional[List[str]] = Field(default_factory=list)
class Config: class Config:
orm_mode = True orm_mode = True
@@ -157,13 +157,13 @@ class SubscribeEpisodeInfo(BaseModel):
# 背景图 # 背景图
backdrop: Optional[str] = None backdrop: Optional[str] = None
# 下载文件信息 # 下载文件信息
download: Optional[List[SubscribeDownloadFileInfo]] = [] download: Optional[List[SubscribeDownloadFileInfo]] = Field(default_factory=list)
# 媒体库文件信息 # 媒体库文件信息
library: Optional[List[SubscribeLibraryFileInfo]] = [] library: Optional[List[SubscribeLibraryFileInfo]] = Field(default_factory=list)
class SubscrbieInfo(BaseModel): class SubscrbieInfo(BaseModel):
# 订阅信息 # 订阅信息
subscribe: Optional[Subscribe] = None subscribe: Optional[Subscribe] = None
# 集信息 {集号: {download: 文件路径,library: 文件路径, backdrop: url, title: 标题, description: 描述}} # 集信息 {集号: {download: 文件路径,library: 文件路径, backdrop: url, title: 标题, description: 描述}}
episodes: Optional[Dict[int, SubscribeEpisodeInfo]] = {} episodes: Optional[Dict[int, SubscribeEpisodeInfo]] = Field(default_factory=dict)
+7 -7
View File
@@ -1,7 +1,7 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional, Any from typing import Optional, Any
from pydantic import BaseModel from pydantic import BaseModel, Field
@dataclass @dataclass
@@ -30,11 +30,11 @@ class MediaServerConf(BaseModel):
# 类型 emby/jellyfin/plex # 类型 emby/jellyfin/plex
type: Optional[str] = None type: Optional[str] = None
# 配置 # 配置
config: Optional[dict] = {} config: Optional[dict] = Field(default_factory=dict)
# 是否启用 # 是否启用
enabled: Optional[bool] = False enabled: Optional[bool] = False
# 同步媒体体库列表 # 同步媒体体库列表
sync_libraries: Optional[list] = [] sync_libraries: Optional[list] = Field(default_factory=list)
class DownloaderConf(BaseModel): class DownloaderConf(BaseModel):
@@ -48,7 +48,7 @@ class DownloaderConf(BaseModel):
# 是否默认 # 是否默认
default: Optional[bool] = False default: Optional[bool] = False
# 配置 # 配置
config: Optional[dict] = {} config: Optional[dict] = Field(default_factory=dict)
# 是否启用 # 是否启用
enabled: Optional[bool] = False enabled: Optional[bool] = False
@@ -62,9 +62,9 @@ class NotificationConf(BaseModel):
# 类型 telegram/wechat/vocechat/synologychat/slack/webpush # 类型 telegram/wechat/vocechat/synologychat/slack/webpush
type: Optional[str] = None type: Optional[str] = None
# 配置 # 配置
config: Optional[dict] = {} config: Optional[dict] = Field(default_factory=dict)
# 场景开关 # 场景开关
switchs: Optional[list] = [] switchs: Optional[list] = Field(default_factory=list)
# 是否启用 # 是否启用
enabled: Optional[bool] = False enabled: Optional[bool] = False
@@ -88,7 +88,7 @@ class StorageConf(BaseModel):
# 名称 # 名称
name: Optional[str] = None name: Optional[str] = None
# 配置 # 配置
config: Optional[dict] = {} config: Optional[dict] = Field(default_factory=dict)
class TransferDirectoryConf(BaseModel): class TransferDirectoryConf(BaseModel):
+3 -3
View File
@@ -1,6 +1,6 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel, Field
class TmdbSeason(BaseModel): class TmdbSeason(BaseModel):
@@ -28,5 +28,5 @@ class TmdbEpisode(BaseModel):
season_number: Optional[int] = None season_number: Optional[int] = None
still_path: Optional[str] = None still_path: Optional[str] = None
vote_average: Optional[float] = None vote_average: Optional[float] = None
crew: Optional[list] = [] crew: Optional[list] = Field(default_factory=list)
guest_stars: Optional[list] = [] guest_stars: Optional[list] = Field(default_factory=list)
+15 -6
View File
@@ -1,8 +1,9 @@
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel, Field
from app.core.meta import MetaBase
from app.schemas.file import FileItem from app.schemas.file import FileItem
@@ -34,15 +35,23 @@ class DownloadingTorrent(BaseModel):
state: Optional[str] = 'downloading' state: Optional[str] = 'downloading'
upspeed: Optional[str] = None upspeed: Optional[str] = None
dlspeed: Optional[str] = None dlspeed: Optional[str] = None
media: Optional[dict] = {} media: Optional[dict] = Field(default_factory=dict)
userid: Optional[str] = None userid: Optional[str] = None
username: Optional[str] = None username: Optional[str] = None
left_time: Optional[str] = None left_time: Optional[str] = None
class TransferTask(BaseModel):
"""
文件整理任务
"""
fileitem: Optional[FileItem] = None
meta: Optional[MetaBase] = None
class TransferInfo(BaseModel): class TransferInfo(BaseModel):
""" """
文件转移结果信息 文件整理结果信息
""" """
# 是否成功标志 # 是否成功标志
success: bool = True success: bool = True
@@ -57,13 +66,13 @@ class TransferInfo(BaseModel):
# 处理文件数 # 处理文件数
file_count: Optional[int] = 0 file_count: Optional[int] = 0
# 处理文件清单 # 处理文件清单
file_list: Optional[list] = [] file_list: Optional[list] = Field(default_factory=list)
# 目标文件清单 # 目标文件清单
file_list_new: Optional[list] = [] file_list_new: Optional[list] = Field(default_factory=list)
# 总文件大小 # 总文件大小
total_size: Optional[float] = 0 total_size: Optional[float] = 0
# 失败清单 # 失败清单
fail_list: Optional[list] = [] fail_list: Optional[list] = Field(default_factory=list)
# 错误信息 # 错误信息
message: Optional[str] = None message: Optional[str] = None
# 是否需要刮削 # 是否需要刮削
+5 -5
View File
@@ -1,6 +1,6 @@
from typing import Optional from typing import Optional
from pydantic import BaseModel from pydantic import BaseModel, Field
# Shared properties # Shared properties
@@ -18,9 +18,9 @@ class UserBase(BaseModel):
# 是否开启二次验证 # 是否开启二次验证
is_otp: Optional[bool] = False is_otp: Optional[bool] = False
# 权限 # 权限
permissions: Optional[dict] = {} permissions: Optional[dict] = Field(default_factory=dict)
# 个性化设置 # 个性化设置
settings: Optional[dict] = {} settings: Optional[dict] = Field(default_factory=dict)
class Config: class Config:
orm_mode = True orm_mode = True
@@ -31,7 +31,7 @@ class UserCreate(UserBase):
name: str name: str
email: Optional[str] = None email: Optional[str] = None
password: Optional[str] = None password: Optional[str] = None
settings: Optional[dict] = {} settings: Optional[dict] = Field(default_factory=dict)
# Properties to receive via API on update # Properties to receive via API on update
@@ -40,7 +40,7 @@ class UserUpdate(UserBase):
name: str name: str
email: Optional[str] = None email: Optional[str] = None
password: Optional[str] = None password: Optional[str] = None
settings: Optional[dict] = {} settings: Optional[dict] = Field(default_factory=dict)
class UserInDBBase(UserBase): class UserInDBBase(UserBase):