diff --git a/app/api/endpoints/aliyun.py b/app/api/endpoints/aliyun.py index 1177145d..dbc1e558 100644 --- a/app/api/endpoints/aliyun.py +++ b/app/api/endpoints/aliyun.py @@ -12,7 +12,6 @@ from app.core.security import verify_token, verify_uri_token from app.helper.aliyun import AliyunHelper from app.helper.progress import ProgressHelper from app.schemas.types import ProgressKey -from app.utils.string import StringUtils router = APIRouter() @@ -74,36 +73,14 @@ def list_aliyun(fileitem: schemas.FileItem, if sort == "time": sort = "updated_at" if fileitem.type == "file": - fileinfo = AliyunHelper().detail(fileitem.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"), - drive_id=fileinfo.get("drive_id"), - )] + fileitem = AliyunHelper().detail(fileitem.fileid, path=path) + if fileitem: + return [fileitem] return [] - items = AliyunHelper().list(drive_id=fileitem.drive_id, parent_file_id=fileitem.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"), - drive_id=item.get("drive_id"), - ) for item in items] + return AliyunHelper().list(drive_id=fileitem.drive_id, + parent_file_id=fileitem.fileid, + path=path, + order_by=sort) @router.post("/mkdir", summary="创建目录(阿里云盘)", response_model=schemas.Response) @@ -115,7 +92,7 @@ def mkdir_aliyun(fileitem: schemas.FileItem, """ if not fileitem.fileid or not name: return schemas.Response(success=False) - result = AliyunHelper().create_folder(parent_file_id=fileitem.fileid, name=name) + result = AliyunHelper().create_folder(parent_file_id=fileitem.fileid, name=name, path=fileitem.path) if result: return schemas.Response(success=True) return schemas.Response(success=False) diff --git a/app/api/endpoints/u115.py b/app/api/endpoints/u115.py index 167ca3fb..b19067ea 100644 --- a/app/api/endpoints/u115.py +++ b/app/api/endpoints/u115.py @@ -87,20 +87,7 @@ def list_115(fileitem: schemas.FileItem, extension=suffix, pickcode=fileitem.pickcode )] - items = U115Helper().list(parent_file_id=fileid) - if not items: - return [] - 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] + file_list = U115Helper().list(parent_file_id=fileid, path=path) if sort == "name": file_list.sort(key=lambda x: x.name) else: @@ -117,7 +104,7 @@ def mkdir_115(fileitem: schemas.FileItem, """ if not fileitem.fileid or not name: return schemas.Response(success=False) - result = U115Helper().create_folder(parent_file_id=fileitem.fileid, name=name) + result = U115Helper().create_folder(parent_file_id=fileitem.fileid, name=name, path=fileitem.path) if result: return schemas.Response(success=True) return schemas.Response(success=False) diff --git a/app/helper/aliyun.py b/app/helper/aliyun.py index eee84cc7..14fa13bd 100644 --- a/app/helper/aliyun.py +++ b/app/helper/aliyun.py @@ -7,11 +7,13 @@ from typing import Optional, Tuple, List from requests import Response +from app import schemas from app.core.config import settings from app.db.systemconfig_oper import SystemConfigOper from app.log import logger from app.schemas.types import SystemConfigKey from app.utils.http import RequestUtils +from app.utils.string import StringUtils from app.utils.system import SystemUtils @@ -314,7 +316,7 @@ class AliyunHelper: return {} def list(self, drive_id: str = None, parent_file_id: str = 'root', list_type: str = None, - limit: int = 100, order_by: str = 'updated_at') -> List[dict]: + limit: int = 100, order_by: str = 'updated_at', path: str = "/") -> List[schemas.FileItem]: """ 浏览文件 limit 返回文件数量,默认 50,最大 100 @@ -330,21 +332,22 @@ class AliyunHelper: # 根目录处理 if not drive_id: return [ - { - "file_id": parent_file_id, - "drive_id": params.get("resourceDriveId"), - "parent_file_id": "root", - "type": "folder", - "path": "/资源库/", - "name": "资源库", - }, { - "file_id": parent_file_id, - "drive_id": params.get("backDriveId"), - "parent_file_id": "root", - "type": "folder", - "path": "/备份盘/", - "name": "备份盘", - } + schemas.FileItem( + fileid=parent_file_id, + drive_id=params.get("resourceDriveId"), + parent_fileid="root", + type="folder", + path="/资源库/", + name="资源库" + ), + schemas.FileItem( + fileid=parent_file_id, + drive_id=params.get("backDriveId"), + parent_fileid="root", + type="folder", + path="/备份盘/", + name="备份盘" + ) ] # 返回数据 ret_items = [] @@ -380,9 +383,20 @@ class AliyunHelper: else: self.__handle_error(res, "浏览文件") break - return ret_items + 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"), + drive_id=fileinfo.get("drive_id"), + ) for fileinfo in ret_items] - def create_folder(self, parent_file_id: str, name: str) -> Optional[dict]: + def create_folder(self, parent_file_id: str, name: str, path: str = "/") -> Optional[schemas.FileItem]: """ 创建目录 """ @@ -410,13 +424,14 @@ class AliyunHelper: } """ result = res.json() - return { - "file_id": result.get("file_id"), - "drive_id": result.get("drive_id"), - "parent_file_id": result.get("parent_file_id"), - "type": result.get("type"), - "name": result.get("file_name") - } + return schemas.FileItem( + fileid=result.get("file_id"), + drive_id=result.get("drive_id"), + parent_fileid=result.get("parent_file_id"), + type=result.get("type"), + name=result.get("file_name"), + path=f"{path}{result.get('file_name')}", + ) else: self.__handle_error(res, "创建目录") return None @@ -439,7 +454,7 @@ class AliyunHelper: self.__handle_error(res, "删除文件") return False - def detail(self, file_id: str) -> Optional[dict]: + def detail(self, file_id: str, path: str = "/") -> Optional[schemas.FileItem]: """ 获取文件详情 """ @@ -452,7 +467,19 @@ class AliyunHelper: "file_id": file_id }) if res: - return res.json() + result = res.json() + return schemas.FileItem( + fileid=result.get("file_id"), + drive_id=result.get("drive_id"), + parent_fileid=result.get("parent_file_id"), + type=result.get("type"), + name=result.get("name"), + size=result.get("size"), + extension=result.get("file_extension"), + modify_time=StringUtils.str_to_timestamp(result.get("updated_at")), + thumbnail=result.get("thumbnail"), + path=f"{path}{result.get('name')}" + ) else: self.__handle_error(res, "获取文件详情") return None diff --git a/app/helper/u115.py b/app/helper/u115.py index 83d5ace3..9a7a57a3 100644 --- a/app/helper/u115.py +++ b/app/helper/u115.py @@ -1,12 +1,13 @@ import base64 from pathlib import Path -from typing import Optional, Tuple, Generator +from typing import Optional, Tuple, List import oss2 import py115 from py115 import Cloud -from py115.types import LoginTarget, QrcodeSession, QrcodeStatus, Credential, File, DownloadTicket +from py115.types import LoginTarget, QrcodeSession, QrcodeStatus, Credential, DownloadTicket +from app import schemas from app.db.systemconfig_oper import SystemConfigOper from app.log import logger from app.schemas.types import SystemConfigKey @@ -137,26 +138,46 @@ class U115Helper(metaclass=Singleton): logger.error(f"获取115存储空间失败:{str(e)}") return None - def list(self, parent_file_id: str = '0') -> Optional[Generator[File, None, None]]: + def list(self, parent_file_id: str = '0', path: str = "/") -> Optional[List[schemas.FileItem]]: """ 浏览文件 """ if not self.__init_cloud(): return None try: - return self.cloud.storage().list(dir_id=parent_file_id) + items = self.cloud.storage().list(dir_id=parent_file_id) + return [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] except Exception as e: logger.error(f"浏览115文件失败:{str(e)}") return None - def create_folder(self, parent_file_id: str, name: str) -> Optional[File]: + def create_folder(self, parent_file_id: str, name: str, path: str = "/") -> Optional[schemas.FileItem]: """ 创建目录 """ if not self.__init_cloud(): return None try: - return self.cloud.storage().make_dir(parent_file_id, name) + result = self.cloud.storage().make_dir(parent_file_id, name) + return schemas.FileItem( + fileid=result.file_id, + parent_fileid=result.parent_id, + type="dir", + path=f"{path}{name}/", + name=name, + modify_time=result.modified_time.timestamp() if result.modified_time else 0, + pickcode=result.pickcode + ) except Exception as e: logger.error(f"创建115目录失败:{str(e)}") return None