fix storage logging

This commit is contained in:
jxxghp
2025-03-25 08:34:36 +08:00
parent 4be7426ae7
commit e83fe0aabe
5 changed files with 97 additions and 95 deletions

View File

@@ -52,9 +52,9 @@ class AliPan(StorageBase, metaclass=Singleton):
try: try:
subprocess.run(['aria2c', '-h'], capture_output=True) subprocess.run(['aria2c', '-h'], capture_output=True)
self._has_aria2c = True self._has_aria2c = True
logger.debug('发现 aria2c, 将使用 aria2c 下载文件') logger.debug('【alipan】发现 aria2c, 将使用 aria2c 下载文件')
except FileNotFoundError: except FileNotFoundError:
logger.debug('未发现 aria2c') logger.debug('【alipan】未发现 aria2c')
self._has_aria2c = False self._has_aria2c = False
self.init_storage() self.init_storage()
@@ -67,7 +67,7 @@ class AliPan(StorageBase, metaclass=Singleton):
""" """
显示二维码 显示二维码
""" """
logger.info(f"请用阿里云盘 App 扫码登录:{qr_link}") logger.info(f"【alipan】请用阿里云盘 App 扫码登录:{qr_link}")
refresh_token = self.__auth_params.get("refreshToken") refresh_token = self.__auth_params.get("refreshToken")
if refresh_token: if refresh_token:
@@ -75,7 +75,7 @@ class AliPan(StorageBase, metaclass=Singleton):
self.aligo = Aligo(refresh_token=refresh_token, show=show_qrcode, use_aria2=self._has_aria2c, # noqa self.aligo = Aligo(refresh_token=refresh_token, show=show_qrcode, use_aria2=self._has_aria2c, # noqa
name="MoviePilot V2", level=logging.ERROR, re_login=False) name="MoviePilot V2", level=logging.ERROR, re_login=False)
except Exception as err: except Exception as err:
logger.error(f"初始化阿里云盘失败:{str(err)}") logger.error(f"【alipan】初始化阿里云盘失败:{str(err)}")
self.__clear_params() self.__clear_params()
@property @property

View File

