fix api path

This commit is contained in:
jxxghp 2024-06-18 19:19:32 +08:00
parent 19a56f7d24
commit 354d5977e0
3 changed files with 168 additions and 164 deletions

View File

@ -2,7 +2,7 @@ from fastapi import APIRouter
from app.api.endpoints import login, user, site, message, webhook, subscribe, \ from app.api.endpoints import login, user, site, message, webhook, subscribe, \
media, douban, search, plugin, tmdb, history, system, download, dashboard, \ media, douban, search, plugin, tmdb, history, system, download, dashboard, \
filebrowser, transfer, mediaserver, bangumi, aliyun local, transfer, mediaserver, bangumi, aliyun
api_router = APIRouter() api_router = APIRouter()
api_router.include_router(login.router, prefix="/login", tags=["login"]) api_router.include_router(login.router, prefix="/login", tags=["login"])
@ -20,7 +20,7 @@ api_router.include_router(system.router, prefix="/system", tags=["system"])
api_router.include_router(plugin.router, prefix="/plugin", tags=["plugin"]) api_router.include_router(plugin.router, prefix="/plugin", tags=["plugin"])
api_router.include_router(download.router, prefix="/download", tags=["download"]) api_router.include_router(download.router, prefix="/download", tags=["download"])
api_router.include_router(dashboard.router, prefix="/dashboard", tags=["dashboard"]) api_router.include_router(dashboard.router, prefix="/dashboard", tags=["dashboard"])
api_router.include_router(filebrowser.router, prefix="/filebrowser", tags=["filebrowser"]) api_router.include_router(local.router, prefix="/local", tags=["local"])
api_router.include_router(transfer.router, prefix="/transfer", tags=["transfer"]) api_router.include_router(transfer.router, prefix="/transfer", tags=["transfer"])
api_router.include_router(mediaserver.router, prefix="/mediaserver", tags=["mediaserver"]) api_router.include_router(mediaserver.router, prefix="/mediaserver", tags=["mediaserver"])
api_router.include_router(bangumi.router, prefix="/bangumi", tags=["bangumi"]) api_router.include_router(bangumi.router, prefix="/bangumi", tags=["bangumi"])

View File

