refactor(db): convert suitable string fields to JSON type

This commit is contained in:
InfinityPacer
2024-09-30 16:16:29 +08:00
parent d69041f049
commit d3186cd742
23 changed files with 52 additions and 70 deletions
+2 -2
View File
@@ -86,13 +86,13 @@ def delete_transfer_history(history_in: schemas.TransferHistory,
return schemas.Response(success=False, msg="记录不存在") return schemas.Response(success=False, msg="记录不存在")
# 册除媒体库文件 # 册除媒体库文件
if deletedest and history.dest_fileitem: if deletedest and history.dest_fileitem:
dest_fileitem = schemas.FileItem(**json.loads(history.dest_fileitem)) dest_fileitem = schemas.FileItem(**history.dest_fileitem)
state = StorageChain().delete_file(dest_fileitem) state = StorageChain().delete_file(dest_fileitem)
if not state: if not state:
return schemas.Response(success=False, msg=f"{dest_fileitem.path}删除失败") return schemas.Response(success=False, msg=f"{dest_fileitem.path}删除失败")
# 删除源文件 # 删除源文件
if deletesrc and history.dest_fileitem: if deletesrc and history.dest_fileitem:
dest_fileitem = schemas.FileItem(**json.loads(history.dest_fileitem)) dest_fileitem = schemas.FileItem(**history.dest_fileitem)
state = StorageChain().delete_file(dest_fileitem) state = StorageChain().delete_file(dest_fileitem)
if not state: if not state:
return schemas.Response(success=False, msg=f"{dest_fileitem.path}删除失败") return schemas.Response(success=False, msg=f"{dest_fileitem.path}删除失败")
+1 -1
View File
@@ -78,7 +78,7 @@ async def login_access_token(
user_name=user.name, user_name=user.name,
avatar=user.avatar, avatar=user.avatar,
level=level, level=level,
permissions=json.loads(user.permissions or '{}') permissions=user.permissions or {}
) )
+3 -3
View File
@@ -89,14 +89,14 @@ def manual_transfer(transer_item: ManualTransferItem,
force = True force = True
if history.status and ("move" in history.mode): if history.status and ("move" in history.mode):
# 重新整理成功的转移,则使用成功的 dest 做 in_path # 重新整理成功的转移,则使用成功的 dest 做 in_path
src_fileitem = FileItem(**json.loads(history.dest_fileitem)) src_fileitem = FileItem(**history.dest_fileitem)
else: else:
# 源路径 # 源路径
src_fileitem = FileItem(**json.loads(history.src_fileitem)) src_fileitem = FileItem(**history.src_fileitem)
# 目的路径 # 目的路径
if history.dest_fileitem: if history.dest_fileitem:
# 删除旧的已整理文件 # 删除旧的已整理文件
dest_fileitem = FileItem(**json.loads(history.dest_fileitem)) dest_fileitem = FileItem(**history.dest_fileitem)
StorageChain().delete_file(dest_fileitem) StorageChain().delete_file(dest_fileitem)
# 从历史数据获取信息 # 从历史数据获取信息
+1 -1
View File
@@ -151,7 +151,7 @@ class MediaServerChain(ChainBase):
seasoninfo[episode.season] = episode.episodes seasoninfo[episode.season] = episode.episodes
# 插入数据 # 插入数据
item_dict = item.dict() item_dict = item.dict()
item_dict["seasoninfo"] = json.dumps(seasoninfo) item_dict["seasoninfo"] = seasoninfo
item_dict["item_type"] = item_type item_dict["item_type"] = item_type
self.dboper.add(**item_dict) self.dboper.add(**item_dict)
logger.info(f"{server_name} 媒体库 {library.name} 同步完成,共同步数量:{library_count}") logger.info(f"{server_name} 媒体库 {library.name} 同步完成,共同步数量:{library_count}")
+1 -1
View File
@@ -501,7 +501,7 @@ class MessageChain(ChainBase):
# 获取已下载剧集 # 获取已下载剧集
downloaded = [download.meta_info.begin_episode for download in downloads downloaded = [download.meta_info.begin_episode for download in downloads
if download.meta_info.begin_episode] if download.meta_info.begin_episode]
note = json.dumps(downloaded) note = downloaded
else: else:
note = None note = None
# 添加订阅,状态为R # 添加订阅,状态为R
+7 -17
View File
@@ -480,7 +480,7 @@ class SubscribeChain(ChainBase):
return default_sites return default_sites
try: try:
# 尝试解析订阅中的站点数据 # 尝试解析订阅中的站点数据
user_sites = json.loads(subscribe.sites) user_sites = subscribe.sites
# 计算 user_sites 和 default_sites 的交集 # 计算 user_sites 和 default_sites 的交集
intersection_sites = [site for site in user_sites if site in default_sites] intersection_sites = [site for site in user_sites if site in default_sites]
# 如果交集与原始订阅不一致,更新数据库 # 如果交集与原始订阅不一致,更新数据库
@@ -542,7 +542,7 @@ class SubscribeChain(ChainBase):
domains = [] domains = []
if subscribe.sites: if subscribe.sites:
try: try:
siteids = json.loads(subscribe.sites) siteids = subscribe.sites
if siteids: if siteids:
domains = self.siteoper.get_domains_by_ids(siteids) domains = self.siteoper.get_domains_by_ids(siteids)
except JSONDecodeError: except JSONDecodeError:
@@ -812,10 +812,7 @@ class SubscribeChain(ChainBase):
return return
note = [] note = []
if subscribe.note: if subscribe.note:
try: note = subscribe.note or []
note = json.loads(subscribe.note)
except JSONDecodeError:
note = []
for context in downloads: for context in downloads:
meta = context.meta_info meta = context.meta_info
mediainfo = context.media_info mediainfo = context.media_info
@@ -846,13 +843,9 @@ class SubscribeChain(ChainBase):
return [] return []
if subscribe.type != MediaType.TV.value: if subscribe.type != MediaType.TV.value:
return [] return []
try: episodes = subscribe.note or []
episodes = json.loads(subscribe.note) logger.info(f'订阅 {subscribe.name}{subscribe.season}季 已下载集数:{episodes}')
logger.info(f'订阅 {subscribe.name}{subscribe.season}季 已下载集数:{episodes}') return episodes
return episodes
except JSONDecodeError:
logger.warn(f'订阅 {subscribe.name} note字段解析失败')
return []
def __update_lack_episodes(self, lefts: Dict[Union[int, str], Dict[int, NotExistMediaInfo]], def __update_lack_episodes(self, lefts: Dict[Union[int, str], Dict[int, NotExistMediaInfo]],
subscribe: Subscribe, subscribe: Subscribe,
@@ -1110,10 +1103,7 @@ class SubscribeChain(ChainBase):
for subscribe in self.subscribeoper.list(): for subscribe in self.subscribeoper.list():
if not subscribe.sites: if not subscribe.sites:
continue continue
try: sites = subscribe.sites or []
sites = json.loads(subscribe.sites)
except JSONDecodeError:
sites = []
if site_id not in sites: if site_id not in sites:
continue continue
sites.remove(site_id) sites.remove(site_id)
+2 -2
View File
@@ -603,13 +603,13 @@ class TransferChain(ChainBase):
# 删除旧的已整理文件 # 删除旧的已整理文件
if history.dest_fileitem: if history.dest_fileitem:
# 解析目标文件对象 # 解析目标文件对象
dest_fileitem = FileItem(**json.loads(history.dest_fileitem)) dest_fileitem = FileItem(**history.dest_fileitem)
self.storagechain.delete_file(dest_fileitem) self.storagechain.delete_file(dest_fileitem)
# 强制整理 # 强制整理
if history.src_fileitem: if history.src_fileitem:
# 解析源文件对象 # 解析源文件对象
fileitem = FileItem(**json.loads(history.src_fileitem)) fileitem = FileItem(**history.src_fileitem)
state, errmsg = self.__do_transfer(fileitem=fileitem, state, errmsg = self.__do_transfer(fileitem=fileitem,
mediainfo=mediainfo, mediainfo=mediainfo,
download_hash=history.download_hash, download_hash=history.download_hash,
+1 -1
View File
@@ -54,7 +54,7 @@ class MediaServerOper(DbOper):
# 判断季是否存在 # 判断季是否存在
if not item.seasoninfo: if not item.seasoninfo:
return None return None
seasoninfo = json.loads(item.seasoninfo) or {} seasoninfo = item.seasoninfo or {}
if kwargs.get("season") not in seasoninfo.keys(): if kwargs.get("season") not in seasoninfo.keys():
return None return None
return item return item
+1 -1
View File
@@ -52,7 +52,7 @@ class MessageOper(DbOper):
"userid": userid, "userid": userid,
"action": action, "action": action,
"reg_time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "reg_time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"note": note "note": note or {}
}) })
# 从kwargs中去掉Message中没有的字段 # 从kwargs中去掉Message中没有的字段
+2 -2
View File
@@ -1,6 +1,6 @@
import time import time
from sqlalchemy import Column, Integer, String, Sequence from sqlalchemy import Column, Integer, String, Sequence, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, db_update, Base from app.db import db_query, db_update, Base
@@ -46,7 +46,7 @@ class DownloadHistory(Base):
# 创建时间 # 创建时间
date = Column(String) date = Column(String)
# 附加信息 # 附加信息
note = Column(String) note = Column(JSON)
@staticmethod @staticmethod
@db_query @db_query
+3 -3
View File
@@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from sqlalchemy import Column, Integer, String, Sequence from sqlalchemy import Column, Integer, String, Sequence, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, db_update, Base from app.db import db_query, db_update, Base
@@ -35,9 +35,9 @@ class MediaServerItem(Base):
# 路径 # 路径
path = Column(String) path = Column(String)
# 季集 # 季集
seasoninfo = Column(String) seasoninfo = Column(JSON, default=dict)
# 备注 # 备注
note = Column(String) note = Column(JSON)
# 同步时间 # 同步时间
lst_mod_date = Column(String, default=datetime.now().strftime("%Y-%m-%d %H:%M:%S")) lst_mod_date = Column(String, default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
+2 -2
View File
@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, Sequence from sqlalchemy import Column, Integer, String, Sequence, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, Base from app.db import db_query, Base
@@ -30,7 +30,7 @@ class Message(Base):
# 消息方向:0-接收息,1-发送消息 # 消息方向:0-接收息,1-发送消息
action = Column(Integer) action = Column(Integer)
# 附件json # 附件json
note = Column(String) note = Column(JSON)
@staticmethod @staticmethod
@db_query @db_query
+2 -2
View File
@@ -1,6 +1,6 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Boolean, Column, Integer, String, Sequence from sqlalchemy import Boolean, Column, Integer, String, Sequence, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, db_update, Base from app.db import db_query, db_update, Base
@@ -38,7 +38,7 @@ class Site(Base):
# 是否公开站点 # 是否公开站点
public = Column(Integer) public = Column(Integer)
# 附加信息 # 附加信息
note = Column(String) note = Column(JSON)
# 流控单位周期 # 流控单位周期
limit_interval = Column(Integer, default=0) limit_interval = Column(Integer, default=0)
# 流控次数 # 流控次数
+2 -2
View File
@@ -40,11 +40,11 @@ class SiteUserData(Base):
# 下载体积 # 下载体积
leeching_size = Column(Float, default=0) leeching_size = Column(Float, default=0)
# 做种人数, 种子大小 JSON # 做种人数, 种子大小 JSON
seeding_info = Column(JSON) seeding_info = Column(JSON, default=dict)
# 未读消息 # 未读消息
message_unread = Column(Integer, default=0) message_unread = Column(Integer, default=0)
# 未读消息内容 JSON # 未读消息内容 JSON
message_unread_contents = Column(JSON) message_unread_contents = Column(JSON, default=list)
# 错误信息 # 错误信息
err_msg = Column(String) err_msg = Column(String)
# 更新日期 # 更新日期
+3 -3
View File
@@ -1,6 +1,6 @@
import time import time
from sqlalchemy import Column, Integer, String, Sequence, Float from sqlalchemy import Column, Integer, String, Sequence, Float, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, db_update, Base from app.db import db_query, db_update, Base
@@ -53,7 +53,7 @@ class Subscribe(Base):
# 缺失集数 # 缺失集数
lack_episode = Column(Integer) lack_episode = Column(Integer)
# 附加信息 # 附加信息
note = Column(String) note = Column(JSON)
# 状态:N-新建, R-订阅中 # 状态:N-新建, R-订阅中
state = Column(String, nullable=False, index=True, default='N') state = Column(String, nullable=False, index=True, default='N')
# 最后更新时间 # 最后更新时间
@@ -63,7 +63,7 @@ class Subscribe(Base):
# 订阅用户 # 订阅用户
username = Column(String) username = Column(String)
# 订阅站点 # 订阅站点
sites = Column(String) sites = Column(JSON, default=list)
# 是否洗版 # 是否洗版
best_version = Column(Integer, default=0) best_version = Column(Integer, default=0)
# 当前优先级 # 当前优先级
+1 -1
View File
@@ -12,7 +12,7 @@ class SystemConfig(Base):
# 主键 # 主键
key = Column(String, index=True) key = Column(String, index=True)
# 值 # 值
value = Column(JSON, nullable=True) value = Column(JSON)
@staticmethod @staticmethod
@db_query @db_query
+4 -4
View File
@@ -1,6 +1,6 @@
import time import time
from sqlalchemy import Column, Integer, String, Sequence, Boolean, func, or_ from sqlalchemy import Column, Integer, String, Sequence, Boolean, func, or_, JSON
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.db import db_query, db_update, Base from app.db import db_query, db_update, Base
@@ -16,13 +16,13 @@ class TransferHistory(Base):
# 源存储 # 源存储
src_storage = Column(String) src_storage = Column(String)
# 源文件项 # 源文件项
src_fileitem = Column(String) src_fileitem = Column(JSON, default=dict)
# 目标路径 # 目标路径
dest = Column(String) dest = Column(String)
# 目标存储 # 目标存储
dest_storage = Column(String) dest_storage = Column(String)
# 目标文件项 # 目标文件项
dest_fileitem = Column(String) dest_fileitem = Column(JSON, default=dict)
# 转移模式 move/copy/link... # 转移模式 move/copy/link...
mode = Column(String) mode = Column(String)
# 类型 电影/电视剧 # 类型 电影/电视剧
@@ -52,7 +52,7 @@ class TransferHistory(Base):
# 时间 # 时间
date = Column(String, index=True) date = Column(String, index=True)
# 文件清单,以JSON存储 # 文件清单,以JSON存储
files = Column(String) files = Column(JSON, default=list)
@staticmethod @staticmethod
@db_query @db_query
+2 -2
View File
@@ -31,9 +31,9 @@ class User(Base):
# otp秘钥 # otp秘钥
otp_secret = Column(String, default=None) otp_secret = Column(String, default=None)
# 用户权限 json # 用户权限 json
permissions = Column(JSON, default='') permissions = Column(JSON, default=dict)
# 用户个性化设置 json # 用户个性化设置 json
settings = Column(JSON, default='') settings = Column(JSON, default=dict)
@staticmethod @staticmethod
@db_query @db_query
+1 -1
View File
@@ -14,7 +14,7 @@ class UserConfig(Base):
# 配置键 # 配置键
key = Column(String) key = Column(String)
# 值 # 值
value = Column(JSON, nullable=True) value = Column(JSON)
__table_args__ = ( __table_args__ = (
# 用户名和配置键联合唯一 # 用户名和配置键联合唯一
+1 -1
View File
@@ -202,7 +202,7 @@ class SiteOper(DbOper):
seconds=seconds or 1, seconds=seconds or 1,
lst_state=0, lst_state=0,
lst_mod_date=lst_date, lst_mod_date=lst_date,
note=json.dumps(note) note=note
).create(self._db) ).create(self._db)
def fail(self, domain: str): def fail(self, domain: str):
+7 -7
View File
@@ -128,10 +128,10 @@ class TransferHistoryOper(DbOper):
self.add_force( self.add_force(
src=fileitem.path, src=fileitem.path,
src_storage=fileitem.storage, src_storage=fileitem.storage,
src_fileitem=json.dumps(fileitem.dict()), src_fileitem=fileitem.dict(),
dest=transferinfo.target_item.path if transferinfo.target_item else None, dest=transferinfo.target_item.path if transferinfo.target_item else None,
dest_storage=transferinfo.target_item.storage if transferinfo.target_item else None, dest_storage=transferinfo.target_item.storage if transferinfo.target_item else None,
dest_fileitem=json.dumps(transferinfo.target_item.dict()) if transferinfo.target_item else None, dest_fileitem=transferinfo.target_item.dict() if transferinfo.target_item else None,
mode=mode, mode=mode,
type=mediainfo.type.value, type=mediainfo.type.value,
category=mediainfo.category, category=mediainfo.category,
@@ -146,7 +146,7 @@ class TransferHistoryOper(DbOper):
image=mediainfo.get_poster_image(), image=mediainfo.get_poster_image(),
download_hash=download_hash, download_hash=download_hash,
status=1, status=1,
files=json.dumps(transferinfo.file_list) files=transferinfo.file_list
) )
def add_fail(self, fileitem: FileItem, mode: str, meta: MetaBase, mediainfo: MediaInfo = None, def add_fail(self, fileitem: FileItem, mode: str, meta: MetaBase, mediainfo: MediaInfo = None,
@@ -158,10 +158,10 @@ class TransferHistoryOper(DbOper):
his = self.add_force( his = self.add_force(
src=fileitem.path, src=fileitem.path,
src_storage=fileitem.storage, src_storage=fileitem.storage,
src_fileitem=json.dumps(fileitem.dict()), src_fileitem=fileitem.dict(),
dest=transferinfo.target_item.path if transferinfo.target_item else None, dest=transferinfo.target_item.path if transferinfo.target_item else None,
dest_storage=transferinfo.target_item.storage if transferinfo.target_item else None, dest_storage=transferinfo.target_item.storage if transferinfo.target_item else None,
dest_fileitem=json.dumps(transferinfo.target_item.dict()) if transferinfo.target_item else None, dest_fileitem=transferinfo.target_item.dict() if transferinfo.target_item else None,
mode=mode, mode=mode,
type=mediainfo.type.value, type=mediainfo.type.value,
category=mediainfo.category, category=mediainfo.category,
@@ -177,7 +177,7 @@ class TransferHistoryOper(DbOper):
download_hash=download_hash, download_hash=download_hash,
status=0, status=0,
errmsg=transferinfo.message or '未知错误', errmsg=transferinfo.message or '未知错误',
files=json.dumps(transferinfo.file_list) files=transferinfo.file_list
) )
else: else:
his = self.add_force( his = self.add_force(
@@ -185,7 +185,7 @@ class TransferHistoryOper(DbOper):
year=meta.year, year=meta.year,
src=fileitem.path, src=fileitem.path,
src_storage=fileitem.storage, src_storage=fileitem.storage,
src_fileitem=json.dumps(fileitem.dict()), src_fileitem=fileitem.dict(),
mode=mode, mode=mode,
seasons=meta.season, seasons=meta.season,
episodes=meta.episode, episodes=meta.episode,
+2 -10
View File
@@ -80,10 +80,7 @@ class UserOper(DbOper):
""" """
user = User.get_by_name(self._db, name) user = User.get_by_name(self._db, name)
if user: if user:
try: return user.permissions or {}
return json.loads(user.permissions)
except json.JSONDecodeError:
return {}
return {} return {}
def get_settings(self, name: str) -> Optional[dict]: def get_settings(self, name: str) -> Optional[dict]:
@@ -92,12 +89,7 @@ class UserOper(DbOper):
""" """
user = User.get_by_name(self._db, name) user = User.get_by_name(self._db, name)
if user: if user:
try: return user.settings or {}
if user.settings:
return json.loads(user.settings)
return {}
except json.JSONDecodeError:
return {}
return None return None
def get_setting(self, name: str, key: str) -> Optional[str]: def get_setting(self, name: str, key: str) -> Optional[str]:
+1 -1
View File
@@ -116,7 +116,7 @@ class MediaServerItem(BaseModel):
# 季集 # 季集
seasoninfo: Optional[Dict[int, list]] = None seasoninfo: Optional[Dict[int, list]] = None
# 备注 # 备注
note: Optional[str] = None note: Optional[dict] = None
# 同步时间 # 同步时间
lst_mod_date: Optional[str] = None lst_mod_date: Optional[str] = None
user_state: Optional[MediaServerItemUserState] = None user_state: Optional[MediaServerItemUserState] = None