@@ -1,5 +1,4 @@
import json import json
import logging
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Optional, List, Dict from typing import Optional, List, Dict
@@ -102,20 +101,20 @@ class Alist(StorageBase, metaclass=Singleton):
""" """
if resp is None: if resp is None:
logger.warning("请求登录失败无法连接alist服务") logger.warning("【alist】请求登录失败无法连接alist服务")
return "" return ""
if resp.status_code != 200: if resp.status_code != 200:
logger.warning(f"更新令牌请求发送失败,状态码:{resp.status_code}") logger.warning(f"【alist】更新令牌请求发送失败,状态码:{resp.status_code}")
return "" return ""
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logger.critical(f'更新令牌,错误信息:{result["message"]}') logger.critical(f'【alist】更新令牌,错误信息:{result["message"]}')
return "" return ""
logger.debug("AList获取令牌成功") logger.debug("【alist】AList获取令牌成功")
return result["data"]["token"] return result["data"]["token"]
def __get_header_with_token(self) -> dict: def __get_header_with_token(self) -> dict:
@@ -200,19 +199,19 @@ class Alist(StorageBase, metaclass=Singleton):
""" """
if resp is None: if resp is None:
logging.warning(f"请求获取目录 {fileitem.path} 的文件列表失败无法连接alist服务") logger.warn(f"【alist】请求获取目录 {fileitem.path} 的文件列表失败无法连接alist服务")
return [] return []
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logger.warn(
f"请求获取目录 {fileitem.path} 的文件列表失败,状态码:{resp.status_code}" f"【alist】请求获取目录 {fileitem.path} 的文件列表失败,状态码:{resp.status_code}"
) )
return [] return []
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning( logger.warn(
f'获取目录 {fileitem.path} 的文件列表失败,错误信息:{result["message"]}' f'【alist】获取目录 {fileitem.path} 的文件列表失败,错误信息:{result["message"]}'
) )
return [] return []
@@ -258,15 +257,15 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if resp is None: if resp is None:
logging.warning(f"请求创建目录 {path} 失败无法连接alist服务") logger.warn(f"【alist】请求创建目录 {path} 失败无法连接alist服务")
return None return None
if resp.status_code != 200: if resp.status_code != 200:
logging.warning(f"请求创建目录 {path} 失败,状态码:{resp.status_code}") logger.warn(f"【alist】请求创建目录 {path} 失败,状态码:{resp.status_code}")
return None return None
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning(f'创建目录 {path} 失败,错误信息:{result["message"]}') logger.warn(f'【alist】创建目录 {path} 失败,错误信息:{result["message"]}')
return None return None
return self.get_item(path) return self.get_item(path)
@@ -348,15 +347,15 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if resp is None: if resp is None:
logging.warning(f"请求获取文件 {path} 失败无法连接alist服务") logger.warn(f"【alist】请求获取文件 {path} 失败无法连接alist服务")
return None return None
if resp.status_code != 200: if resp.status_code != 200:
logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") logger.warn(f"【alist】请求获取文件 {path} 失败,状态码:{resp.status_code}")
return None return None
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.debug(f'获取文件 {path} 失败,错误信息:{result["message"]}') logger.debug(f'【alist】获取文件 {path} 失败,错误信息:{result["message"]}')
return None return None
return schemas.FileItem( return schemas.FileItem(
@@ -405,18 +404,18 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if resp is None: if resp is None:
logging.warning(f"请求删除文件 {fileitem.path} 失败无法连接alist服务") logger.warn(f"【alist】请求删除文件 {fileitem.path} 失败无法连接alist服务")
return False return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logger.warn(
f"请求删除文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"【alist】请求删除文件 {fileitem.path} 失败,状态码:{resp.status_code}"
) )
return False return False
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning( logger.warn(
f'删除文件 {fileitem.path} 失败,错误信息:{result["message"]}' f'【alist】删除文件 {fileitem.path} 失败,错误信息:{result["message"]}'
) )
return False return False
return True return True
@@ -447,18 +446,18 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if not resp: if not resp:
logging.warning(f"请求重命名文件 {fileitem.path} 失败无法连接alist服务") logger.warn(f"【alist】请求重命名文件 {fileitem.path} 失败无法连接alist服务")
return False return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logger.warn(
f"请求重命名文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"【alist】请求重命名文件 {fileitem.path} 失败,状态码:{resp.status_code}"
) )
return False return False
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning( logger.warn(
f'重命名文件 {fileitem.path} 失败,错误信息:{result["message"]}' f'【alist】重命名文件 {fileitem.path} 失败,错误信息:{result["message"]}'
) )
return False return False
@@ -512,15 +511,15 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if not resp: if not resp:
logging.warning(f"请求获取文件 {path} 失败无法连接alist服务") logger.warn(f"【alist】请求获取文件 {path} 失败无法连接alist服务")
return None return None
if resp.status_code != 200: if resp.status_code != 200:
logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") logger.warn(f"【alist】请求获取文件 {path} 失败,状态码:{resp.status_code}")
return None return None
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning(f'获取文件 {path} 失败,错误信息:{result["message"]}') logger.warn(f'【alist】获取文件 {path} 失败,错误信息:{result["message"]}')
return None return None
if result["data"]["raw_url"]: if result["data"]["raw_url"]:
@@ -568,7 +567,7 @@ class Alist(StorageBase, metaclass=Singleton):
) )
if resp.status_code != 200: if resp.status_code != 200:
logging.warning(f"请求上传文件 {path} 失败,状态码:{resp.status_code}") logger.warn(f"【alist】请求上传文件 {path} 失败,状态码:{resp.status_code}")
return None return None
new_item = self.get_item(Path(fileitem.path) / path.name) new_item = self.get_item(Path(fileitem.path) / path.name)
@@ -617,20 +616,20 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if resp is None: if resp is None:
logging.warning( logger.warn(
f"请求复制文件 {fileitem.path} 失败无法连接alist服务" f"【alist】请求复制文件 {fileitem.path} 失败无法连接alist服务"
) )
return False return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logger.warn(
f"请求复制文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"【alist】请求复制文件 {fileitem.path} 失败,状态码:{resp.status_code}"
) )
return False return False
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning( logger.warn(
f'复制文件 {fileitem.path} 失败,错误信息:{result["message"]}' f'【alist】复制文件 {fileitem.path} 失败,错误信息:{result["message"]}'
) )
return False return False
# 重命名 # 重命名
@@ -676,20 +675,20 @@ class Alist(StorageBase, metaclass=Singleton):
} }
""" """
if resp is None: if resp is None:
logging.warning( logger.warn(
f"请求移动文件 {fileitem.path} 失败无法连接alist服务" f"【alist】请求移动文件 {fileitem.path} 失败无法连接alist服务"
) )
return False return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logger.warn(
f"请求移动文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"【alist】请求移动文件 {fileitem.path} 失败,状态码:{resp.status_code}"
) )
return False return False
result = resp.json() result = resp.json()
if result["code"] != 200: if result["code"] != 200:
logging.warning( logger.warn(
f'移动文件 {fileitem.path} 失败,错误信息:{result["message"]}' f'【alist】移动文件 {fileitem.path} 失败,错误信息:{result["message"]}'
) )
return False return False
return True return True