@ -1,10 +1,16 @@
from typing import Any from pathlib import Path
from typing import Any, List
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from starlette.responses import Response
from app import schemas from app import schemas
from app.core.security import verify_token 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, verify_uri_token
from app.helper.aliyun import AliyunHelper from app.helper.aliyun import AliyunHelper
from app.utils.string import StringUtils
router = APIRouter() router = APIRouter()
@ -46,3 +52,154 @@ def userinfo(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
if info: if info:
return schemas.Response(success=True, data=info) return schemas.Response(success=True, data=info)
return schemas.Response(success=False) return schemas.Response(success=False)
@router.get("/list", summary="所有目录和文件(阿里云盘)", response_model=List[schemas.FileItem])
def list_aliyun(path: str,
fileid: str,
filetype: str = "dir",
sort: str = 'updated_at',
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
查询当前目录下所有目录和文件
:param path: 当前路径
:param fileid: 文件ID
:param filetype: 文件类型
:param sort: 排序方式name:按名称排序time:按修改时间排序
:param _: token
:return: 所有目录和文件
"""
if not fileid:
return []
if not path:
path = "/"
if sort == "time":
sort = "updated_at"
if filetype == "file":
fileinfo = AliyunHelper().get_file_detail(fileid)
if fileinfo:
return [schemas.FileItem(
fileid=fileinfo.get("file_id"),
parent_fileid=fileinfo.get("parent_file_id"),
type="file",
path=f"{path}{fileinfo.get('name')}",
name=fileinfo.get("name"),
size=fileinfo.get("size"),
extension=fileinfo.get("file_extension"),
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)
if not items:
return []
return [schemas.FileItem(
fileid=item.get("file_id"),
parent_fileid=item.get("parent_file_id"),
type="dir" if item.get("type") == "folder" else "file",
path=f"{path}{item.get('name')}" + "/" if item.get("type") == "folder" else "",
name=item.get("name"),
size=item.get("size"),
extension=item.get("file_extension"),
modify_time=StringUtils.str_to_timestamp(item.get("updated_at")),
thumbnail=item.get("thumbnail")
) for item in items]
@router.get("/mkdir", summary="创建目录(阿里云盘)", response_model=schemas.Response)
def mkdir_aliyun(fileid: str,
name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
创建目录
"""
if not fileid or not name:
return schemas.Response(success=False)
result = AliyunHelper().create_folder(parent_file_id=fileid, name=name)
if result:
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/delete", summary="删除文件或目录(阿里云盘)", response_model=schemas.Response)
def delete_aliyun(fileid: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
删除文件或目录
"""
if not fileid:
return schemas.Response(success=False)
result = AliyunHelper().delete_file(fileid)
if result:
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/download", summary="下载文件(阿里云盘)")
def download_aliyun(fileid: str,
_: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
下载文件或目录
"""
if not fileid:
return schemas.Response(success=False)
url = AliyunHelper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)
@router.get("/rename", summary="重命名文件或目录(阿里云盘)", response_model=schemas.Response)
def rename_aliyun(fileid: str, new_name: str, path: str,
recursive: bool = False,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
重命名文件或目录
"""
if not fileid or not new_name:
return schemas.Response(success=False)
result = AliyunHelper().rename_file(fileid, new_name)
if result:
if recursive:
transferchain = TransferChain()
media_exts = settings.RMT_MEDIAEXT + settings.RMT_SUBEXT + settings.RMT_AUDIO_TRACK_EXT
# 递归修改目录内文件(智能识别命名)
sub_files: List[schemas.FileItem] = list_aliyun(path=path, fileid=fileid)
for sub_file in sub_files:
if sub_file.type == "dir":
continue
if not sub_file.extension:
continue
if f".{sub_file.extension.lower()}" not in media_exts:
continue
sub_path = Path(f"{path}{sub_file.name}")
meta = MetaInfoPath(sub_path)
mediainfo = transferchain.recognize_media(meta)
if not mediainfo:
return schemas.Response(success=False, message=f"{sub_path.name} 未识别到媒体信息")
new_path = transferchain.recommend_name(meta=meta, mediainfo=mediainfo)
if not new_path:
return schemas.Response(success=False, message=f"{sub_path.name} 未识别到新名称")
ret: schemas.Response = rename_aliyun(fileid=sub_file.fileid,
path=path,
new_name=Path(new_path).name,
recursive=False)
if not ret.success:
return schemas.Response(success=False, message=f"{sub_path.name} 重命名失败!")
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/image", summary="读取图片(阿里云盘)", response_model=schemas.Response)
def image_aliyun(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
读取图片
"""
if not fileid:
return schemas.Response(success=False)
url = AliyunHelper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)

View File

@ -10,9 +10,7 @@ from app.chain.transfer import TransferChain
from app.core.config import settings from app.core.config import settings
from app.core.metainfo import MetaInfoPath from app.core.metainfo import MetaInfoPath
from app.core.security import verify_token, verify_uri_token from app.core.security import verify_token, verify_uri_token
from app.helper.aliyun import AliyunHelper
from app.log import logger from app.log import logger
from app.utils.string import StringUtils
from app.utils.system import SystemUtils from app.utils.system import SystemUtils
router = APIRouter() router = APIRouter()
@ -20,7 +18,7 @@ router = APIRouter()
IMAGE_TYPES = [".jpg", ".png", ".gif", ".bmp", ".jpeg", ".webp"] IMAGE_TYPES = [".jpg", ".png", ".gif", ".bmp", ".jpeg", ".webp"]
@router.get("/local/list", summary="所有目录和文件(本地)", response_model=List[schemas.FileItem]) @router.get("/list", summary="所有目录和文件(本地)", response_model=List[schemas.FileItem])
def list_local(path: str, def list_local(path: str,
sort: str = 'time', sort: str = 'time',
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
@ -102,7 +100,7 @@ def list_local(path: str,
return ret_items return ret_items
@router.get("/local/listdir", summary="所有目录(本地,不含文件)", response_model=List[schemas.FileItem]) @router.get("/listdir", summary="所有目录(本地,不含文件)", response_model=List[schemas.FileItem])
def list_local_dir(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: def list_local_dir(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
查询当前目录下所有目录 查询当前目录下所有目录
@ -143,7 +141,7 @@ def list_local_dir(path: str, _: schemas.TokenPayload = Depends(verify_token)) -
return ret_items return ret_items
@router.get("/local/mkdir", summary="创建目录(本地)", response_model=schemas.Response) @router.get("/mkdir", summary="创建目录(本地)", response_model=schemas.Response)
def mkdir_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: def mkdir_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
创建目录 创建目录
@ -157,7 +155,7 @@ def mkdir_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> A
return schemas.Response(success=True) return schemas.Response(success=True)
@router.get("/local/delete", summary="删除文件或目录(本地)", response_model=schemas.Response) @router.get("/delete", summary="删除文件或目录(本地)", response_model=schemas.Response)
def delete_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: def delete_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any:
""" """
删除文件或目录 删除文件或目录
@ -174,7 +172,7 @@ def delete_local(path: str, _: schemas.TokenPayload = Depends(verify_token)) ->
return schemas.Response(success=True) return schemas.Response(success=True)
@router.get("/local/download", summary="下载文件(本地)") @router.get("/download", summary="下载文件(本地)")
def download_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: def download_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
""" """
下载文件或目录 下载文件或目录
@ -196,7 +194,7 @@ def download_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token
return reponse return reponse
@router.get("/local/rename", summary="重命名文件或目录(本地)", response_model=schemas.Response) @router.get("/rename", summary="重命名文件或目录(本地)", response_model=schemas.Response)
def rename_local(path: str, new_name: str, def rename_local(path: str, new_name: str,
recursive: bool = False, recursive: bool = False,
_: schemas.TokenPayload = Depends(verify_token)) -> Any: _: schemas.TokenPayload = Depends(verify_token)) -> Any:
@ -235,7 +233,7 @@ def rename_local(path: str, new_name: str,
return schemas.Response(success=True) return schemas.Response(success=True)
@router.get("/local/image", summary="读取图片(本地)") @router.get("/image", summary="读取图片(本地)")
def image_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: def image_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
""" """
读取图片 读取图片
@ -251,154 +249,3 @@ def image_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token))
if path_obj.suffix.lower() not in IMAGE_TYPES: if path_obj.suffix.lower() not in IMAGE_TYPES:
return None return None
return Response(content=path_obj.read_bytes(), media_type="image/jpeg") return Response(content=path_obj.read_bytes(), media_type="image/jpeg")
@router.get("/aliyun/list", summary="所有目录和文件(阿里云盘)", response_model=List[schemas.FileItem])
def list_aliyun(path: str,
fileid: str,
filetype: str = "dir",
sort: str = 'updated_at',
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
查询当前目录下所有目录和文件
:param path: 当前路径
:param fileid: 文件ID
:param filetype: 文件类型
:param sort: 排序方式name:按名称排序time:按修改时间排序
:param _: token
:return: 所有目录和文件
"""
if not fileid:
return []
if not path:
path = "/"
if sort == "time":
sort = "updated_at"
if filetype == "file":
fileinfo = AliyunHelper().get_file_detail(fileid)
if fileinfo:
return [schemas.FileItem(
fileid=fileinfo.get("file_id"),
parent_fileid=fileinfo.get("parent_file_id"),
type="file",
path=f"{path}{fileinfo.get('name')}",
name=fileinfo.get("name"),
size=fileinfo.get("size"),
extension=fileinfo.get("file_extension"),
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)
if not items:
return []
return [schemas.FileItem(
fileid=item.get("file_id"),
parent_fileid=item.get("parent_file_id"),
type="dir" if item.get("type") == "folder" else "file",
path=f"{path}{item.get('name')}" + "/" if item.get("type") == "folder" else "",
name=item.get("name"),
size=item.get("size"),
extension=item.get("file_extension"),
modify_time=StringUtils.str_to_timestamp(item.get("updated_at")),
thumbnail=item.get("thumbnail")
) for item in items]
@router.get("/aliyun/mkdir", summary="创建目录(阿里云盘)", response_model=schemas.Response)
def mkdir_aliyun(fileid: str,
name: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
创建目录
"""
if not fileid or not name:
return schemas.Response(success=False)
result = AliyunHelper().create_folder(parent_file_id=fileid, name=name)
if result:
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/aliyun/delete", summary="删除文件或目录(阿里云盘)", response_model=schemas.Response)
def delete_aliyun(fileid: str,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
删除文件或目录
"""
if not fileid:
return schemas.Response(success=False)
result = AliyunHelper().delete_file(fileid)
if result:
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/aliyun/download", summary="下载文件(阿里云盘)")
def download_aliyun(fileid: str,
_: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
下载文件或目录
"""
if not fileid:
return schemas.Response(success=False)
url = AliyunHelper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)
@router.get("/aliyun/rename", summary="重命名文件或目录(阿里云盘)", response_model=schemas.Response)
def rename_aliyun(fileid: str, new_name: str, path: str,
recursive: bool = False,
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
重命名文件或目录
"""
if not fileid or not new_name:
return schemas.Response(success=False)
result = AliyunHelper().rename_file(fileid, new_name)
if result:
if recursive:
transferchain = TransferChain()
media_exts = settings.RMT_MEDIAEXT + settings.RMT_SUBEXT + settings.RMT_AUDIO_TRACK_EXT
# 递归修改目录内文件(智能识别命名)
sub_files: List[schemas.FileItem] = list_aliyun(path=path, fileid=fileid)
for sub_file in sub_files:
if sub_file.type == "dir":
continue
if not sub_file.extension:
continue
if f".{sub_file.extension.lower()}" not in media_exts:
continue
sub_path = Path(f"{path}{sub_file.name}")
meta = MetaInfoPath(sub_path)
mediainfo = transferchain.recognize_media(meta)
if not mediainfo:
return schemas.Response(success=False, message=f"{sub_path.name} 未识别到媒体信息")
new_path = transferchain.recommend_name(meta=meta, mediainfo=mediainfo)
if not new_path:
return schemas.Response(success=False, message=f"{sub_path.name} 未识别到新名称")
ret: schemas.Response = rename_aliyun(fileid=sub_file.fileid,
path=path,
new_name=Path(new_path).name,
recursive=False)
if not ret.success:
return schemas.Response(success=False, message=f"{sub_path.name} 重命名失败!")
return schemas.Response(success=True)
return schemas.Response(success=False)
@router.get("/aliyun/image", summary="读取图片(阿里云盘)", response_model=schemas.Response)
def image_aliyun(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
读取图片
"""
if not fileid:
return schemas.Response(success=False)
url = AliyunHelper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)