diff --git a/app/api/endpoints/storage.py b/app/api/endpoints/storage.py index 3683c24f..b97d8450 100644 --- a/app/api/endpoints/storage.py +++ b/app/api/endpoints/storage.py @@ -27,7 +27,7 @@ def qrcode(name: str, _: schemas.TokenPayload = Depends(verify_token)) -> Any: qrcode_data, errmsg = StorageChain().generate_qrcode(name) if qrcode_data: return schemas.Response(success=True, data=qrcode_data, message=errmsg) - return schemas.Response(success=False) + return schemas.Response(success=False, message=errmsg) @router.get("/check/{name}", summary="二维码登录确认", response_model=schemas.Response) diff --git a/app/core/config.py b/app/core/config.py index 036eaa14..7ec395fb 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -110,7 +110,7 @@ class ConfigModel(BaseModel): # Fanart API Key FANART_API_KEY: str = "d2d31f9ecabea050fc7d68aa3146015f" # 115 AppId - U115_APP_ID: str = "" + U115_APP_ID: str = "100196807" # 元数据识别缓存过期时间(小时) META_CACHE_EXPIRE: int = 0 # 电视剧动漫的分类genre_ids diff --git a/app/modules/filemanager/storages/rclone.py b/app/modules/filemanager/storages/rclone.py index 3ddbbab0..253ad480 100644 --- a/app/modules/filemanager/storages/rclone.py +++ b/app/modules/filemanager/storages/rclone.py @@ -162,9 +162,7 @@ class Rclone(StorageBase): return folder # 逐级查找和创建目录 fileitem = schemas.FileItem(path="/") - for part in path.parts: - if part == "/": - continue + for part in path.parts[1:]: dir_file = __find_dir(fileitem, part) if dir_file: fileitem = dir_file diff --git a/app/modules/filemanager/storages/u115.py b/app/modules/filemanager/storages/u115.py index 929d3f43..b15bc499 100644 --- a/app/modules/filemanager/storages/u115.py +++ b/app/modules/filemanager/storages/u115.py @@ -188,6 +188,10 @@ class U115Pan(StorageBase, metaclass=Singleton): """ 目录遍历实现 """ + + if fileitem.type == "file": + return [self.detail(fileitem)] + cid = self._path_to_id(fileitem.path) items = [] offset = 0 @@ -202,9 +206,18 @@ class U115Pan(StorageBase, metaclass=Singleton): if not resp: break for item in resp: - path = self._id_to_path(item.get("fid")) + path = f"{fileitem.path}/{item['fn']}" + ("/" if item["fc"] == "0" else "") items.append(schemas.FileItem( fileid=item["fid"], + name=item["fn"], + basename=Path(item["fn"]).stem, + extension=item["ico"], + type="dir" if item["fc"] == "0" else "file", + path=path, + size=item["fs"] if item["fc"] == "1" else None, + modify_time=item["upt"], + pickcode=item["pc"], + thumbnail=item["thumb"], )) # 更新缓存 self._id_cache[path] = item["cid"] @@ -234,8 +247,9 @@ class U115Pan(StorageBase, metaclass=Singleton): self._id_cache[str(new_path)] = resp["file_id"] return schemas.FileItem( fileid=resp["file_id"], - path=str(new_path), + path=str(new_path) + "/", name=name, + basename=name, type="dir", modify_time=int(time.time()) ) @@ -273,6 +287,9 @@ class U115Pan(StorageBase, metaclass=Singleton): fileid=init_resp["file_id"], path=str(Path(target_dir.path) / target_name), name=target_name, + basename=Path(target_dir.name).stem, + extension=Path(target_dir.name).suffix[1:], + size=file_size, type="file", modify_time=int(time.time()) ) @@ -342,6 +359,7 @@ class U115Pan(StorageBase, metaclass=Singleton): name=target_name, basename=Path(target_name).stem, extension=Path(target_name).suffix[1:], + size=file_size, modify_time=int(time.time()) ) @@ -528,8 +546,8 @@ class U115Pan(StorageBase, metaclass=Singleton): } ) return schemas.FileItem( - path=str(path), fileid=resp["file_id"], + path=str(path) + ("/" if resp["file_category"] == "1" else ""), type="file" if resp["file_category"] == "1" else "dir", name=resp["file_name"], basename=Path(resp["file_name"]).stem, @@ -546,10 +564,35 @@ class U115Pan(StorageBase, metaclass=Singleton): """ 获取指定路径的文件夹,如不存在则创建 """ - try: - return self.get_item(path) - except FileNotFoundError: - return self.create_folder(self.get_item(path.parent), path.name) + + def __find_dir(_fileitem: schemas.FileItem, _name: str) -> Optional[schemas.FileItem]: + """ + 查找下级目录中匹配名称的目录 + """ + for sub_folder in self.list(_fileitem): + if sub_folder.type != "dir": + continue + if sub_folder.name == _name: + return sub_folder + return None + + # 是否已存在 + folder = self.get_item(path) + if folder: + return folder + # 逐级查找和创建目录 + fileitem = schemas.FileItem(path="/") + for part in path.parts[1:]: + dir_file = __find_dir(fileitem, part) + if dir_file: + fileitem = dir_file + else: + dir_file = self.create_folder(fileitem, part) + if not dir_file: + logger.warn(f"115 创建目录 {fileitem.path}{part} 失败!") + return None + fileitem = dir_file + return fileitem def detail(self, fileitem: schemas.FileItem) -> Optional[schemas.FileItem]: """