View File

@@ -95,7 +95,7 @@ class LocalStorage(StorageBase):
# 遍历目录 # 遍历目录
path_obj = Path(path) path_obj = Path(path)
if not path_obj.exists(): if not path_obj.exists():
logger.warn(f"目录不存在:{path}") logger.warn(f"【local】目录不存在:{path}")
return [] return []
# 如果是文件 # 如果是文件
@@ -167,7 +167,7 @@ class LocalStorage(StorageBase):
else: else:
shutil.rmtree(path_obj, ignore_errors=True) shutil.rmtree(path_obj, ignore_errors=True)
except Exception as e: except Exception as e:
logger.error(f"删除文件失败:{e}") logger.error(f"【local】删除文件失败:{e}")
return False return False
return True return True
@@ -181,7 +181,7 @@ class LocalStorage(StorageBase):
try: try:
path_obj.rename(path_obj.parent / name) path_obj.rename(path_obj.parent / name)
except Exception as e: except Exception as e:
logger.error(f"重命名文件失败:{e}") logger.error(f"【local】重命名文件失败:{e}")
return False return False
return True return True
@@ -202,7 +202,7 @@ class LocalStorage(StorageBase):
target_path = dir_path / (new_name or path.name) target_path = dir_path / (new_name or path.name)
code, message = SystemUtils.move(path, target_path) code, message = SystemUtils.move(path, target_path)
if code != 0: if code != 0:
logger.error(f"移动文件失败:{message}") logger.error(f"【local】移动文件失败:{message}")
return None return None
return self.get_item(target_path) return self.get_item(target_path)
@@ -213,7 +213,7 @@ class LocalStorage(StorageBase):
file_path = Path(fileitem.path) file_path = Path(fileitem.path)
code, message = SystemUtils.link(file_path, target_file) code, message = SystemUtils.link(file_path, target_file)
if code != 0: if code != 0:
logger.error(f"硬链接文件失败:{message}") logger.error(f"【local】硬链接文件失败:{message}")
return False return False
return True return True
@@ -224,7 +224,7 @@ class LocalStorage(StorageBase):
file_path = Path(fileitem.path) file_path = Path(fileitem.path)
code, message = SystemUtils.softlink(file_path, target_file) code, message = SystemUtils.softlink(file_path, target_file)
if code != 0: if code != 0:
logger.error(f"软链接文件失败:{message}") logger.error(f"【local】软链接文件失败:{message}")
return False return False
return True return True
@@ -238,7 +238,7 @@ class LocalStorage(StorageBase):
file_path = Path(fileitem.path) file_path = Path(fileitem.path)
code, message = SystemUtils.copy(file_path, path / new_name) code, message = SystemUtils.copy(file_path, path / new_name)
if code != 0: if code != 0:
logger.error(f"复制文件失败:{message}") logger.error(f"【local】复制文件失败:{message}")
return False return False
return True return True
@@ -252,7 +252,7 @@ class LocalStorage(StorageBase):
file_path = Path(fileitem.path) file_path = Path(fileitem.path)
code, message = SystemUtils.move(file_path, path / new_name) code, message = SystemUtils.move(file_path, path / new_name)
if code != 0: if code != 0:
logger.error(f"移动文件失败:{message}") logger.error(f"【local】移动文件失败:{message}")
return False return False
return True return True

View File

