From 484ecf10c32d62db29daad28182ef758d9857460 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 18 Jun 2024 13:05:11 +0800 Subject: [PATCH] fix api --- app/api/endpoints/dashboard.py | 14 +++++++------- app/api/endpoints/filebrowser.py | 16 +++++++++------- app/api/endpoints/media.py | 6 +++--- app/api/endpoints/subscribe.py | 4 ++-- app/api/endpoints/transfer.py | 4 ++-- app/api/endpoints/webhook.py | 6 +++--- app/api/servarr.py | 32 ++++++++++++++++---------------- app/core/security.py | 32 ++++++++++++++++---------------- app/schemas/file.py | 2 ++ 9 files changed, 60 insertions(+), 56 deletions(-) diff --git a/app/api/endpoints/dashboard.py b/app/api/endpoints/dashboard.py index a452c75b..972177dd 100644 --- a/app/api/endpoints/dashboard.py +++ b/app/api/endpoints/dashboard.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.dashboard import DashboardChain -from app.core.security import verify_token, verify_uri_token +from app.core.security import verify_token, verify_apitoken from app.db import get_db from app.db.models.transferhistory import TransferHistory from app.helper.directory import DirectoryHelper @@ -36,7 +36,7 @@ def statistic(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/statistic2", summary="媒体数量统计(API_TOKEN)", response_model=schemas.Statistic) -def statistic2(_: str = Depends(verify_uri_token)) -> Any: +def statistic2(_: str = Depends(verify_apitoken)) -> Any: """ 查询媒体数量统计信息 API_TOKEN认证(?token=xxx) """ @@ -57,7 +57,7 @@ def storage(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/storage2", summary="存储空间(API_TOKEN)", response_model=schemas.Storage) -def storage2(_: str = Depends(verify_uri_token)) -> Any: +def storage2(_: str = Depends(verify_apitoken)) -> Any: """ 查询存储空间信息 API_TOKEN认证(?token=xxx) """ @@ -94,7 +94,7 @@ def downloader(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/downloader2", summary="下载器信息(API_TOKEN)", response_model=schemas.DownloaderInfo) -def downloader2(_: str = Depends(verify_uri_token)) -> Any: +def downloader2(_: str = Depends(verify_apitoken)) -> Any: """ 查询下载器信息 API_TOKEN认证(?token=xxx) """ @@ -110,7 +110,7 @@ def schedule(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/schedule2", summary="后台服务(API_TOKEN)", response_model=List[schemas.ScheduleInfo]) -def schedule2(_: str = Depends(verify_uri_token)) -> Any: +def schedule2(_: str = Depends(verify_apitoken)) -> Any: """ 查询下载器信息 API_TOKEN认证(?token=xxx) """ @@ -136,7 +136,7 @@ def cpu(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/cpu2", summary="获取当前CPU使用率(API_TOKEN)", response_model=int) -def cpu2(_: str = Depends(verify_uri_token)) -> Any: +def cpu2(_: str = Depends(verify_apitoken)) -> Any: """ 获取当前CPU使用率 API_TOKEN认证(?token=xxx) """ @@ -152,7 +152,7 @@ def memory(_: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/memory2", summary="获取当前内存使用量和使用率(API_TOKEN)", response_model=List[int]) -def memory2(_: str = Depends(verify_uri_token)) -> Any: +def memory2(_: str = Depends(verify_apitoken)) -> Any: """ 获取当前内存使用率 API_TOKEN认证(?token=xxx) """ diff --git a/app/api/endpoints/filebrowser.py b/app/api/endpoints/filebrowser.py index ddc4536e..7bd47022 100644 --- a/app/api/endpoints/filebrowser.py +++ b/app/api/endpoints/filebrowser.py @@ -7,7 +7,7 @@ from starlette.responses import FileResponse, Response from app import schemas from app.core.config import settings -from app.core.security import verify_token, verify_uri_session +from app.core.security import verify_token, verify_uri_token from app.helper.aliyun import AliyunHelper from app.log import logger from app.utils.http import RequestUtils @@ -174,7 +174,7 @@ def delete(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: @router.get("/local/download", summary="下载文件(本地)") -def download(path: str, _: schemas.TokenPayload = Depends(verify_uri_session)) -> Any: +def download(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 下载文件或目录 """ @@ -210,7 +210,7 @@ def rename(path: str, new_name: str, _: schemas.TokenPayload = Depends(verify_to @router.get("/local/image", summary="读取图片(本地)") -def image(path: str, _: schemas.TokenPayload = Depends(verify_uri_session)) -> Any: +def image(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 读取图片 """ @@ -259,7 +259,8 @@ def list_path(path: str, name=fileinfo.get("name"), size=fileinfo.get("size"), extension=fileinfo.get("file_extension"), - modify_time=StringUtils.str_to_timestamp(fileinfo.get("updated_at")) + modify_time=StringUtils.str_to_timestamp(fileinfo.get("updated_at")), + thumbnail=fileinfo.get("thumbnail") )] return [] items = AliyunHelper().list_files(parent_file_id=fileid, order_by=sort) @@ -273,7 +274,8 @@ def list_path(path: str, name=item.get("name"), size=item.get("size"), extension=item.get("file_extension"), - modify_time=StringUtils.str_to_timestamp(item.get("updated_at")) + modify_time=StringUtils.str_to_timestamp(item.get("updated_at")), + thumbnail=item.get("thumbnail") ) for item in items] @@ -308,7 +310,7 @@ def delete(fileid: str, @router.get("/aliyun/download", summary="下载文件(阿里云盘)") def download(fileid: str, - _: schemas.TokenPayload = Depends(verify_uri_session)) -> Any: + _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 下载文件或目录 """ @@ -335,7 +337,7 @@ def rename(fileid: str, new_name: str, _: schemas.TokenPayload = Depends(verify_ @router.get("/aliyun/image", summary="读取图片(阿里云盘)", response_model=schemas.Response) -def image(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_session)) -> Any: +def image(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 读取图片 """ diff --git a/app/api/endpoints/media.py b/app/api/endpoints/media.py index 0dcfbf89..3ac19202 100644 --- a/app/api/endpoints/media.py +++ b/app/api/endpoints/media.py @@ -8,7 +8,7 @@ from app.chain.media import MediaChain from app.core.config import settings from app.core.context import Context from app.core.metainfo import MetaInfo, MetaInfoPath -from app.core.security import verify_token, verify_uri_token +from app.core.security import verify_token, verify_apitoken from app.schemas import MediaType router = APIRouter() @@ -32,7 +32,7 @@ def recognize(title: str, @router.get("/recognize2", summary="识别种子媒体信息(API_TOKEN)", response_model=schemas.Context) def recognize2(title: str, subtitle: str = None, - _: str = Depends(verify_uri_token)) -> Any: + _: str = Depends(verify_apitoken)) -> Any: """ 根据标题、副标题识别媒体信息 API_TOKEN认证(?token=xxx) """ @@ -55,7 +55,7 @@ def recognize_file(path: str, @router.get("/recognize_file2", summary="识别文件媒体信息(API_TOKEN)", response_model=schemas.Context) def recognize_file2(path: str, - _: str = Depends(verify_uri_token)) -> Any: + _: str = Depends(verify_apitoken)) -> Any: """ 根据文件路径识别媒体信息 API_TOKEN认证(?token=xxx) """ diff --git a/app/api/endpoints/subscribe.py b/app/api/endpoints/subscribe.py index 18bb5a69..beaf3b94 100644 --- a/app/api/endpoints/subscribe.py +++ b/app/api/endpoints/subscribe.py @@ -10,7 +10,7 @@ from app.chain.subscribe import SubscribeChain from app.core.config import settings from app.core.context import MediaInfo from app.core.metainfo import MetaInfo -from app.core.security import verify_token, verify_uri_token +from app.core.security import verify_token, verify_apitoken from app.db import get_db from app.db.models.subscribe import Subscribe from app.db.models.subscribehistory import SubscribeHistory @@ -52,7 +52,7 @@ def read_subscribes( @router.get("/list", summary="查询所有订阅(API_TOKEN)", response_model=List[schemas.Subscribe]) -def list_subscribes(_: str = Depends(verify_uri_token)) -> Any: +def list_subscribes(_: str = Depends(verify_apitoken)) -> Any: """ 查询所有订阅 API_TOKEN认证(?token=xxx) """ diff --git a/app/api/endpoints/transfer.py b/app/api/endpoints/transfer.py index b791af15..c9afb507 100644 --- a/app/api/endpoints/transfer.py +++ b/app/api/endpoints/transfer.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.transfer import TransferChain -from app.core.security import verify_token, verify_uri_token +from app.core.security import verify_token, verify_apitoken from app.db import get_db from app.db.models.transferhistory import TransferHistory from app.schemas import MediaType @@ -110,7 +110,7 @@ def manual_transfer(path: str = None, @router.get("/now", summary="立即执行下载器文件整理", response_model=schemas.Response) -def now(_: str = Depends(verify_uri_token)) -> Any: +def now(_: str = Depends(verify_apitoken)) -> Any: """ 立即执行下载器文件整理 API_TOKEN认证(?token=xxx) """ diff --git a/app/api/endpoints/webhook.py b/app/api/endpoints/webhook.py index f516dcb2..6be98a47 100644 --- a/app/api/endpoints/webhook.py +++ b/app/api/endpoints/webhook.py @@ -4,7 +4,7 @@ from fastapi import APIRouter, BackgroundTasks, Request, Depends from app import schemas from app.chain.webhook import WebhookChain -from app.core.security import verify_uri_token +from app.core.security import verify_apitoken router = APIRouter() @@ -19,7 +19,7 @@ def start_webhook_chain(body: Any, form: Any, args: Any): @router.post("/", summary="Webhook消息响应", response_model=schemas.Response) async def webhook_message(background_tasks: BackgroundTasks, request: Request, - _: str = Depends(verify_uri_token) + _: str = Depends(verify_apitoken) ) -> Any: """ Webhook响应 @@ -33,7 +33,7 @@ async def webhook_message(background_tasks: BackgroundTasks, @router.get("/", summary="Webhook消息响应", response_model=schemas.Response) def webhook_message(background_tasks: BackgroundTasks, - request: Request, _: str = Depends(verify_uri_token)) -> Any: + request: Request, _: str = Depends(verify_apitoken)) -> Any: """ Webhook响应 """ diff --git a/app/api/servarr.py b/app/api/servarr.py index b1216ac3..791feecc 100644 --- a/app/api/servarr.py +++ b/app/api/servarr.py @@ -7,7 +7,7 @@ from app import schemas from app.chain.media import MediaChain from app.chain.subscribe import SubscribeChain from app.core.metainfo import MetaInfo -from app.core.security import verify_uri_apikey +from app.core.security import verify_apikey from app.db import get_db from app.db.models.subscribe import Subscribe from app.schemas import RadarrMovie, SonarrSeries @@ -18,7 +18,7 @@ arr_router = APIRouter(tags=['servarr']) @arr_router.get("/system/status", summary="系统状态") -def arr_system_status(_: str = Depends(verify_uri_apikey)) -> Any: +def arr_system_status(_: str = Depends(verify_apikey)) -> Any: """ 模拟Radarr、Sonarr系统状态 """ @@ -72,7 +72,7 @@ def arr_system_status(_: str = Depends(verify_uri_apikey)) -> Any: @arr_router.get("/qualityProfile", summary="质量配置") -def arr_qualityProfile(_: str = Depends(verify_uri_apikey)) -> Any: +def arr_qualityProfile(_: str = Depends(verify_apikey)) -> Any: """ 模拟Radarr、Sonarr质量配置 """ @@ -113,7 +113,7 @@ def arr_qualityProfile(_: str = Depends(verify_uri_apikey)) -> Any: @arr_router.get("/rootfolder", summary="根目录") -def arr_rootfolder(_: str = Depends(verify_uri_apikey)) -> Any: +def arr_rootfolder(_: str = Depends(verify_apikey)) -> Any: """ 模拟Radarr、Sonarr根目录 """ @@ -129,7 +129,7 @@ def arr_rootfolder(_: str = Depends(verify_uri_apikey)) -> Any: @arr_router.get("/tag", summary="标签") -def arr_tag(_: str = Depends(verify_uri_apikey)) -> Any: +def arr_tag(_: str = Depends(verify_apikey)) -> Any: """ 模拟Radarr、Sonarr标签 """ @@ -142,7 +142,7 @@ def arr_tag(_: str = Depends(verify_uri_apikey)) -> Any: @arr_router.get("/languageprofile", summary="语言") -def arr_languageprofile(_: str = Depends(verify_uri_apikey)) -> Any: +def arr_languageprofile(_: str = Depends(verify_apikey)) -> Any: """ 模拟Radarr、Sonarr语言 """ @@ -168,7 +168,7 @@ def arr_languageprofile(_: str = Depends(verify_uri_apikey)) -> Any: @arr_router.get("/movie", summary="所有订阅电影", response_model=List[schemas.RadarrMovie]) -def arr_movies(_: str = Depends(verify_uri_apikey), db: Session = Depends(get_db)) -> Any: +def arr_movies(_: str = Depends(verify_apikey), db: Session = Depends(get_db)) -> Any: """ 查询Rardar电影 """ @@ -259,7 +259,7 @@ def arr_movies(_: str = Depends(verify_uri_apikey), db: Session = Depends(get_db @arr_router.get("/movie/lookup", summary="查询电影", response_model=List[schemas.RadarrMovie]) -def arr_movie_lookup(term: str, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_movie_lookup(term: str, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 查询Rardar电影 term: `tmdb:${id}` 存在和不存在均不能返回错误 @@ -305,7 +305,7 @@ def arr_movie_lookup(term: str, db: Session = Depends(get_db), _: str = Depends( @arr_router.get("/movie/{mid}", summary="电影订阅详情", response_model=schemas.RadarrMovie) -def arr_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 查询Rardar电影订阅 """ @@ -333,7 +333,7 @@ def arr_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(verify_u @arr_router.post("/movie", summary="新增电影订阅") def arr_add_movie(movie: RadarrMovie, db: Session = Depends(get_db), - _: str = Depends(verify_uri_apikey) + _: str = Depends(verify_apikey) ) -> Any: """ 新增Rardar电影订阅 @@ -362,7 +362,7 @@ def arr_add_movie(movie: RadarrMovie, @arr_router.delete("/movie/{mid}", summary="删除电影订阅", response_model=schemas.Response) -def arr_remove_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_remove_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 删除Rardar电影订阅 """ @@ -378,7 +378,7 @@ def arr_remove_movie(mid: int, db: Session = Depends(get_db), _: str = Depends(v @arr_router.get("/series", summary="所有剧集", response_model=List[schemas.SonarrSeries]) -def arr_series(_: str = Depends(verify_uri_apikey), db: Session = Depends(get_db)) -> Any: +def arr_series(_: str = Depends(verify_apikey), db: Session = Depends(get_db)) -> Any: """ 查询Sonarr剧集 """ @@ -514,7 +514,7 @@ def arr_series(_: str = Depends(verify_uri_apikey), db: Session = Depends(get_db @arr_router.get("/series/lookup", summary="查询剧集") -def arr_series_lookup(term: str, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_series_lookup(term: str, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 查询Sonarr剧集 term: `tvdb:${id}` title """ @@ -603,7 +603,7 @@ def arr_series_lookup(term: str, db: Session = Depends(get_db), _: str = Depends @arr_router.get("/series/{tid}", summary="剧集详情") -def arr_serie(tid: int, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_serie(tid: int, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 查询Sonarr剧集 """ @@ -639,7 +639,7 @@ def arr_serie(tid: int, db: Session = Depends(get_db), _: str = Depends(verify_u @arr_router.post("/series", summary="新增剧集订阅") def arr_add_series(tv: schemas.SonarrSeries, db: Session = Depends(get_db), - _: str = Depends(verify_uri_apikey)) -> Any: + _: str = Depends(verify_apikey)) -> Any: """ 新增Sonarr剧集订阅 """ @@ -681,7 +681,7 @@ def arr_add_series(tv: schemas.SonarrSeries, @arr_router.delete("/series/{tid}", summary="删除剧集订阅") -def arr_remove_series(tid: int, db: Session = Depends(get_db), _: str = Depends(verify_uri_apikey)) -> Any: +def arr_remove_series(tid: int, db: Session = Depends(get_db), _: str = Depends(verify_apikey)) -> Any: """ 删除Sonarr剧集订阅 """ diff --git a/app/core/security.py b/app/core/security.py index 54f48365..1888a13a 100644 --- a/app/core/security.py +++ b/app/core/security.py @@ -61,21 +61,21 @@ def verify_token(token: str = Depends(reusable_oauth2)) -> schemas.TokenPayload: ) -def get_token(token: str = None) -> str: +def __get_token(token: str = None) -> str: """ 从请求URL中获取token """ return token -def get_apikey(apikey: str = None, x_api_key: Annotated[str | None, Header()] = None) -> str: +def __get_apikey(apikey: str = None, x_api_key: Annotated[str | None, Header()] = None) -> str: """ 从请求URL中获取apikey """ return apikey or x_api_key -def verify_uri_token(token: str = Depends(get_token)) -> str: +def verify_apitoken(token: str = Depends(__get_token)) -> str: """ 通过依赖项使用token进行身份认证 """ @@ -87,19 +87,7 @@ def verify_uri_token(token: str = Depends(get_token)) -> str: return token -def verify_uri_session(token: str = Depends(get_token)) -> str: - """ - 通过依赖项使用token进行身份认证 - """ - if not verify_token(token): - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="token校验不通过" - ) - return token - - -def verify_uri_apikey(apikey: str = Depends(get_apikey)) -> str: +def verify_apikey(apikey: str = Depends(__get_apikey)) -> str: """ 通过依赖项使用apikey进行身份认证 """ @@ -111,6 +99,18 @@ def verify_uri_apikey(apikey: str = Depends(get_apikey)) -> str: return apikey +def verify_uri_token(token: str = Depends(__get_token)) -> str: + """ + 通过依赖项使用token进行身份认证 + """ + if not verify_token(token): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="token校验不通过" + ) + return token + + def verify_password(plain_password: str, hashed_password: str) -> bool: return pwd_context.verify(plain_password, hashed_password) diff --git a/app/schemas/file.py b/app/schemas/file.py index 7978aaf3..3a6af277 100644 --- a/app/schemas/file.py +++ b/app/schemas/file.py @@ -24,3 +24,5 @@ class FileItem(BaseModel): fileid: Optional[str] = None # 父ID parent_fileid: Optional[str] = None + # 缩略图 + thumbnail: Optional[str] = None