refactor(helper): 将LLMHelper StorageHelper的相关方法改为静态方法,移除实例调用

This commit is contained in:
Attente
2026-03-14 10:29:37 +08:00
parent b8fc20b981
commit 9f381b3c73
6 changed files with 61 additions and 68 deletions

View File

@@ -317,7 +317,7 @@ async def get_llm_models(provider: str, api_key: str, base_url: Optional[str] =
获取LLM模型列表 获取LLM模型列表
""" """
try: try:
models = LLMHelper().get_models(provider, api_key, base_url) models = LLMHelper.get_models(provider, api_key, base_url)
return schemas.Response(success=True, data=models) return schemas.Response(success=True, data=models)
except Exception as e: except Exception as e:
return schemas.Response(success=False, message=str(e)) return schemas.Response(success=False, message=str(e))

View File

@@ -71,13 +71,14 @@ class LLMHelper:
openai_proxy=settings.PROXY_HOST openai_proxy=settings.PROXY_HOST
) )
def get_models(self, provider: str, api_key: str, base_url: str = None) -> List[str]: @staticmethod
def get_models(provider: str, api_key: str, base_url: str = None) -> List[str]:
"""获取模型列表""" """获取模型列表"""
logger.info(f"获取 {provider} 模型列表...") logger.info(f"获取 {provider} 模型列表...")
if provider == "google": if provider == "google":
return self._get_google_models(api_key) return LLMHelper._get_google_models(api_key)
else: else:
return self._get_openai_compatible_models(provider, api_key, base_url) return LLMHelper._get_openai_compatible_models(provider, api_key, base_url)
@staticmethod @staticmethod
def _get_google_models(api_key: str) -> List[str]: def _get_google_models(api_key: str) -> List[str]:

View File

@@ -20,21 +20,23 @@ class StorageHelper:
return [] return []
return [schemas.StorageConf(**s) for s in storage_confs] return [schemas.StorageConf(**s) for s in storage_confs]
def get_storage(self, storage: str) -> Optional[schemas.StorageConf]: @staticmethod
def get_storage(storage: str) -> Optional[schemas.StorageConf]:
""" """
获取指定存储配置 获取指定存储配置
""" """
storagies = self.get_storagies() storagies = StorageHelper.get_storagies()
for s in storagies: for s in storagies:
if s.type == storage: if s.type == storage:
return s return s
return None return None
def set_storage(self, storage: str, conf: dict): @staticmethod
def set_storage(storage: str, conf: dict):
""" """
设置存储配置 设置存储配置
""" """
storagies = self.get_storagies() storagies = StorageHelper.get_storagies()
if not storagies: if not storagies:
storagies = [ storagies = [
schemas.StorageConf( schemas.StorageConf(
@@ -49,11 +51,12 @@ class StorageHelper:
break break
SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies]) SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies])
def add_storage(self, storage: str, name: str, conf: dict): @staticmethod
def add_storage(storage: str, name: str, conf: dict):
""" """
添加存储配置 添加存储配置
""" """
storagies = self.get_storagies() storagies = StorageHelper.get_storagies()
if not storagies: if not storagies:
storagies = [ storagies = [
schemas.StorageConf( schemas.StorageConf(
@@ -70,11 +73,12 @@ class StorageHelper:
)) ))
SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies]) SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies])
def reset_storage(self, storage: str): @staticmethod
def reset_storage(storage: str):
""" """
重置存储配置 重置存储配置
""" """
storagies = self.get_storagies() storagies = StorageHelper.get_storagies()
for s in storagies: for s in storagies:
if s.type == storage: if s.type == storage:
s.config = {} s.config = {}

View File

