From 62df3f7c84fc69391460430dd0749d9f8436ea14 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 3 Sep 2023 13:04:08 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=96=87=E4=BB=B6=E8=AF=86=E5=88=ABAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/media.py | 16 +++++++++++++++- app/chain/media.py | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/api/endpoints/media.py b/app/api/endpoints/media.py index e523b6b9..2e49f2ab 100644 --- a/app/api/endpoints/media.py +++ b/app/api/endpoints/media.py @@ -17,7 +17,7 @@ from app.schemas import MediaType router = APIRouter() -@router.get("/recognize", summary="识别媒体信息", response_model=schemas.Context) +@router.get("/recognize", summary="识别媒体信息(种子)", response_model=schemas.Context) def recognize(title: str, subtitle: str = None, db: Session = Depends(get_db), @@ -32,6 +32,20 @@ def recognize(title: str, return schemas.Context() +@router.get("/recognize_file", summary="识别媒体信息(文件)", response_model=schemas.Context) +def recognize(path: str, + db: Session = Depends(get_db), + _: schemas.TokenPayload = Depends(verify_token)) -> Any: + """ + 根据文件路径识别媒体信息 + """ + # 识别媒体信息 + context = MediaChain(db).recognize_by_path(path) + if context: + return context.to_dict() + return schemas.Context() + + @router.get("/search", summary="搜索媒体信息", response_model=List[schemas.MediaInfo]) def search_by_title(title: str, page: int = 1, diff --git a/app/chain/media.py b/app/chain/media.py index baa5aa5e..243b7071 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -1,3 +1,4 @@ +from pathlib import Path from typing import Optional, List, Tuple from app.chain import ChainBase @@ -31,6 +32,29 @@ class MediaChain(ChainBase): # 返回上下文 return Context(meta_info=metainfo, media_info=mediainfo) + def recognize_by_path(self, path: str) -> Optional[Context]: + """ + 根据文件路径识别媒体信息 + """ + logger.info(f'开始识别媒体信息,文件:{path} ...') + file_path = Path(path) + # 上级目录元数据 + dir_meta = MetaInfo(title=file_path.parent.name) + # 文件元数据,不包含后缀 + file_meta = MetaInfo(title=file_path.stem) + # 合并元数据 + file_meta.merge(dir_meta) + # 识别媒体信息 + mediainfo = self.recognize_media(meta=file_meta) + if not mediainfo: + logger.warn(f'{path} 未识别到媒体信息') + return Context(meta_info=file_meta) + logger.info(f'{path} 识别到媒体信息:{mediainfo.type.value} {mediainfo.title_year}') + # 更新媒体图片 + self.obtain_images(mediainfo=mediainfo) + # 返回上下文 + return Context(meta_info=file_meta, media_info=mediainfo) + def search(self, title: str) -> Tuple[MetaBase, List[MediaInfo]]: """ 搜索媒体信息