mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
fix alipan api
This commit is contained in:
@@ -64,6 +64,17 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
if not self.access_token:
|
if not self.access_token:
|
||||||
raise Exception("【阿里云盘】请先扫码登录!")
|
raise Exception("【阿里云盘】请先扫码登录!")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _default_drive_id(self) -> str:
|
||||||
|
"""
|
||||||
|
获取默认存储桶ID
|
||||||
|
"""
|
||||||
|
conf = self.get_conf()
|
||||||
|
drive_id = conf.get("resource_drive_id") or conf.get("backup_drive_id") or conf.get("default_drive_id")
|
||||||
|
if not drive_id:
|
||||||
|
raise Exception("请先登录阿里云盘!")
|
||||||
|
return drive_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def access_token(self) -> Optional[str]:
|
def access_token(self) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
@@ -72,8 +83,6 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
with lock:
|
with lock:
|
||||||
tokens = self.get_conf()
|
tokens = self.get_conf()
|
||||||
refresh_token = tokens.get("refresh_token")
|
refresh_token = tokens.get("refresh_token")
|
||||||
if not refresh_token:
|
|
||||||
return None
|
|
||||||
expires_in = tokens.get("expires_in", 0)
|
expires_in = tokens.get("expires_in", 0)
|
||||||
refresh_time = tokens.get("refresh_time", 0)
|
refresh_time = tokens.get("refresh_time", 0)
|
||||||
if expires_in and refresh_time + expires_in < int(time.time()):
|
if expires_in and refresh_time + expires_in < int(time.time()):
|
||||||
@@ -183,6 +192,8 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
刷新access_token
|
刷新access_token
|
||||||
"""
|
"""
|
||||||
|
if not refresh_token:
|
||||||
|
raise Exception("会话失效,请重新扫码登录!")
|
||||||
resp = self.session.post(
|
resp = self.session.post(
|
||||||
f"{self.base_url}/oauth/access_token",
|
f"{self.base_url}/oauth/access_token",
|
||||||
json={
|
json={
|
||||||
@@ -287,9 +298,9 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
next_marker = None
|
next_marker = None
|
||||||
while True:
|
while True:
|
||||||
resp = self._request_api(
|
resp = self._request_api(
|
||||||
"GET",
|
"POST",
|
||||||
"/adrive/v1.0/openFile/list",
|
"/adrive/v1.0/openFile/list",
|
||||||
params={
|
json={
|
||||||
"drive_id": drive_id,
|
"drive_id": drive_id,
|
||||||
"limit": 100,
|
"limit": 100,
|
||||||
"marker": next_marker,
|
"marker": next_marker,
|
||||||
@@ -381,18 +392,20 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
|
|
||||||
if fileitem.path == "/":
|
if fileitem.path == "/":
|
||||||
parent_file_id = "root"
|
parent_file_id = "root"
|
||||||
|
drive_id = self._default_drive_id
|
||||||
else:
|
else:
|
||||||
parent_file_id = fileitem.fileid
|
parent_file_id = fileitem.fileid
|
||||||
|
drive_id = fileitem.drive_id
|
||||||
|
|
||||||
items = []
|
items = []
|
||||||
next_marker = None
|
next_marker = None
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
resp = self._request_api(
|
resp = self._request_api(
|
||||||
"GET",
|
"POST",
|
||||||
"/adrive/v1.0/openFile/list",
|
"/adrive/v1.0/openFile/list",
|
||||||
params={
|
json={
|
||||||
"drive_id": fileitem.drive_id,
|
"drive_id": drive_id,
|
||||||
"limit": 100,
|
"limit": 100,
|
||||||
"marker": next_marker,
|
"marker": next_marker,
|
||||||
"parent_file_id": parent_file_id,
|
"parent_file_id": parent_file_id,
|
||||||
@@ -406,7 +419,7 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
for item in resp.get("items", []):
|
for item in resp.get("items", []):
|
||||||
# 更新缓存
|
# 更新缓存
|
||||||
path = f"{fileitem.path}{item.get('name')}"
|
path = f"{fileitem.path}{item.get('name')}"
|
||||||
self._id_cache[path] = item["fid"]
|
self._id_cache[path] = (drive_id, item.get("file_id"))
|
||||||
items.append(self.__get_fileitem(item))
|
items.append(self.__get_fileitem(item))
|
||||||
if len(resp.get("items")) < 100:
|
if len(resp.get("items")) < 100:
|
||||||
break
|
break
|
||||||
@@ -518,9 +531,10 @@ class AliPan(StorageBase, metaclass=Singleton):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
resp = self._request_api(
|
resp = self._request_api(
|
||||||
"GET",
|
"POST",
|
||||||
"/adrive/v1.0/openFile/get_by_path",
|
"/adrive/v1.0/openFile/get_by_path",
|
||||||
params={
|
json={
|
||||||
|
"drive_id": self._default_drive_id,
|
||||||
"file_path": str(path)
|
"file_path": str(path)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
base_url = "https://proapi.115.com"
|
base_url = "https://proapi.115.com"
|
||||||
|
|
||||||
# CID和路径缓存
|
# CID和路径缓存
|
||||||
_id_cache: Dict[str, int] = {}
|
_id_cache: Dict[str, str] = {}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -233,13 +233,13 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
return ret_data.get(result_key)
|
return ret_data.get(result_key)
|
||||||
return ret_data
|
return ret_data
|
||||||
|
|
||||||
def _path_to_id(self, path: str) -> int:
|
def _path_to_id(self, path: str) -> str:
|
||||||
"""
|
"""
|
||||||
路径转FID(带缓存机制)
|
路径转FID(带缓存机制)
|
||||||
"""
|
"""
|
||||||
# 根目录
|
# 根目录
|
||||||
if path == "/":
|
if path == "/":
|
||||||
return 0
|
return '0'
|
||||||
if len(path) > 1 and path.endswith("/"):
|
if len(path) > 1 and path.endswith("/"):
|
||||||
path = path[:-1]
|
path = path[:-1]
|
||||||
# 检查缓存
|
# 检查缓存
|
||||||
@@ -282,8 +282,8 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
if not current_id:
|
if not current_id:
|
||||||
raise FileNotFoundError(f"【115】{path} 不存在")
|
raise FileNotFoundError(f"【115】{path} 不存在")
|
||||||
# 缓存路径
|
# 缓存路径
|
||||||
self._id_cache[path] = current_id
|
self._id_cache[path] = str(current_id)
|
||||||
return current_id
|
return str(current_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _calc_sha1(filepath: Path, size: Optional[int] = None) -> str:
|
def _calc_sha1(filepath: Path, size: Optional[int] = None) -> str:
|
||||||
@@ -315,7 +315,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
return [item]
|
return [item]
|
||||||
return []
|
return []
|
||||||
if fileitem.path == "/":
|
if fileitem.path == "/":
|
||||||
cid = 0
|
cid = '0'
|
||||||
else:
|
else:
|
||||||
cid = fileitem.fileid
|
cid = fileitem.fileid
|
||||||
|
|
||||||
@@ -327,7 +327,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"GET",
|
"GET",
|
||||||
"/open/ufile/files",
|
"/open/ufile/files",
|
||||||
"data",
|
"data",
|
||||||
params={"cid": cid, "limit": 1000, "offset": offset, "cur": True, "show_dir": 1}
|
params={"cid": int(cid), "limit": 1000, "offset": offset, "cur": True, "show_dir": 1}
|
||||||
)
|
)
|
||||||
if resp is None:
|
if resp is None:
|
||||||
raise FileNotFoundError(f"【115】{fileitem.path} 检索出错!")
|
raise FileNotFoundError(f"【115】{fileitem.path} 检索出错!")
|
||||||
@@ -336,12 +336,13 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
for item in resp:
|
for item in resp:
|
||||||
# 更新缓存
|
# 更新缓存
|
||||||
path = f"{fileitem.path}{item['fn']}"
|
path = f"{fileitem.path}{item['fn']}"
|
||||||
self._id_cache[path] = item["fid"]
|
self._id_cache[path] = str(item["fid"])
|
||||||
|
|
||||||
file_path = path + ("/" if item["fc"] == "0" else "")
|
file_path = path + ("/" if item["fc"] == "0" else "")
|
||||||
items.append(schemas.FileItem(
|
items.append(schemas.FileItem(
|
||||||
storage=self.schema.value,
|
storage=self.schema.value,
|
||||||
fileid=item["fid"],
|
fileid=str(item["fid"]),
|
||||||
|
parent_fileid=cid,
|
||||||
name=item["fn"],
|
name=item["fn"],
|
||||||
basename=Path(item["fn"]).stem,
|
basename=Path(item["fn"]).stem,
|
||||||
extension=item["ico"] if item["fc"] == "1" else None,
|
extension=item["ico"] if item["fc"] == "1" else None,
|
||||||
@@ -367,7 +368,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"POST",
|
"POST",
|
||||||
"/open/folder/add",
|
"/open/folder/add",
|
||||||
data={
|
data={
|
||||||
"pid": parent_item.fileid,
|
"pid": int(parent_item.fileid),
|
||||||
"file_name": name
|
"file_name": name
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -380,10 +381,10 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
logger.warn(f"【115】创建目录失败: {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)] = str(resp["data"]["file_id"])
|
||||||
return schemas.FileItem(
|
return schemas.FileItem(
|
||||||
storage=self.schema.value,
|
storage=self.schema.value,
|
||||||
fileid=resp["data"]["file_id"],
|
fileid=str(resp["data"]["file_id"]),
|
||||||
path=str(new_path) + "/",
|
path=str(new_path) + "/",
|
||||||
name=name,
|
name=name,
|
||||||
basename=name,
|
basename=name,
|
||||||
@@ -500,7 +501,8 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
logger.info(f"【115】{target_name} 秒传成功")
|
logger.info(f"【115】{target_name} 秒传成功")
|
||||||
return schemas.FileItem(
|
return schemas.FileItem(
|
||||||
storage=self.schema.value,
|
storage=self.schema.value,
|
||||||
fileid=file_id,
|
fileid=str(file_id),
|
||||||
|
parent_fileid=target_cid,
|
||||||
path=target_path,
|
path=target_path,
|
||||||
name=target_name,
|
name=target_name,
|
||||||
basename=Path(target_name).stem,
|
basename=Path(target_name).stem,
|
||||||
@@ -606,7 +608,8 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
# 返回结果
|
# 返回结果
|
||||||
return schemas.FileItem(
|
return schemas.FileItem(
|
||||||
storage=self.schema.value,
|
storage=self.schema.value,
|
||||||
fileid=file_id,
|
fileid=str(file_id),
|
||||||
|
parent_fileid = target_cid,
|
||||||
type="file",
|
type="file",
|
||||||
path=target_path,
|
path=target_path,
|
||||||
name=target_name,
|
name=target_name,
|
||||||
@@ -655,7 +658,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"POST",
|
"POST",
|
||||||
"/open/ufile/delete",
|
"/open/ufile/delete",
|
||||||
data={
|
data={
|
||||||
"file_ids": fileitem.fileid
|
"file_ids": int(fileitem.fileid)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
@@ -670,7 +673,7 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"POST",
|
"POST",
|
||||||
"/open/ufile/update",
|
"/open/ufile/update",
|
||||||
data={
|
data={
|
||||||
"file_id": fileitem.fileid,
|
"file_id": int(fileitem.fileid),
|
||||||
"file_name": name
|
"file_name": name
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -700,14 +703,14 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"/open/folder/get_info",
|
"/open/folder/get_info",
|
||||||
"data",
|
"data",
|
||||||
params={
|
params={
|
||||||
"file_id": file_id
|
"file_id": int(file_id)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if not resp:
|
if not resp:
|
||||||
return None
|
return None
|
||||||
return schemas.FileItem(
|
return schemas.FileItem(
|
||||||
storage=self.schema.value,
|
storage=self.schema.value,
|
||||||
fileid=resp["file_id"],
|
fileid=str(resp["file_id"]),
|
||||||
path=str(path) + ("/" if resp["file_category"] == "1" else ""),
|
path=str(path) + ("/" if resp["file_category"] == "1" else ""),
|
||||||
type="file" if resp["file_category"] == "1" else "dir",
|
type="file" if resp["file_category"] == "1" else "dir",
|
||||||
name=resp["file_name"],
|
name=resp["file_name"],
|
||||||
@@ -772,20 +775,20 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"POST",
|
"POST",
|
||||||
"/open/ufile/copy",
|
"/open/ufile/copy",
|
||||||
data={
|
data={
|
||||||
"file_id": src_fid,
|
"file_id": int(src_fid),
|
||||||
"pid": dest_cid
|
"pid": int(dest_cid)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if not resp:
|
if not resp:
|
||||||
return False
|
return False
|
||||||
if resp["state"]:
|
if resp["state"]:
|
||||||
new_path = Path(path) / fileitem.name
|
new_path = Path(path) / fileitem.name
|
||||||
new_file = self.get_item(new_path)
|
new_item = self.get_item(new_path)
|
||||||
self.rename(new_file, new_name)
|
self.rename(new_item, new_name)
|
||||||
# 更新缓存
|
# 更新缓存
|
||||||
del self._id_cache[fileitem.path]
|
del self._id_cache[fileitem.path]
|
||||||
rename_new_path = Path(path) / new_name
|
rename_new_path = Path(path) / new_name
|
||||||
self._id_cache[str(rename_new_path)] = int(new_file.fileid)
|
self._id_cache[str(rename_new_path)] = new_item.fileid
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -800,8 +803,8 @@ class U115Pan(StorageBase, metaclass=Singleton):
|
|||||||
"POST",
|
"POST",
|
||||||
"/open/ufile/move",
|
"/open/ufile/move",
|
||||||
data={
|
data={
|
||||||
"file_ids": src_fid,
|
"file_ids": int(src_fid),
|
||||||
"to_cid": dest_cid
|
"to_cid": int(dest_cid)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if not resp:
|
if not resp:
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ class FileItem(BaseModel):
|
|||||||
# 子节点
|
# 子节点
|
||||||
children: Optional[list] = Field(default_factory=list)
|
children: Optional[list] = Field(default_factory=list)
|
||||||
# ID
|
# ID
|
||||||
fileid: Optional[Union[str, int]] = None
|
fileid: Optional[str] = None
|
||||||
# 父ID
|
# 父ID
|
||||||
parent_fileid: Optional[str] = None
|
parent_fileid: Optional[str] = None
|
||||||
# 缩略图
|
# 缩略图
|
||||||
|
|||||||
Reference in New Issue
Block a user