@@ -39,8 +39,8 @@ class Rclone(StorageBase):
super().set_config(conf) super().set_config(conf)
filepath = conf.get("filepath") filepath = conf.get("filepath")
if not filepath: if not filepath:
logger.warn("Rclone保存配置失败未设置配置文件路径") logger.warn("【rclone保存配置失败:未设置配置文件路径")
logger.info(f"Rclone配置写入文件{filepath}") logger.info(f"【rclone配置写入文件:{filepath}")
path = Path(filepath) path = Path(filepath)
if not path.parent.exists(): if not path.parent.exists():
path.parent.mkdir(parents=True) path.parent.mkdir(parents=True)
@@ -95,7 +95,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return True return True
except Exception as err: except Exception as err:
logger.error(f"rclone存储检查失败{err}") logger.error(f"rclone存储检查失败:{err}")
return False return False
def list(self, fileitem: schemas.FileItem) -> List[schemas.FileItem]: def list(self, fileitem: schemas.FileItem) -> List[schemas.FileItem]:
@@ -117,7 +117,7 @@ class Rclone(StorageBase):
items = json.loads(ret.stdout) items = json.loads(ret.stdout)
return [self.__get_rcloneitem(item, parent=fileitem.path) for item in items] return [self.__get_rcloneitem(item, parent=fileitem.path) for item in items]
except Exception as err: except Exception as err:
logger.error(f"rclone浏览文件失败{err}") logger.error(f"rclone浏览文件失败:{err}")
return [] return []
def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]:
@@ -137,7 +137,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return self.get_item(Path(fileitem.path) / name) return self.get_item(Path(fileitem.path) / name)
except Exception as err: except Exception as err:
logger.error(f"rclone创建目录失败{err}") logger.error(f"rclone创建目录失败:{err}")
return None return None
def get_folder(self, path: Path) -> Optional[schemas.FileItem]: def get_folder(self, path: Path) -> Optional[schemas.FileItem]:
@@ -169,7 +169,7 @@ class Rclone(StorageBase):
else: else:
dir_file = self.create_folder(fileitem, part) dir_file = self.create_folder(fileitem, part)
if not dir_file: if not dir_file:
logger.warn(f"rclone创建目录 {fileitem.path}{part} 失败!") logger.warn(f"rclone创建目录 {fileitem.path}{part} 失败!")
return None return None
fileitem = dir_file fileitem = dir_file
return fileitem return fileitem
@@ -194,7 +194,7 @@ class Rclone(StorageBase):
return self.__get_rcloneitem(item, parent=str(path.parent) + "/") return self.__get_rcloneitem(item, parent=str(path.parent) + "/")
return None return None
except Exception as err: except Exception as err:
logger.debug(f"rclone获取文件项失败{err}") logger.debug(f"rclone获取文件项失败:{err}")
return None return None
def delete(self, fileitem: schemas.FileItem) -> bool: def delete(self, fileitem: schemas.FileItem) -> bool:
@@ -212,7 +212,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return True return True
except Exception as err: except Exception as err:
logger.error(f"rclone删除文件失败{err}") logger.error(f"rclone删除文件失败:{err}")
return False return False
def rename(self, fileitem: schemas.FileItem, name: str) -> bool: def rename(self, fileitem: schemas.FileItem, name: str) -> bool:
@@ -231,7 +231,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return True return True
except Exception as err: except Exception as err:
logger.error(f"rclone重命名文件失败{err}") logger.error(f"rclone重命名文件失败:{err}")
return False return False
def download(self, fileitem: schemas.FileItem, path: Path = None) -> Optional[Path]: def download(self, fileitem: schemas.FileItem, path: Path = None) -> Optional[Path]:
@@ -251,7 +251,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return path return path
except Exception as err: except Exception as err:
logger.error(f"rclone复制文件失败{err}") logger.error(f"rclone复制文件失败:{err}")
return None return None
def upload(self, fileitem: schemas.FileItem, path: Path, def upload(self, fileitem: schemas.FileItem, path: Path,
@@ -275,7 +275,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return self.get_item(new_path) return self.get_item(new_path)
except Exception as err: except Exception as err:
logger.error(f"rclone上传文件失败{err}") logger.error(f"rclone上传文件失败:{err}")
return None return None
def detail(self, fileitem: schemas.FileItem) -> Optional[schemas.FileItem]: def detail(self, fileitem: schemas.FileItem) -> Optional[schemas.FileItem]:
@@ -295,7 +295,7 @@ class Rclone(StorageBase):
items = json.loads(ret.stdout) items = json.loads(ret.stdout)
return self.__get_rcloneitem(items[0]) return self.__get_rcloneitem(items[0])
except Exception as err: except Exception as err:
logger.error(f"rclone获取文件详情失败{err}") logger.error(f"rclone获取文件详情失败:{err}")
return None return None
def move(self, fileitem: schemas.FileItem, path: Path, new_name: str) -> bool: def move(self, fileitem: schemas.FileItem, path: Path, new_name: str) -> bool:
@@ -317,7 +317,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return True return True
except Exception as err: except Exception as err:
logger.error(f"rclone移动文件失败{err}") logger.error(f"rclone移动文件失败:{err}")
return False return False
def copy(self, fileitem: schemas.FileItem, path: Path, new_name: str) -> bool: def copy(self, fileitem: schemas.FileItem, path: Path, new_name: str) -> bool:
@@ -339,7 +339,7 @@ class Rclone(StorageBase):
if retcode == 0: if retcode == 0:
return True return True
except Exception as err: except Exception as err:
logger.error(f"rclone复制文件失败{err}") logger.error(f"rclone复制文件失败:{err}")
return False return False
def link(self, fileitem: schemas.FileItem, target_file: Path) -> bool: def link(self, fileitem: schemas.FileItem, target_file: Path) -> bool:
@@ -381,5 +381,5 @@ class Rclone(StorageBase):
available=items.get("free") available=items.get("free")
) )
except Exception as err: except Exception as err:
logger.error(f"rclone获取存储使用情况失败{err}") logger.error(f"rclone获取存储使用情况失败:{err}")
return None return None