@@ -7,7 +7,6 @@ from app.core.context import MediaInfo
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.core.metainfo import MetaInfo from app.core.metainfo import MetaInfo
from app.helper.directory import DirectoryHelper from app.helper.directory import DirectoryHelper
from app.helper.message import MessageHelper
from app.helper.module import ModuleHelper from app.helper.module import ModuleHelper
from app.log import logger from app.log import logger
from app.modules import _ModuleBase from app.modules import _ModuleBase
@@ -26,11 +25,6 @@ class FileManagerModule(_ModuleBase):
_storage_schemas = [] _storage_schemas = []
_support_storages = [] _support_storages = []
def __init__(self):
super().__init__()
self.directoryhelper = DirectoryHelper()
self.messagehelper = MessageHelper()
def init_module(self) -> None: def init_module(self) -> None:
# 加载模块 # 加载模块
self._storage_schemas = ModuleHelper.load('app.modules.filemanager.storages', self._storage_schemas = ModuleHelper.load('app.modules.filemanager.storages',
@@ -71,7 +65,7 @@ class FileManagerModule(_ModuleBase):
测试模块连接性 测试模块连接性
""" """
# 检查目录 # 检查目录
dirs = self.directoryhelper.get_dirs() dirs = DirectoryHelper.get_dirs()
if not dirs: if not dirs:
return False, "未设置任何目录" return False, "未设置任何目录"
for d in dirs: for d in dirs:
@@ -138,7 +132,6 @@ class FileManagerModule(_ModuleBase):
:param mediainfo: 媒体信息 :param mediainfo: 媒体信息
:return: 重命名后的名称(含目录) :return: 重命名后的名称(含目录)
""" """
handler = TransHandler()
# 重命名格式 # 重命名格式
rename_format = settings.RENAME_FORMAT(mediainfo.type) rename_format = settings.RENAME_FORMAT(mediainfo.type)
# 获取集信息 # 获取集信息
@@ -158,9 +151,9 @@ class FileManagerModule(_ModuleBase):
episode_group=mediainfo.episode_group, episode_group=mediainfo.episode_group,
) )
# 获取重命名后的名称 # 获取重命名后的名称
path = handler.get_rename_path( path = TransHandler.get_rename_path(
template_string=rename_format, template_string=rename_format,
rename_dict=handler.get_naming_dict(meta=meta, rename_dict=TransHandler.get_naming_dict(meta=meta,
mediainfo=mediainfo, mediainfo=mediainfo,
episodes_info=episodes_info, episodes_info=episodes_info,
file_ext=Path(meta.title).suffix) file_ext=Path(meta.title).suffix)
@@ -424,7 +417,6 @@ class FileManagerModule(_ModuleBase):
:param target_oper: 目标存储操作对象 :param target_oper: 目标存储操作对象
:return: {path, target_path, message} :return: {path, target_path, message}
""" """
handler = TransHandler()
# 检查目录路径 # 检查目录路径
if fileitem.storage == "local" and not Path(fileitem.path).exists(): if fileitem.storage == "local" and not Path(fileitem.path).exists():
return TransferInfo(success=False, return TransferInfo(success=False,
@@ -459,7 +451,7 @@ class FileManagerModule(_ModuleBase):
# 是否需要刮削 # 是否需要刮削
need_scrape = target_directory.scraping if scrape is None else scrape need_scrape = target_directory.scraping if scrape is None else scrape
# 拼装媒体库一、二级子目录 # 拼装媒体库一、二级子目录
target_path = handler.get_dest_dir(mediainfo=mediainfo, target_dir=target_directory, target_path = TransHandler.get_dest_dir(mediainfo=mediainfo, target_dir=target_directory,
need_type_folder=library_type_folder, need_type_folder=library_type_folder,
need_category_folder=library_category_folder) need_category_folder=library_category_folder)
elif target_path: elif target_path:
@@ -468,7 +460,7 @@ class FileManagerModule(_ModuleBase):
need_notify = False need_notify = False
overwrite_mode = "never" overwrite_mode = "never"
# 手动整理的场景,有自定义目标路径 # 手动整理的场景,有自定义目标路径
target_path = handler.get_dest_path(mediainfo=mediainfo, target_path=target_path, target_path = TransHandler.get_dest_path(mediainfo=mediainfo, target_path=target_path,
need_type_folder=library_type_folder, need_type_folder=library_type_folder,
need_category_folder=library_category_folder) need_category_folder=library_category_folder)
else: else:
@@ -511,7 +503,7 @@ class FileManagerModule(_ModuleBase):
# 整理 # 整理
logger.info(f"获取整理目标路径:【{target_storage}{target_path}") logger.info(f"获取整理目标路径:【{target_storage}{target_path}")
return handler.transfer_media(fileitem=fileitem, return TransHandler.transfer_media(fileitem=fileitem,
in_meta=meta, in_meta=meta,
mediainfo=mediainfo, mediainfo=mediainfo,
target_storage=target_storage, target_storage=target_storage,
@@ -530,7 +522,6 @@ class FileManagerModule(_ModuleBase):
获取对应媒体的媒体库文件列表 获取对应媒体的媒体库文件列表
:param mediainfo: 媒体信息 :param mediainfo: 媒体信息
""" """
handler = TransHandler()
ret_fileitems = [] ret_fileitems = []
# 检查本地媒体库 # 检查本地媒体库
dest_dirs = DirectoryHelper.get_library_dirs() dest_dirs = DirectoryHelper.get_library_dirs()
@@ -541,7 +532,7 @@ class FileManagerModule(_ModuleBase):
if not storage_oper: if not storage_oper:
continue continue
# 媒体分类路径 # 媒体分类路径
dir_path = handler.get_dest_dir(mediainfo=mediainfo, target_dir=dest_dir) dir_path = TransHandler.get_dest_dir(mediainfo=mediainfo, target_dir=dest_dir)
# 重命名格式 # 重命名格式
rename_format = settings.RENAME_FORMAT(mediainfo.type) rename_format = settings.RENAME_FORMAT(mediainfo.type)
# 元数据补上常用属性,尽可能确保重命名后的路径不出现空白 # 元数据补上常用属性,尽可能确保重命名后的路径不出现空白
@@ -555,10 +546,10 @@ class FileManagerModule(_ModuleBase):
if meta.begin_episode is None: if meta.begin_episode is None:
meta.begin_episode = 1 meta.begin_episode = 1
# 获取路径(重命名路径) # 获取路径(重命名路径)
target_path = handler.get_rename_path( target_path = TransHandler.get_rename_path(
path=dir_path, path=dir_path,
template_string=rename_format, template_string=rename_format,
rename_dict=handler.get_naming_dict(meta=meta, rename_dict=TransHandler.get_naming_dict(meta=meta,
mediainfo=mediainfo) mediainfo=mediainfo)
) )
# 获取重命名后的媒体文件根路径 # 获取重命名后的媒体文件根路径

View File

@@ -44,9 +44,6 @@ class StorageBase(metaclass=ABCMeta):
transtype = {} transtype = {}
snapshot_check_folder_modtime = True snapshot_check_folder_modtime = True
def __init__(self):
self.storagehelper = StorageHelper()
@abstractmethod @abstractmethod
def init_storage(self): def init_storage(self):
""" """
@@ -70,7 +67,7 @@ class StorageBase(metaclass=ABCMeta):
""" """
获取配置 获取配置
""" """
return self.storagehelper.get_storage(self.schema.value) return StorageHelper.get_storage(self.schema.value)
def get_conf(self) -> dict: def get_conf(self) -> dict:
""" """
@@ -83,7 +80,7 @@ class StorageBase(metaclass=ABCMeta):
""" """
设置配置 设置配置
""" """
self.storagehelper.set_storage(self.schema.value, conf) StorageHelper.set_storage(self.schema.value, conf)
self.init_storage() self.init_storage()
def support_transtype(self) -> dict: def support_transtype(self) -> dict:
@@ -102,7 +99,7 @@ class StorageBase(metaclass=ABCMeta):
""" """
重置置配置 重置置配置
""" """
self.storagehelper.reset_storage(self.schema.value) StorageHelper.reset_storage(self.schema.value)
self.init_storage() self.init_storage()
@abstractmethod @abstractmethod

View File

@@ -24,9 +24,6 @@ class TransHandler:
文件转移整理类 文件转移整理类
""" """
def __init__(self):
pass
@staticmethod @staticmethod
def __update_result(result: TransferInfo, **kwargs): def __update_result(result: TransferInfo, **kwargs):
""" """
@@ -56,8 +53,8 @@ class TransHandler:
current_value = value current_value = value
setattr(result, key, current_value) setattr(result, key, current_value)
def transfer_media(self, @staticmethod
fileitem: FileItem, def transfer_media(fileitem: FileItem,
in_meta: MetaBase, in_meta: MetaBase,
mediainfo: MediaInfo, mediainfo: MediaInfo,
target_storage: str, target_storage: str,
@@ -125,17 +122,17 @@ class TransHandler:
if fileitem.type == "dir": if fileitem.type == "dir":
# 整理整个目录,一般为蓝光原盘 # 整理整个目录,一般为蓝光原盘
if need_rename: if need_rename:
new_path = self.get_rename_path( new_path = TransHandler.get_rename_path(
path=target_path, path=target_path,
template_string=rename_format, template_string=rename_format,
rename_dict=self.get_naming_dict(meta=in_meta, rename_dict=TransHandler.get_naming_dict(meta=in_meta,
mediainfo=mediainfo) mediainfo=mediainfo)
) )
new_path = DirectoryHelper.get_media_root_path( new_path = DirectoryHelper.get_media_root_path(
rename_format, rename_path=new_path rename_format, rename_path=new_path
) )
if not new_path: if not new_path:
self.__update_result( TransHandler.__update_result(
result=result, result=result,
success=False, success=False,
message="重命名格式无效", message="重命名格式无效",
@@ -154,7 +151,7 @@ class TransHandler:
file.size for file in source_oper.list(stream_fileitem) or [] file.size for file in source_oper.list(stream_fileitem) or []
) )
# 整理目录 # 整理目录
new_diritem, errmsg = self.__transfer_dir(fileitem=fileitem, new_diritem, errmsg = TransHandler.__transfer_dir(fileitem=fileitem,
mediainfo=mediainfo, mediainfo=mediainfo,
source_oper=source_oper, source_oper=source_oper,
target_oper=target_oper, target_oper=target_oper,
@@ -164,7 +161,7 @@ class TransHandler:
result=result) result=result)
if not new_diritem: if not new_diritem:
logger.error(f"文件夹 {fileitem.path} 整理失败:{errmsg}") logger.error(f"文件夹 {fileitem.path} 整理失败:{errmsg}")
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message=errmsg, message=errmsg,
fileitem=fileitem, fileitem=fileitem,
@@ -174,7 +171,7 @@ class TransHandler:
logger.info(f"文件夹 {fileitem.path} 整理成功") logger.info(f"文件夹 {fileitem.path} 整理成功")
# 返回整理后的路径 # 返回整理后的路径
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=True, success=True,
fileitem=fileitem, fileitem=fileitem,
target_item=new_diritem, target_item=new_diritem,
@@ -189,7 +186,7 @@ class TransHandler:
# 电视剧 # 电视剧
if in_meta.begin_episode is None: if in_meta.begin_episode is None:
logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数") logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数")
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message="未识别到文件集数", message="未识别到文件集数",
fileitem=fileitem, fileitem=fileitem,
@@ -210,10 +207,10 @@ class TransHandler:
# 目的文件名 # 目的文件名
if need_rename: if need_rename:
new_file = self.get_rename_path( new_file = TransHandler.get_rename_path(
path=target_path, path=target_path,
template_string=rename_format, template_string=rename_format,
rename_dict=self.get_naming_dict( rename_dict=TransHandler.get_naming_dict(
meta=in_meta, meta=in_meta,
mediainfo=mediainfo, mediainfo=mediainfo,
episodes_info=episodes_info, episodes_info=episodes_info,
@@ -223,14 +220,14 @@ class TransHandler:
# 针对字幕文件,文件名中补充额外标识信息 # 针对字幕文件,文件名中补充额外标识信息
if __is_subtitle_file(fileitem): if __is_subtitle_file(fileitem):
new_file = self.__rename_subtitles(fileitem, new_file) new_file = TransHandler.__rename_subtitles(fileitem, new_file)
# 文件目录 # 文件目录
folder_path = DirectoryHelper.get_media_root_path( folder_path = DirectoryHelper.get_media_root_path(
rename_format, rename_path=new_file rename_format, rename_path=new_file
) )
if not folder_path: if not folder_path:
self.__update_result( TransHandler.__update_result(
result=result, result=result,
success=False, success=False,
message="重命名格式无效", message="重命名格式无效",
@@ -248,7 +245,7 @@ class TransHandler:
target_diritem = target_oper.get_folder(folder_path) target_diritem = target_oper.get_folder(folder_path)
if not target_diritem: if not target_diritem:
logger.error(f"目标目录 {folder_path} 获取失败") logger.error(f"目标目录 {folder_path} 获取失败")
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message=f"目标目录 {folder_path} 获取失败", message=f"目标目录 {folder_path} 获取失败",
fileitem=fileitem, fileitem=fileitem,
@@ -282,7 +279,7 @@ class TransHandler:
logger.info(f"目标文件文件大小更小,将覆盖:{new_file}") logger.info(f"目标文件文件大小更小,将覆盖:{new_file}")
overflag = True overflag = True
else: else:
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message=f"媒体库存在同名文件,且质量更好", message=f"媒体库存在同名文件,且质量更好",
fileitem=fileitem, fileitem=fileitem,
@@ -294,7 +291,7 @@ class TransHandler:
return result return result
elif overwrite_mode == 'never': elif overwrite_mode == 'never':
# 存在不覆盖 # 存在不覆盖
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message=f"媒体库存在同名文件,当前覆盖模式为不覆盖", message=f"媒体库存在同名文件,当前覆盖模式为不覆盖",
fileitem=fileitem, fileitem=fileitem,
@@ -313,13 +310,13 @@ class TransHandler:
# 文件不存在,但仅保留最新版本 # 文件不存在,但仅保留最新版本
logger.info( logger.info(
f"当前整理覆盖模式设置为 {overwrite_mode},仅保留最新版本,正在删除已有版本文件 ...") f"当前整理覆盖模式设置为 {overwrite_mode},仅保留最新版本,正在删除已有版本文件 ...")
self.__delete_version_files(target_oper, new_file) TransHandler.__delete_version_files(target_oper, new_file)
else: else:
# 附加文件 总是需要覆盖 # 附加文件 总是需要覆盖
overflag = True overflag = True
# 整理文件 # 整理文件
new_item, err_msg = self.__transfer_file(fileitem=fileitem, new_item, err_msg = TransHandler.__transfer_file(fileitem=fileitem,
mediainfo=mediainfo, mediainfo=mediainfo,
target_storage=target_storage, target_storage=target_storage,
target_file=new_file, target_file=new_file,
@@ -330,7 +327,7 @@ class TransHandler:
result=result) result=result)
if not new_item: if not new_item:
logger.error(f"文件 {fileitem.path} 整理失败:{err_msg}") logger.error(f"文件 {fileitem.path} 整理失败:{err_msg}")
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=False, success=False,
message=err_msg, message=err_msg,
fileitem=fileitem, fileitem=fileitem,
@@ -340,7 +337,7 @@ class TransHandler:
return result return result
logger.info(f"文件 {fileitem.path} 整理成功") logger.info(f"文件 {fileitem.path} 整理成功")
self.__update_result(result=result, TransHandler.__update_result(result=result,
success=True, success=True,
fileitem=fileitem, fileitem=fileitem,
target_item=new_item, target_item=new_item,
@@ -545,7 +542,8 @@ class TransHandler:
return new_file.with_name(new_file.stem + new_sub_tag + file_ext) return new_file.with_name(new_file.stem + new_sub_tag + file_ext)
def __transfer_dir(self, fileitem: FileItem, mediainfo: MediaInfo, @staticmethod
def __transfer_dir(fileitem: FileItem, mediainfo: MediaInfo,
source_oper: StorageBase, target_oper: StorageBase, source_oper: StorageBase, target_oper: StorageBase,
transfer_type: str, target_storage: str, target_path: Path, transfer_type: str, target_storage: str, target_path: Path,
result: TransferInfo) -> Tuple[Optional[FileItem], str]: result: TransferInfo) -> Tuple[Optional[FileItem], str]:
@@ -580,7 +578,7 @@ class TransHandler:
f"Reason: {event_data.reason}") f"Reason: {event_data.reason}")
return None, event_data.reason return None, event_data.reason
# 处理所有文件 # 处理所有文件
state, errmsg = self.__transfer_dir_files(fileitem=fileitem, state, errmsg = TransHandler.__transfer_dir_files(fileitem=fileitem,
target_storage=target_storage, target_storage=target_storage,
source_oper=source_oper, source_oper=source_oper,
target_oper=target_oper, target_oper=target_oper,
@@ -592,7 +590,8 @@ class TransHandler:
else: else:
return None, errmsg return None, errmsg
def __transfer_dir_files(self, fileitem: FileItem, target_storage: str, @staticmethod
def __transfer_dir_files(fileitem: FileItem, target_storage: str,
source_oper: StorageBase, target_oper: StorageBase, source_oper: StorageBase, target_oper: StorageBase,
transfer_type: str, target_path: Path, transfer_type: str, target_path: Path,
result: TransferInfo) -> Tuple[bool, str]: result: TransferInfo) -> Tuple[bool, str]:
@@ -611,7 +610,7 @@ class TransHandler:
if item.type == "dir": if item.type == "dir":
# 递归整理目录 # 递归整理目录
new_path = target_path / item.name new_path = target_path / item.name
state, errmsg = self.__transfer_dir_files(fileitem=item, state, errmsg = TransHandler.__transfer_dir_files(fileitem=item,
target_storage=target_storage, target_storage=target_storage,
source_oper=source_oper, source_oper=source_oper,
target_oper=target_oper, target_oper=target_oper,
@@ -623,7 +622,7 @@ class TransHandler:
else: else:
# 整理文件 # 整理文件
new_file = target_path / item.name new_file = target_path / item.name
new_item, errmsg = self.__transfer_command(fileitem=item, new_item, errmsg = TransHandler.__transfer_command(fileitem=item,
target_storage=target_storage, target_storage=target_storage,
source_oper=source_oper, source_oper=source_oper,
target_oper=target_oper, target_oper=target_oper,
@@ -631,7 +630,7 @@ class TransHandler:
transfer_type=transfer_type) transfer_type=transfer_type)
if not new_item: if not new_item:
return False, errmsg return False, errmsg
self.__update_result( TransHandler.__update_result(
result=result, result=result,
file_list=[item.path], file_list=[item.path],
file_list_new=[new_item.path], file_list_new=[new_item.path],
@@ -639,7 +638,8 @@ class TransHandler:
# 返回成功 # 返回成功
return True, "" return True, ""
def __transfer_file(self, fileitem: FileItem, mediainfo: MediaInfo, @staticmethod
def __transfer_file(fileitem: FileItem, mediainfo: MediaInfo,
source_oper: StorageBase, target_oper: StorageBase, source_oper: StorageBase, target_oper: StorageBase,
target_storage: str, target_file: Path, target_storage: str, target_file: Path,
transfer_type: str, result: TransferInfo, transfer_type: str, result: TransferInfo,
@@ -695,14 +695,14 @@ class TransHandler:
logger.info(f"正在删除已存在的文件:【{target_storage}{target_file}") logger.info(f"正在删除已存在的文件:【{target_storage}{target_file}")
target_oper.delete(exists_item) target_oper.delete(exists_item)
# 执行文件整理命令 # 执行文件整理命令
new_item, errmsg = self.__transfer_command(fileitem=fileitem, new_item, errmsg = TransHandler.__transfer_command(fileitem=fileitem,
target_storage=target_storage, target_storage=target_storage,
source_oper=source_oper, source_oper=source_oper,
target_oper=target_oper, target_oper=target_oper,
target_file=target_file, target_file=target_file,
transfer_type=transfer_type) transfer_type=transfer_type)
if new_item: if new_item:
self.__update_result( TransHandler.__update_result(
result=result, result=result,
file_list=[fileitem.path], file_list=[fileitem.path],
file_list_new=[new_item.path], file_list_new=[new_item.path],