diff --git a/app/agent/tools/impl/recognize_media.py b/app/agent/tools/impl/recognize_media.py index 1a0a33e7..c8c82ee8 100644 --- a/app/agent/tools/impl/recognize_media.py +++ b/app/agent/tools/impl/recognize_media.py @@ -49,8 +49,7 @@ class RecognizeMediaTool(MoviePilotTool): try: media_chain = MediaChain() - context = None - + # 根据提供的参数选择识别方式 if path: # 文件路径识别 diff --git a/app/agent/tools/impl/scrape_metadata.py b/app/agent/tools/impl/scrape_metadata.py index 1d31ec41..9b6fe829 100644 --- a/app/agent/tools/impl/scrape_metadata.py +++ b/app/agent/tools/impl/scrape_metadata.py @@ -8,7 +8,6 @@ from pydantic import BaseModel, Field from app.agent.tools.base import MoviePilotTool from app.chain.media import MediaChain -from app.core.metainfo import MetaInfoPath from app.log import logger from app.schemas import FileItem @@ -80,8 +79,7 @@ class ScrapeMetadataTool(MoviePilotTool): # 检查本地存储路径是否存在 if storage == "local": - scrape_path = Path(path) - if not scrape_path.exists(): + if not Path(path).exists(): return json.dumps( {"success": False, "message": f"刮削路径不存在: {path}"}, ensure_ascii=False, @@ -89,14 +87,12 @@ class ScrapeMetadataTool(MoviePilotTool): # 识别媒体信息 media_chain = MediaChain() - scrape_path = Path(path) - meta = MetaInfoPath(scrape_path) - mediainfo = await media_chain.async_recognize_by_meta( - meta, + context = await media_chain.async_recognize_by_path( + path, obtain_images=True, ) - if not mediainfo: + if not context or not context.media_info: return json.dumps( { "success": False, @@ -111,8 +107,8 @@ class ScrapeMetadataTool(MoviePilotTool): "storage", media_chain.scrape_metadata, fileitem=fileitem, - meta=meta, - mediainfo=mediainfo, + meta=context.meta_info, + mediainfo=context.media_info, overwrite=overwrite, ) @@ -122,11 +118,11 @@ class ScrapeMetadataTool(MoviePilotTool): "message": f"{path} 刮削完成", "path": path, "media_info": { - "title": mediainfo.title, - "year": mediainfo.year, - "type": mediainfo.type.value if mediainfo.type else None, - "tmdb_id": mediainfo.tmdb_id, - "season": mediainfo.season, + "title": context.media_info.title, + "year": context.media_info.year, + "type": context.media_info.type.value if context.media_info.type else None, + "tmdb_id": context.media_info.tmdb_id, + "season": context.media_info.season, }, }, ensure_ascii=False, diff --git a/app/api/endpoints/media.py b/app/api/endpoints/media.py index f4028f5b..f130faaf 100644 --- a/app/api/endpoints/media.py +++ b/app/api/endpoints/media.py @@ -9,7 +9,7 @@ from app.chain.tmdb import TmdbChain from app.core.config import settings from app.core.context import Context from app.core.event import eventmanager -from app.core.metainfo import MetaInfo, MetaInfoPath +from app.core.metainfo import MetaInfo from app.core.security import verify_token, verify_apitoken from app.db.models import User from app.db.user_oper import get_current_active_user, get_current_active_superuser @@ -121,16 +121,19 @@ def scrape(fileitem: schemas.FileItem, return schemas.Response(success=False, message="刮削路径无效") chain = MediaChain() # 识别媒体信息 - scrape_path = Path(fileitem.path) - meta = MetaInfoPath(scrape_path) - mediainfo = chain.recognize_by_meta(meta, obtain_images=True) - if not mediainfo: + context = chain.recognize_by_path(fileitem.path, obtain_images=True) + if not context or not context.media_info: return schemas.Response(success=False, message="刮削失败,无法识别媒体信息") if storage == "local": - if not scrape_path.exists(): + if not Path(fileitem.path).exists(): return schemas.Response(success=False, message="刮削路径不存在") # 手动刮削 (暂时使用同步版本,可以后续优化为异步) - chain.scrape_metadata(fileitem=fileitem, meta=meta, mediainfo=mediainfo, overwrite=True) + chain.scrape_metadata( + fileitem=fileitem, + meta=context.meta_info, + mediainfo=context.media_info, + overwrite=True + ) return schemas.Response(success=True, message=f"{fileitem.path} 刮削完成") diff --git a/app/api/endpoints/storage.py b/app/api/endpoints/storage.py index 8a47bc47..8ecaadf8 100644 --- a/app/api/endpoints/storage.py +++ b/app/api/endpoints/storage.py @@ -10,7 +10,6 @@ from app.chain.media import MediaChain from app.chain.storage import StorageChain from app.chain.transfer import TransferChain from app.core.config import settings -from app.core.metainfo import MetaInfoPath from app.core.security import verify_token from app.db.models import User from app.db.user_oper import get_current_active_superuser, get_current_active_superuser_async @@ -199,15 +198,17 @@ def rename(fileitem: schemas.FileItem, if f".{sub_file.extension.lower()}" not in media_exts: continue sub_path = Path(f"{fileitem.path}{sub_file.name}") - meta = MetaInfoPath(sub_path) - mediainfo = MediaChain().recognize_by_meta( - meta, + context = MediaChain().recognize_by_path( + sub_path, obtain_images=False, ) - if not mediainfo: + if not context or not context.media_info: progress.end() return schemas.Response(success=False, message=f"{sub_path.name} 未识别到媒体信息") - new_path = transferchain.recommend_name(meta=meta, mediainfo=mediainfo) + new_path = transferchain.recommend_name( + meta=context.meta_info, + mediainfo=context.media_info + ) if not new_path: progress.end() return schemas.Response(success=False, message=f"{sub_path.name} 未识别到新名称") diff --git a/app/api/endpoints/transfer.py b/app/api/endpoints/transfer.py index 080292d5..bcbe8e01 100644 --- a/app/api/endpoints/transfer.py +++ b/app/api/endpoints/transfer.py @@ -9,7 +9,6 @@ from app.chain.media import MediaChain from app.chain.storage import StorageChain from app.chain.transfer import TransferChain from app.core.config import settings, global_vars -from app.core.metainfo import MetaInfoPath from app.core.security import verify_token, verify_apitoken from app.db import get_db from app.db.models import User @@ -30,19 +29,18 @@ def query_name(path: str, filetype: str, :param filetype: 文件类型 :param _: Token校验 """ - meta = MetaInfoPath(Path(path)) - mediainfo = MediaChain().recognize_by_meta( - meta, + context = MediaChain().recognize_by_path( + path, obtain_images=False, ) - if not mediainfo: + if not context or not context.media_info: return schemas.Response(success=False, message="未识别到媒体信息") - new_path = TransferChain().recommend_name(meta=meta, mediainfo=mediainfo) + new_path = TransferChain().recommend_name(meta=context.meta_info, mediainfo=context.media_info) if not new_path: return schemas.Response(success=False, message="未识别到新名称") if filetype == "dir": media_path = DirectoryHelper.get_media_root_path( - rename_format=settings.RENAME_FORMAT(mediainfo.type), + rename_format=settings.RENAME_FORMAT(context.media_info.type), rename_path=Path(new_path), ) if media_path: diff --git a/app/workflow/actions/scrape_file.py b/app/workflow/actions/scrape_file.py index fc7914f3..198ae8c5 100644 --- a/app/workflow/actions/scrape_file.py +++ b/app/workflow/actions/scrape_file.py @@ -1,12 +1,9 @@ -from pathlib import Path - -from app.workflow.actions import BaseAction -from app.core.config import global_vars -from app.schemas import ActionParams, ActionContext from app.chain.media import MediaChain from app.chain.storage import StorageChain -from app.core.metainfo import MetaInfoPath +from app.core.config import global_vars from app.log import logger +from app.schemas import ActionParams, ActionContext +from app.workflow.actions import BaseAction class ScrapeFileParams(ActionParams): @@ -63,17 +60,20 @@ class ScrapeFileAction(BaseAction): if self.check_cache(workflow_id, cache_key): logger.info(f"{fileitem.path} 已刮削过,跳过") continue - meta = MetaInfoPath(Path(fileitem.path)) mediachain = MediaChain() - mediainfo = mediachain.recognize_by_meta( - meta, + context = mediachain.recognize_by_path( + fileitem.path, obtain_images=True, ) - if not mediainfo: + if not context or not context.media_info: _failed_count += 1 logger.info(f"{fileitem.path} 未识别到媒体信息,无法刮削") continue - mediachain.scrape_metadata(fileitem=fileitem, meta=meta, mediainfo=mediainfo) + mediachain.scrape_metadata( + fileitem=fileitem, + meta=context.meta_info, + mediainfo=context.media_info + ) self._scraped_files.append(fileitem) # 保存缓存 self.save_cache(workflow_id, cache_key)