View File

@@ -117,7 +117,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
确认登录后获取相关token 确认登录后获取相关token
""" """
if not self._auth_state: if not self._auth_state:
raise Exception("请先调用生成二维码方法") raise Exception("【115】请先调用生成二维码方法")
resp = self.session.post( resp = self.session.post(
"https://passportapi.115.com/open/deviceCodeToToken", "https://passportapi.115.com/open/deviceCodeToToken",
data={ data={
@@ -126,13 +126,13 @@ class U115Pan(StorageBase, metaclass=Singleton):
} }
) )
if resp is None: if resp is None:
raise Exception("获取 access_token 失败") raise Exception("【115】获取 access_token 失败")
result = resp.json() result = resp.json()
if result.get("code") != 0: if result.get("code") != 0:
raise Exception(result.get("message")) raise Exception(result.get("message"))
return result["data"] return result["data"]
def __refresh_access_token(self, refresh_token: str) -> dict: def __refresh_access_token(self, refresh_token: str) -> Optional[dict]:
""" """
刷新access_token 刷新access_token
""" """
@@ -143,10 +143,11 @@ class U115Pan(StorageBase, metaclass=Singleton):
} }
) )
if resp is None: if resp is None:
raise Exception(f"刷新 access_token 失败refresh_token={refresh_token}") logger.error(f"【115】刷新 access_token 失败refresh_token={refresh_token}")
return None
result = resp.json() result = resp.json()
if result.get("code") != 0: if result.get("code") != 0:
raise Exception(result.get("message")) logger.warn(f"【115】刷新 access_token 失败:{result.get('code')} - {result.get('message')}")
return result.get("data") return result.get("data")
def _request_api(self, method: str, endpoint: str, def _request_api(self, method: str, endpoint: str,
@@ -159,7 +160,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
**kwargs **kwargs
) )
if resp is None: if resp is None:
logger.warn(f"{method} 请求 {endpoint} 失败!") logger.warn(f"【115】{method} 请求 {endpoint} 失败!")
return None return None
# 处理速率限制 # 处理速率限制
@@ -175,27 +176,29 @@ class U115Pan(StorageBase, metaclass=Singleton):
ret_data = resp.json() ret_data = resp.json()
# 处理refresh_token失效 # 处理refresh_token失效
if ret_data.get("code") == 40140119: if ret_data.get("code") in [40140116, 40140119]:
self.set_config({}) self.set_config({})
raise Exception("refresh_token 失效,请重新扫描登录!") logger.warn("【115】refresh_token 失效,请重新扫描登录!")
return None
# 处理access_token失效 # 处理access_token失效
if ret_data.get("code") == 40140125: if ret_data.get("code") == 40140125:
refresh_token = self.get_conf().get("refresh_token") refresh_token = self.get_conf().get("refresh_token")
if refresh_token: if refresh_token:
tokens = self.__refresh_access_token(refresh_token) tokens = self.__refresh_access_token(refresh_token)
self.set_config({ if tokens:
"refresh_time": int(time.time()), self.set_config({
**tokens "refresh_time": int(time.time()),
}) **tokens
return self._request_api(method, endpoint, result_key, **kwargs) })
return self._request_api(method, endpoint, result_key, **kwargs)
return None return None
if ret_data.get("code") != 0:
logger.warn(f"【115】{method} 请求 {endpoint} 出错:{ret_data.get('message')}")
if result_key: if result_key:
result = ret_data.get(result_key) return ret_data.get(result_key)
if result is None:
logger.warn(f"{method} 请求 {endpoint} 出错:{ret_data.get('message')}")
return result
return ret_data return ret_data
def _path_to_id(self, path: str) -> int: def _path_to_id(self, path: str) -> int:
@@ -231,7 +234,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
current_id = item["fid"] current_id = item["fid"]
break break
else: else:
raise FileNotFoundError(f"路径不存在: {path}") raise FileNotFoundError(f"【115】路径不存在: {path}")
self._id_cache[path] = current_id self._id_cache[path] = current_id
return current_id return current_id
@@ -256,7 +259,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
) )
# 处理可能的空数据(如已删除文件) # 处理可能的空数据(如已删除文件)
if not detail: if not detail:
raise FileNotFoundError(f"{fid} 不存在") raise FileNotFoundError(f"【115】{fid} 不存在")
paths = detail["paths"] paths = detail["paths"]
path_parts = [item["file_name"] for item in paths] path_parts = [item["file_name"] for item in paths]
# 构建完整路径 # 构建完整路径
@@ -388,7 +391,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
if resp.get("code") == 20004: if resp.get("code") == 20004:
# 目录已存在 # 目录已存在
return self.get_item(new_path) return self.get_item(new_path)
logger.warn(f"创建目录失败: {resp.get('error')}") logger.warn(f"【115】创建目录失败: {resp.get('error')}")
return None return None
# 缓存新目录 # 缓存新目录
self._id_cache[str(new_path)] = resp["data"]["file_id"] self._id_cache[str(new_path)] = resp["data"]["file_id"]
@@ -434,7 +437,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
if not init_resp: if not init_resp:
return None return None
if not init_resp.get("state"): if not init_resp.get("state"):
logger.warn(f"初始化上传失败: {init_resp.get('error')}") logger.warn(f"【115】初始化上传失败: {init_resp.get('error')}")
return None return None
# 处理秒传成功 # 处理秒传成功
@@ -485,7 +488,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
"data" "data"
) )
if not token_resp: if not token_resp:
logger.warn("获取上传凭证失败") logger.warn("【115】获取上传凭证失败")
return None return None
# Step 4: 对象存储上传 # Step 4: 对象存储上传
@@ -495,7 +498,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
access_key_secret=token_resp['AccessKeySecret'], access_key_secret=token_resp['AccessKeySecret'],
security_token=token_resp['SecurityToken'] security_token=token_resp['SecurityToken']
) )
bucket = oss2.Bucket(auth, endpoint, init_result['bucket']) bucket = oss2.Bucket(auth, endpoint, init_result['bucket']) # noqa
# 分片上传 # 分片上传
headers = { headers = {
@@ -517,7 +520,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
bucket.complete_multipart_upload(target_name, upload_id, parts) bucket.complete_multipart_upload(target_name, upload_id, parts)
except Exception as err: except Exception as err:
if "FileAlreadyExists" not in str(err): if "FileAlreadyExists" not in str(err):
logger.error(f"上传文件失败: {str(err)}") logger.error(f"【115】上传文件失败: {str(err)}")
return None return None
# 构造返回结果 # 构造返回结果
@@ -633,7 +636,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
modify_time=resp["utime"] modify_time=resp["utime"]
) )
except Exception as e: except Exception as e:
logger.debug(f"获取文件信息失败: {str(e)}") logger.debug(f"【115】获取文件信息失败: {str(e)}")
return None return None
def get_folder(self, path: Path) -> Optional[schemas.FileItem]: def get_folder(self, path: Path) -> Optional[schemas.FileItem]:
@@ -665,7 +668,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
else: else:
dir_file = self.create_folder(fileitem, part) dir_file = self.create_folder(fileitem, part)
if not dir_file: if not dir_file:
logger.warn(f"115 创建目录 {fileitem.path}{part} 失败!") logger.warn(f"115创建目录 {fileitem.path}{part} 失败!")
return None return None
fileitem = dir_file fileitem = dir_file
return fileitem return fileitem