From f38cb274e4137e6cbb0a7ddb4e88fe4593a8ea7f Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 14 Mar 2026 18:19:47 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"refactor(helper):=20=E5=B0=86LLMHelpe?= =?UTF-8?q?r=20StorageHelper=E7=9A=84=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E9=9D=99=E6=80=81=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=AE=9E=E4=BE=8B=E8=B0=83=E7=94=A8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 9f381b3c735a0297c499b29227a1ab982327305f. --- app/api/endpoints/system.py | 2 +- app/helper/llm.py | 7 +-- app/helper/storage.py | 20 +++--- app/modules/filemanager/__init__.py | 27 ++++++--- app/modules/filemanager/storages/__init__.py | 9 ++- app/modules/filemanager/transhandler.py | 64 ++++++++++---------- 6 files changed, 68 insertions(+), 61 deletions(-) diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 5370211e..9b7d975f 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -317,7 +317,7 @@ async def get_llm_models(provider: str, api_key: str, base_url: Optional[str] = 获取LLM模型列表 """ 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) except Exception as e: return schemas.Response(success=False, message=str(e)) diff --git a/app/helper/llm.py b/app/helper/llm.py index 2001f81a..4bccbaa5 100644 --- a/app/helper/llm.py +++ b/app/helper/llm.py @@ -71,14 +71,13 @@ class LLMHelper: openai_proxy=settings.PROXY_HOST ) - @staticmethod - def get_models(provider: str, api_key: str, base_url: str = None) -> List[str]: + def get_models(self, provider: str, api_key: str, base_url: str = None) -> List[str]: """获取模型列表""" logger.info(f"获取 {provider} 模型列表...") if provider == "google": - return LLMHelper._get_google_models(api_key) + return self._get_google_models(api_key) else: - return LLMHelper._get_openai_compatible_models(provider, api_key, base_url) + return self._get_openai_compatible_models(provider, api_key, base_url) @staticmethod def _get_google_models(api_key: str) -> List[str]: diff --git a/app/helper/storage.py b/app/helper/storage.py index 4c498e53..e9cff447 100644 --- a/app/helper/storage.py +++ b/app/helper/storage.py @@ -20,23 +20,21 @@ class StorageHelper: return [] return [schemas.StorageConf(**s) for s in storage_confs] - @staticmethod - def get_storage(storage: str) -> Optional[schemas.StorageConf]: + def get_storage(self, storage: str) -> Optional[schemas.StorageConf]: """ 获取指定存储配置 """ - storagies = StorageHelper.get_storagies() + storagies = self.get_storagies() for s in storagies: if s.type == storage: return s return None - @staticmethod - def set_storage(storage: str, conf: dict): + def set_storage(self, storage: str, conf: dict): """ 设置存储配置 """ - storagies = StorageHelper.get_storagies() + storagies = self.get_storagies() if not storagies: storagies = [ schemas.StorageConf( @@ -51,12 +49,11 @@ class StorageHelper: break SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies]) - @staticmethod - def add_storage(storage: str, name: str, conf: dict): + def add_storage(self, storage: str, name: str, conf: dict): """ 添加存储配置 """ - storagies = StorageHelper.get_storagies() + storagies = self.get_storagies() if not storagies: storagies = [ schemas.StorageConf( @@ -73,12 +70,11 @@ class StorageHelper: )) SystemConfigOper().set(SystemConfigKey.Storages, [s.model_dump() for s in storagies]) - @staticmethod - def reset_storage(storage: str): + def reset_storage(self, storage: str): """ 重置存储配置 """ - storagies = StorageHelper.get_storagies() + storagies = self.get_storagies() for s in storagies: if s.type == storage: s.config = {} diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index bc29c976..d1644e91 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -7,6 +7,7 @@ from app.core.context import MediaInfo from app.core.meta import MetaBase from app.core.metainfo import MetaInfo from app.helper.directory import DirectoryHelper +from app.helper.message import MessageHelper from app.helper.module import ModuleHelper from app.log import logger from app.modules import _ModuleBase @@ -25,6 +26,11 @@ class FileManagerModule(_ModuleBase): _storage_schemas = [] _support_storages = [] + def __init__(self): + super().__init__() + self.directoryhelper = DirectoryHelper() + self.messagehelper = MessageHelper() + def init_module(self) -> None: # 加载模块 self._storage_schemas = ModuleHelper.load('app.modules.filemanager.storages', @@ -65,7 +71,7 @@ class FileManagerModule(_ModuleBase): 测试模块连接性 """ # 检查目录 - dirs = DirectoryHelper.get_dirs() + dirs = self.directoryhelper.get_dirs() if not dirs: return False, "未设置任何目录" for d in dirs: @@ -132,6 +138,7 @@ class FileManagerModule(_ModuleBase): :param mediainfo: 媒体信息 :return: 重命名后的名称(含目录) """ + handler = TransHandler() # 重命名格式 rename_format = settings.RENAME_FORMAT(mediainfo.type) # 获取集信息 @@ -151,9 +158,9 @@ class FileManagerModule(_ModuleBase): episode_group=mediainfo.episode_group, ) # 获取重命名后的名称 - path = TransHandler.get_rename_path( + path = handler.get_rename_path( template_string=rename_format, - rename_dict=TransHandler.get_naming_dict(meta=meta, + rename_dict=handler.get_naming_dict(meta=meta, mediainfo=mediainfo, episodes_info=episodes_info, file_ext=Path(meta.title).suffix) @@ -417,6 +424,7 @@ class FileManagerModule(_ModuleBase): :param target_oper: 目标存储操作对象 :return: {path, target_path, message} """ + handler = TransHandler() # 检查目录路径 if fileitem.storage == "local" and not Path(fileitem.path).exists(): return TransferInfo(success=False, @@ -451,7 +459,7 @@ class FileManagerModule(_ModuleBase): # 是否需要刮削 need_scrape = target_directory.scraping if scrape is None else scrape # 拼装媒体库一、二级子目录 - target_path = TransHandler.get_dest_dir(mediainfo=mediainfo, target_dir=target_directory, + target_path = handler.get_dest_dir(mediainfo=mediainfo, target_dir=target_directory, need_type_folder=library_type_folder, need_category_folder=library_category_folder) elif target_path: @@ -460,7 +468,7 @@ class FileManagerModule(_ModuleBase): need_notify = False overwrite_mode = "never" # 手动整理的场景,有自定义目标路径 - target_path = TransHandler.get_dest_path(mediainfo=mediainfo, target_path=target_path, + target_path = handler.get_dest_path(mediainfo=mediainfo, target_path=target_path, need_type_folder=library_type_folder, need_category_folder=library_category_folder) else: @@ -503,7 +511,7 @@ class FileManagerModule(_ModuleBase): # 整理 logger.info(f"获取整理目标路径:【{target_storage}】{target_path}") - return TransHandler.transfer_media(fileitem=fileitem, + return handler.transfer_media(fileitem=fileitem, in_meta=meta, mediainfo=mediainfo, target_storage=target_storage, @@ -522,6 +530,7 @@ class FileManagerModule(_ModuleBase): 获取对应媒体的媒体库文件列表 :param mediainfo: 媒体信息 """ + handler = TransHandler() ret_fileitems = [] # 检查本地媒体库 dest_dirs = DirectoryHelper.get_library_dirs() @@ -532,7 +541,7 @@ class FileManagerModule(_ModuleBase): if not storage_oper: continue # 媒体分类路径 - dir_path = TransHandler.get_dest_dir(mediainfo=mediainfo, target_dir=dest_dir) + dir_path = handler.get_dest_dir(mediainfo=mediainfo, target_dir=dest_dir) # 重命名格式 rename_format = settings.RENAME_FORMAT(mediainfo.type) # 元数据补上常用属性,尽可能确保重命名后的路径不出现空白 @@ -546,10 +555,10 @@ class FileManagerModule(_ModuleBase): if meta.begin_episode is None: meta.begin_episode = 1 # 获取路径(重命名路径) - target_path = TransHandler.get_rename_path( + target_path = handler.get_rename_path( path=dir_path, template_string=rename_format, - rename_dict=TransHandler.get_naming_dict(meta=meta, + rename_dict=handler.get_naming_dict(meta=meta, mediainfo=mediainfo) ) # 获取重命名后的媒体文件根路径 diff --git a/app/modules/filemanager/storages/__init__.py b/app/modules/filemanager/storages/__init__.py index 1e1f37d4..3adeca74 100644 --- a/app/modules/filemanager/storages/__init__.py +++ b/app/modules/filemanager/storages/__init__.py @@ -44,6 +44,9 @@ class StorageBase(metaclass=ABCMeta): transtype = {} snapshot_check_folder_modtime = True + def __init__(self): + self.storagehelper = StorageHelper() + @abstractmethod def init_storage(self): """ @@ -67,7 +70,7 @@ class StorageBase(metaclass=ABCMeta): """ 获取配置 """ - return StorageHelper.get_storage(self.schema.value) + return self.storagehelper.get_storage(self.schema.value) def get_conf(self) -> dict: """ @@ -80,7 +83,7 @@ class StorageBase(metaclass=ABCMeta): """ 设置配置 """ - StorageHelper.set_storage(self.schema.value, conf) + self.storagehelper.set_storage(self.schema.value, conf) self.init_storage() def support_transtype(self) -> dict: @@ -99,7 +102,7 @@ class StorageBase(metaclass=ABCMeta): """ 重置置配置 """ - StorageHelper.reset_storage(self.schema.value) + self.storagehelper.reset_storage(self.schema.value) self.init_storage() @abstractmethod diff --git a/app/modules/filemanager/transhandler.py b/app/modules/filemanager/transhandler.py index 93ef1ed3..8bd122eb 100644 --- a/app/modules/filemanager/transhandler.py +++ b/app/modules/filemanager/transhandler.py @@ -24,6 +24,9 @@ class TransHandler: 文件转移整理类 """ + def __init__(self): + pass + @staticmethod def __update_result(result: TransferInfo, **kwargs): """ @@ -53,8 +56,8 @@ class TransHandler: current_value = value setattr(result, key, current_value) - @staticmethod - def transfer_media(fileitem: FileItem, + def transfer_media(self, + fileitem: FileItem, in_meta: MetaBase, mediainfo: MediaInfo, target_storage: str, @@ -122,17 +125,17 @@ class TransHandler: if fileitem.type == "dir": # 整理整个目录,一般为蓝光原盘 if need_rename: - new_path = TransHandler.get_rename_path( + new_path = self.get_rename_path( path=target_path, template_string=rename_format, - rename_dict=TransHandler.get_naming_dict(meta=in_meta, + rename_dict=self.get_naming_dict(meta=in_meta, mediainfo=mediainfo) ) new_path = DirectoryHelper.get_media_root_path( rename_format, rename_path=new_path ) if not new_path: - TransHandler.__update_result( + self.__update_result( result=result, success=False, message="重命名格式无效", @@ -151,7 +154,7 @@ class TransHandler: file.size for file in source_oper.list(stream_fileitem) or [] ) # 整理目录 - new_diritem, errmsg = TransHandler.__transfer_dir(fileitem=fileitem, + new_diritem, errmsg = self.__transfer_dir(fileitem=fileitem, mediainfo=mediainfo, source_oper=source_oper, target_oper=target_oper, @@ -161,7 +164,7 @@ class TransHandler: result=result) if not new_diritem: logger.error(f"文件夹 {fileitem.path} 整理失败:{errmsg}") - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message=errmsg, fileitem=fileitem, @@ -171,7 +174,7 @@ class TransHandler: logger.info(f"文件夹 {fileitem.path} 整理成功") # 返回整理后的路径 - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=True, fileitem=fileitem, target_item=new_diritem, @@ -186,7 +189,7 @@ class TransHandler: # 电视剧 if in_meta.begin_episode is None: logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数") - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message="未识别到文件集数", fileitem=fileitem, @@ -207,10 +210,10 @@ class TransHandler: # 目的文件名 if need_rename: - new_file = TransHandler.get_rename_path( + new_file = self.get_rename_path( path=target_path, template_string=rename_format, - rename_dict=TransHandler.get_naming_dict( + rename_dict=self.get_naming_dict( meta=in_meta, mediainfo=mediainfo, episodes_info=episodes_info, @@ -220,14 +223,14 @@ class TransHandler: # 针对字幕文件,文件名中补充额外标识信息 if __is_subtitle_file(fileitem): - new_file = TransHandler.__rename_subtitles(fileitem, new_file) + new_file = self.__rename_subtitles(fileitem, new_file) # 文件目录 folder_path = DirectoryHelper.get_media_root_path( rename_format, rename_path=new_file ) if not folder_path: - TransHandler.__update_result( + self.__update_result( result=result, success=False, message="重命名格式无效", @@ -245,7 +248,7 @@ class TransHandler: target_diritem = target_oper.get_folder(folder_path) if not target_diritem: logger.error(f"目标目录 {folder_path} 获取失败") - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message=f"目标目录 {folder_path} 获取失败", fileitem=fileitem, @@ -279,7 +282,7 @@ class TransHandler: logger.info(f"目标文件文件大小更小,将覆盖:{new_file}") overflag = True else: - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message=f"媒体库存在同名文件,且质量更好", fileitem=fileitem, @@ -291,7 +294,7 @@ class TransHandler: return result elif overwrite_mode == 'never': # 存在不覆盖 - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message=f"媒体库存在同名文件,当前覆盖模式为不覆盖", fileitem=fileitem, @@ -310,13 +313,13 @@ class TransHandler: # 文件不存在,但仅保留最新版本 logger.info( f"当前整理覆盖模式设置为 {overwrite_mode},仅保留最新版本,正在删除已有版本文件 ...") - TransHandler.__delete_version_files(target_oper, new_file) + self.__delete_version_files(target_oper, new_file) else: # 附加文件 总是需要覆盖 overflag = True # 整理文件 - new_item, err_msg = TransHandler.__transfer_file(fileitem=fileitem, + new_item, err_msg = self.__transfer_file(fileitem=fileitem, mediainfo=mediainfo, target_storage=target_storage, target_file=new_file, @@ -327,7 +330,7 @@ class TransHandler: result=result) if not new_item: logger.error(f"文件 {fileitem.path} 整理失败:{err_msg}") - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=False, message=err_msg, fileitem=fileitem, @@ -337,7 +340,7 @@ class TransHandler: return result logger.info(f"文件 {fileitem.path} 整理成功") - TransHandler.__update_result(result=result, + self.__update_result(result=result, success=True, fileitem=fileitem, target_item=new_item, @@ -542,8 +545,7 @@ class TransHandler: return new_file.with_name(new_file.stem + new_sub_tag + file_ext) - @staticmethod - def __transfer_dir(fileitem: FileItem, mediainfo: MediaInfo, + def __transfer_dir(self, fileitem: FileItem, mediainfo: MediaInfo, source_oper: StorageBase, target_oper: StorageBase, transfer_type: str, target_storage: str, target_path: Path, result: TransferInfo) -> Tuple[Optional[FileItem], str]: @@ -578,7 +580,7 @@ class TransHandler: f"Reason: {event_data.reason}") return None, event_data.reason # 处理所有文件 - state, errmsg = TransHandler.__transfer_dir_files(fileitem=fileitem, + state, errmsg = self.__transfer_dir_files(fileitem=fileitem, target_storage=target_storage, source_oper=source_oper, target_oper=target_oper, @@ -590,8 +592,7 @@ class TransHandler: else: return None, errmsg - @staticmethod - def __transfer_dir_files(fileitem: FileItem, target_storage: str, + def __transfer_dir_files(self, fileitem: FileItem, target_storage: str, source_oper: StorageBase, target_oper: StorageBase, transfer_type: str, target_path: Path, result: TransferInfo) -> Tuple[bool, str]: @@ -610,7 +611,7 @@ class TransHandler: if item.type == "dir": # 递归整理目录 new_path = target_path / item.name - state, errmsg = TransHandler.__transfer_dir_files(fileitem=item, + state, errmsg = self.__transfer_dir_files(fileitem=item, target_storage=target_storage, source_oper=source_oper, target_oper=target_oper, @@ -622,7 +623,7 @@ class TransHandler: else: # 整理文件 new_file = target_path / item.name - new_item, errmsg = TransHandler.__transfer_command(fileitem=item, + new_item, errmsg = self.__transfer_command(fileitem=item, target_storage=target_storage, source_oper=source_oper, target_oper=target_oper, @@ -630,7 +631,7 @@ class TransHandler: transfer_type=transfer_type) if not new_item: return False, errmsg - TransHandler.__update_result( + self.__update_result( result=result, file_list=[item.path], file_list_new=[new_item.path], @@ -638,8 +639,7 @@ class TransHandler: # 返回成功 return True, "" - @staticmethod - def __transfer_file(fileitem: FileItem, mediainfo: MediaInfo, + def __transfer_file(self, fileitem: FileItem, mediainfo: MediaInfo, source_oper: StorageBase, target_oper: StorageBase, target_storage: str, target_file: Path, transfer_type: str, result: TransferInfo, @@ -695,14 +695,14 @@ class TransHandler: logger.info(f"正在删除已存在的文件:【{target_storage}】{target_file}") target_oper.delete(exists_item) # 执行文件整理命令 - new_item, errmsg = TransHandler.__transfer_command(fileitem=fileitem, + new_item, errmsg = self.__transfer_command(fileitem=fileitem, target_storage=target_storage, source_oper=source_oper, target_oper=target_oper, target_file=target_file, transfer_type=transfer_type) if new_item: - TransHandler.__update_result( + self.__update_result( result=result, file_list=[fileitem.path], file_list_new=[new_item.path],