fix 115 pan

This commit is contained in:
jxxghp
2024-06-19 13:02:04 +08:00
parent 7103b0334a
commit 060e2f225c
5 changed files with 196 additions and 103 deletions

View File

@ -1,7 +1,7 @@
from pathlib import Path
from typing import Any, List
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from starlette.responses import Response
from app import schemas
@ -147,7 +147,7 @@ def download_aliyun(fileid: str,
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)
raise HTTPException(status_code=500, detail="下载文件出错")
@router.get("/rename", summary="重命名文件或目录(阿里云盘)", response_model=schemas.Response)
@ -202,4 +202,4 @@ def image_aliyun(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)
raise HTTPException(status_code=500, detail="下载图片出错")

View File

@ -2,7 +2,7 @@ import shutil
from pathlib import Path
from typing import Any, List
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from starlette.responses import FileResponse, Response
from app import schemas
@ -181,7 +181,7 @@ def download_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token
return schemas.Response(success=False)
path_obj = Path(path)
if not path_obj.exists():
return schemas.Response(success=False)
raise HTTPException(status_code=404, detail="文件不存在")
if path_obj.is_file():
# 做为文件流式下载
return FileResponse(path_obj)
@ -247,5 +247,5 @@ def image_local(path: str, _: schemas.TokenPayload = Depends(verify_uri_token))
return None
# 判断是否图片文件
if path_obj.suffix.lower() not in IMAGE_TYPES:
return None
raise HTTPException(status_code=500, detail="图片读取出错")
return Response(content=path_obj.read_bytes(), media_type="image/jpeg")

View File

@ -1,7 +1,8 @@
import base64
from pathlib import Path
from typing import Any, List
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from starlette.responses import Response
from app import schemas
@ -10,7 +11,7 @@ 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.u115 import U115Helper
from app.utils.string import StringUtils
from app.utils.http import RequestUtils
router = APIRouter()
@ -20,36 +21,43 @@ def qrcode(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
生成二维码
"""
qrcode_data, errmsg = U115Helper().generate_qrcode()
qrcode_data = U115Helper().generate_qrcode()
if qrcode_data:
return schemas.Response(success=True, data=qrcode_data)
return schemas.Response(success=False, message=errmsg)
return schemas.Response(success=True, data={
'codeContent': qrcode_data
})
return schemas.Response(success=False)
@router.get("/check", summary="二维码登录确认", response_model=schemas.Response)
def check(ck: str, t: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any:
def check(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
二维码登录确认
"""
if not ck or not t:
return schemas.Response(success=False, message="参数错误")
data, errmsg = U115Helper().check_login(ck, t)
data, errmsg = U115Helper().check_login()
if data:
return schemas.Response(success=True, data=data)
return schemas.Response(success=False, message=errmsg)
@router.get("/userinfo", summary="查询用户信息", response_model=schemas.Response)
def userinfo(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
@router.get("/storage", summary="查询存储空间信息", response_model=schemas.Response)
def storage(_: schemas.TokenPayload = Depends(verify_token)) -> Any:
"""
查询用户信息
查询存储空间信息
"""
pass
storage_info = U115Helper().get_storage()
if storage_info:
return schemas.Response(success=True, data={
"total": storage_info[0],
"used": storage_info[1]
})
return schemas.Response(success=False)
@router.get("/list", summary="所有目录和文件115网盘", response_model=List[schemas.FileItem])
def list_115(path: str,
fileid: str,
pickcode: str,
filetype: str = "dir",
sort: str = 'updated_at',
_: schemas.TokenPayload = Depends(verify_token)) -> Any:
@ -57,6 +65,7 @@ def list_115(path: str,
查询当前目录下所有目录和文件
:param path: 当前路径
:param fileid: 文件ID
:param pickcode: 115 pickcode
:param filetype: 文件类型
:param sort: 排序方式name:按名称排序time:按修改时间排序
:param _: token
@ -66,37 +75,38 @@ def list_115(path: str,
return []
if not path:
path = "/"
if sort == "time":
sort = "updated_at"
if fileid == "root":
fileid = "0"
if filetype == "file":
fileinfo = U115Helper().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 []
name = Path(path).name
suffix = Path(name).suffix[1:]
return [schemas.FileItem(
fileid=fileid,
type="file",
path=path.rstrip('/'),
name=name,
extension=suffix,
pickcode=pickcode
)]
items = U115Helper().list_files(parent_file_id=fileid)
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")
file_list = [schemas.FileItem(
fileid=item.file_id,
parent_fileid=item.parent_id,
type="dir" if item.is_dir else "file",
path=f"{path}{item.name}" + "/" if item.is_dir else "",
name=item.name,
size=item.size,
extension=Path(item.name).suffix[1:],
modify_time=item.modified_time.timestamp() if item.modified_time else 0,
pickcode=item.pickcode
) for item in items]
if sort == "name":
file_list.sort(key=lambda x: x.name)
else:
file_list.sort(key=lambda x: x.modify_time, reverse=True)
return file_list
@router.get("/mkdir", summary="创建目录115网盘", response_model=schemas.Response)
@ -129,17 +139,19 @@ def delete_115(fileid: str,
@router.get("/download", summary="下载文件115网盘")
def download_115(fileid: str,
def download_115(pickcode: str,
_: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
下载文件或目录
"""
if not fileid:
if not pickcode:
return schemas.Response(success=False)
url = U115Helper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
ticket = U115Helper().download(pickcode)
if ticket:
# 请求数据,并以文件流的方式返回
res = RequestUtils(headers=ticket.headers).get_res(ticket.url)
if res:
return Response(content=res.content, media_type="application/octet-stream")
return schemas.Response(success=False)
@ -184,15 +196,18 @@ def rename_115(fileid: str, new_name: str, path: str,
return schemas.Response(success=False)
@router.get("/image", summary="读取图片115网盘", response_model=schemas.Response)
def image_115(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
@router.get("/image", summary="读取图片115网盘")
def image_115(pickcode: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any:
"""
读取图片
"""
if not fileid:
if not pickcode:
return schemas.Response(success=False)
url = U115Helper().get_download_url(fileid)
if url:
# 重定向
return Response(status_code=302, headers={"Location": url})
return schemas.Response(success=False)
ticket = U115Helper().download(pickcode)
if ticket:
# 请求数据获取内容编码为图片base64返回
res = RequestUtils(headers=ticket.headers).get_res(ticket.url)
if res:
content_type = res.headers.get("Content-Type")
return Response(content=res.content, media_type=content_type)
raise HTTPException(status_code=500, detail="下载图片出错")