fix storage

This commit is contained in:
jxxghp
2024-11-23 12:29:34 +08:00
parent 0feecc3eca
commit 0a923bced9
6 changed files with 50 additions and 12 deletions

View File

@@ -79,6 +79,8 @@ class StorageBase(metaclass=ABCMeta):
def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]:
"""
创建目录
:param fileitem: 父目录
:param name: 目录名
"""
pass

View File

@@ -291,6 +291,8 @@ class AliPan(StorageBase, metaclass=Singleton):
def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]:
"""
创建目录
:param fileitem: 父目录
:param name: 目录名
"""
if not self.aligo:
return None
@@ -305,14 +307,40 @@ class AliPan(StorageBase, metaclass=Singleton):
"""
根据文件路程获取目录,不存在则创建
"""
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
if not self.aligo:
return None
item = self.aligo.get_folder_by_path(path=str(path), create_folder=True)
if item:
# 已存在
if isinstance(item, CreateFileResponse):
item = self.aligo.get_file(file_id=item.file_id, drive_id=item.drive_id)
return self.__get_fileitem(item)
return None
# 逐级查找和创建目录
fileitem = schemas.FileItem(path="/")
for part in path.parts:
if part == "/":
continue
dir_file = __find_dir(fileitem, part)
if dir_file:
fileitem = dir_file
else:
dir_file = self.create_folder(fileitem, part)
if not dir_file:
return None
fileitem = dir_file
return fileitem
def get_item(self, path: Path) -> Optional[schemas.FileItem]:
"""

View File

@@ -233,6 +233,8 @@ class Alist(StorageBase, metaclass=Singleton):
) -> Optional[schemas.FileItem]:
"""
创建目录
:param fileitem: 父目录
:param name: 目录名
"""
path = Path(fileitem.path) / name
resp: Response = RequestUtils(
@@ -271,14 +273,16 @@ class Alist(StorageBase, metaclass=Singleton):
获取目录,如目录不存在则创建
"""
folder = self.get_item(path)
if folder:
return folder
if not folder:
folder = self.create_folder(self.get_parent(schemas.FileItem(
folder = self.create_folder(schemas.FileItem(
storage=self.schema.value,
type="dir",
path=path.as_posix() + "/",
path=path.parent.as_posix(),
name=path.name,
basename=path.stem
)), path.name)
), path.name)
return folder
def get_item(

View File

@@ -115,6 +115,8 @@ class LocalStorage(StorageBase):
def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]:
"""
创建目录
:param fileitem: 父目录
:param name: 目录名
"""
if not fileitem.path:
return None

View File

@@ -139,6 +139,8 @@ class Rclone(StorageBase):
def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]:
"""
创建目录
:param fileitem: 父目录
:param name: 目录名
"""
try:
retcode = subprocess.run(
@@ -149,10 +151,7 @@ class Rclone(StorageBase):
startupinfo=self.__get_hidden_shell()
).returncode
if retcode == 0:
ret_fileitem = copy.deepcopy(fileitem)
ret_fileitem.path = f"{fileitem.path}/{name}/"
ret_fileitem.name = name
return ret_fileitem
return self.get_item(Path(f"{fileitem.path}/{name}"))
except Exception as err:
logger.error(f"rclone创建目录失败{err}")
return None
@@ -166,11 +165,11 @@ class Rclone(StorageBase):
"""
查找下级目录中匹配名称的目录
"""
for sub_file in self.list(_fileitem):
if sub_file.type != "dir":
for sub_folder in self.list(_fileitem):
if sub_folder.type != "dir":
continue
if sub_file.name == _name:
return sub_file
if sub_folder.name == _name:
return sub_folder
return None
# 逐级查找和创建目录

View File

@@ -225,6 +225,9 @@ class U115Pan(StorageBase, metaclass=Singleton):
"""
if not self.client:
return None
folder = self.get_item(path)
if folder:
return folder
try:
result = self.client.fs.makedirs(path, exist_ok=True)
if result: