diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 9b7d975f..5370211e 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 4bccbaa5..2001f81a 100644 --- a/app/helper/llm.py +++ b/app/helper/llm.py @@ -71,13 +71,14 @@ class LLMHelper: 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} 模型列表...") if provider == "google": - return self._get_google_models(api_key) + return LLMHelper._get_google_models(api_key) else: - return self._get_openai_compatible_models(provider, api_key, base_url) + return LLMHelper._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 e9cff447..4c498e53 100644 --- a/app/helper/storage.py +++ b/app/helper/storage.py @@ -20,21 +20,23 @@ class StorageHelper: return [] 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: if s.type == storage: return s 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: storagies = [ schemas.StorageConf( @@ -49,11 +51,12 @@ class StorageHelper: break 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: storagies = [ schemas.StorageConf( @@ -70,11 +73,12 @@ class StorageHelper: )) 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: if s.type == storage: s.config = {} diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index d1644e91..bc29c976 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -7,7 +7,6 @@ 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 @@ -26,11 +25,6 @@ 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', @@ -71,7 +65,7 @@ class FileManagerModule(_ModuleBase): 测试模块连接性 """ # 检查目录 - dirs = self.directoryhelper.get_dirs() + dirs = DirectoryHelper.get_dirs() if not dirs: return False, "未设置任何目录" for d in dirs: @@ -138,7 +132,6 @@ class FileManagerModule(_ModuleBase): :param mediainfo: 媒体信息 :return: 重命名后的名称(含目录) """ - handler = TransHandler() # 重命名格式 rename_format = settings.RENAME_FORMAT(mediainfo.type) # 获取集信息 @@ -158,9 +151,9 @@ class FileManagerModule(_ModuleBase): episode_group=mediainfo.episode_group, ) # 获取重命名后的名称 - path = handler.get_rename_path( + path = TransHandler.get_rename_path( template_string=rename_format, - rename_dict=handler.get_naming_dict(meta=meta, + rename_dict=TransHandler.get_naming_dict(meta=meta, mediainfo=mediainfo, episodes_info=episodes_info, file_ext=Path(meta.title).suffix) @@ -424,7 +417,6 @@ 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, @@ -459,7 +451,7 @@ class FileManagerModule(_ModuleBase): # 是否需要刮削 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_category_folder=library_category_folder) elif target_path: @@ -468,7 +460,7 @@ class FileManagerModule(_ModuleBase): need_notify = False 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_category_folder=library_category_folder) else: @@ -511,7 +503,7 @@ class FileManagerModule(_ModuleBase): # 整理 logger.info(f"获取整理目标路径:【{target_storage}】{target_path}") - return handler.transfer_media(fileitem=fileitem, + return TransHandler.transfer_media(fileitem=fileitem, in_meta=meta, mediainfo=mediainfo, target_storage=target_storage, @@ -530,7 +522,6 @@ class FileManagerModule(_ModuleBase): 获取对应媒体的媒体库文件列表 :param mediainfo: 媒体信息 """ - handler = TransHandler() ret_fileitems = [] # 检查本地媒体库 dest_dirs = DirectoryHelper.get_library_dirs() @@ -541,7 +532,7 @@ class FileManagerModule(_ModuleBase): if not storage_oper: 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) # 元数据补上常用属性,尽可能确保重命名后的路径不出现空白 @@ -555,10 +546,10 @@ class FileManagerModule(_ModuleBase): if meta.begin_episode is None: meta.begin_episode = 1 # 获取路径(重命名路径) - target_path = handler.get_rename_path( + target_path = TransHandler.get_rename_path( path=dir_path, template_string=rename_format, - rename_dict=handler.get_naming_dict(meta=meta, + rename_dict=TransHandler.get_naming_dict(meta=meta, mediainfo=mediainfo) ) # 获取重命名后的媒体文件根路径 diff --git a/app/modules/filemanager/storages/__init__.py b/app/modules/filemanager/storages/__init__.py index 3adeca74..1e1f37d4 100644 --- a/app/modules/filemanager/storages/__init__.py +++ b/app/modules/filemanager/storages/__init__.py @@ -44,9 +44,6 @@ class StorageBase(metaclass=ABCMeta): transtype = {} snapshot_check_folder_modtime = True - def __init__(self): - self.storagehelper = StorageHelper() - @abstractmethod 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: """ @@ -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() 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() @abstractmethod diff --git a/app/modules/filemanager/transhandler.py b/app/modules/filemanager/transhandler.py index 8bd122eb..93ef1ed3 100644 --- a/app/modules/filemanager/transhandler.py +++ b/app/modules/filemanager/transhandler.py @@ -24,9 +24,6 @@ class TransHandler: 文件转移整理类 """ - def __init__(self): - pass - @staticmethod def __update_result(result: TransferInfo, **kwargs): """ @@ -56,8 +53,8 @@ class TransHandler: current_value = value setattr(result, key, current_value) - def transfer_media(self, - fileitem: FileItem, + @staticmethod + def transfer_media(fileitem: FileItem, in_meta: MetaBase, mediainfo: MediaInfo, target_storage: str, @@ -125,17 +122,17 @@ class TransHandler: if fileitem.type == "dir": # 整理整个目录,一般为蓝光原盘 if need_rename: - new_path = self.get_rename_path( + new_path = TransHandler.get_rename_path( path=target_path, template_string=rename_format, - rename_dict=self.get_naming_dict(meta=in_meta, + rename_dict=TransHandler.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: - self.__update_result( + TransHandler.__update_result( result=result, success=False, message="重命名格式无效", @@ -154,7 +151,7 @@ class TransHandler: 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, source_oper=source_oper, target_oper=target_oper, @@ -164,7 +161,7 @@ class TransHandler: result=result) if not new_diritem: logger.error(f"文件夹 {fileitem.path} 整理失败:{errmsg}") - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message=errmsg, fileitem=fileitem, @@ -174,7 +171,7 @@ class TransHandler: logger.info(f"文件夹 {fileitem.path} 整理成功") # 返回整理后的路径 - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=True, fileitem=fileitem, target_item=new_diritem, @@ -189,7 +186,7 @@ class TransHandler: # 电视剧 if in_meta.begin_episode is None: logger.warn(f"文件 {fileitem.path} 整理失败:未识别到文件集数") - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message="未识别到文件集数", fileitem=fileitem, @@ -210,10 +207,10 @@ class TransHandler: # 目的文件名 if need_rename: - new_file = self.get_rename_path( + new_file = TransHandler.get_rename_path( path=target_path, template_string=rename_format, - rename_dict=self.get_naming_dict( + rename_dict=TransHandler.get_naming_dict( meta=in_meta, mediainfo=mediainfo, episodes_info=episodes_info, @@ -223,14 +220,14 @@ class TransHandler: # 针对字幕文件,文件名中补充额外标识信息 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( rename_format, rename_path=new_file ) if not folder_path: - self.__update_result( + TransHandler.__update_result( result=result, success=False, message="重命名格式无效", @@ -248,7 +245,7 @@ class TransHandler: target_diritem = target_oper.get_folder(folder_path) if not target_diritem: logger.error(f"目标目录 {folder_path} 获取失败") - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message=f"目标目录 {folder_path} 获取失败", fileitem=fileitem, @@ -282,7 +279,7 @@ class TransHandler: logger.info(f"目标文件文件大小更小,将覆盖:{new_file}") overflag = True else: - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message=f"媒体库存在同名文件,且质量更好", fileitem=fileitem, @@ -294,7 +291,7 @@ class TransHandler: return result elif overwrite_mode == 'never': # 存在不覆盖 - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message=f"媒体库存在同名文件,当前覆盖模式为不覆盖", fileitem=fileitem, @@ -313,13 +310,13 @@ class TransHandler: # 文件不存在,但仅保留最新版本 logger.info( f"当前整理覆盖模式设置为 {overwrite_mode},仅保留最新版本,正在删除已有版本文件 ...") - self.__delete_version_files(target_oper, new_file) + TransHandler.__delete_version_files(target_oper, new_file) else: # 附加文件 总是需要覆盖 overflag = True # 整理文件 - new_item, err_msg = self.__transfer_file(fileitem=fileitem, + new_item, err_msg = TransHandler.__transfer_file(fileitem=fileitem, mediainfo=mediainfo, target_storage=target_storage, target_file=new_file, @@ -330,7 +327,7 @@ class TransHandler: result=result) if not new_item: logger.error(f"文件 {fileitem.path} 整理失败:{err_msg}") - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=False, message=err_msg, fileitem=fileitem, @@ -340,7 +337,7 @@ class TransHandler: return result logger.info(f"文件 {fileitem.path} 整理成功") - self.__update_result(result=result, + TransHandler.__update_result(result=result, success=True, fileitem=fileitem, target_item=new_item, @@ -545,7 +542,8 @@ class TransHandler: 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, transfer_type: str, target_storage: str, target_path: Path, result: TransferInfo) -> Tuple[Optional[FileItem], str]: @@ -580,7 +578,7 @@ class TransHandler: f"Reason: {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, source_oper=source_oper, target_oper=target_oper, @@ -592,7 +590,8 @@ class TransHandler: else: 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, transfer_type: str, target_path: Path, result: TransferInfo) -> Tuple[bool, str]: @@ -611,7 +610,7 @@ class TransHandler: if item.type == "dir": # 递归整理目录 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, source_oper=source_oper, target_oper=target_oper, @@ -623,7 +622,7 @@ class TransHandler: else: # 整理文件 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, source_oper=source_oper, target_oper=target_oper, @@ -631,7 +630,7 @@ class TransHandler: transfer_type=transfer_type) if not new_item: return False, errmsg - self.__update_result( + TransHandler.__update_result( result=result, file_list=[item.path], file_list_new=[new_item.path], @@ -639,7 +638,8 @@ class TransHandler: # 返回成功 return True, "" - def __transfer_file(self, fileitem: FileItem, mediainfo: MediaInfo, + @staticmethod + def __transfer_file(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 = self.__transfer_command(fileitem=fileitem, + new_item, errmsg = TransHandler.__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: - self.__update_result( + TransHandler.__update_result( result=result, file_list=[fileitem.path], file_list_new=[new_item.path],