This commit is contained in:
2025-11-03 22:28:58 +08:00
parent c2aa65193d
commit 5645870954
13 changed files with 522 additions and 141 deletions

View File

@@ -487,83 +487,130 @@ class MiaoStarsBasicApi:
searchType: Literal["keyword", "internalTag", "externalTag"],
):
"""搜索文件 (Cloudreve V4 API)"""
# 根据Cloudreve V4 API使用/file端点并添加搜索参数
# 根据Cloudreve V4 API使用/file端点并在URI中添加搜索条件
url = "/file"
# 使用Cloudreve V4的URI格式
uri = "cloudreve://my/"
# 构建搜索URI根据Cloudreve V4的搜索规范
# 基础URI指向用户根目录
base_uri = "cloudreve://my/"
# 构建搜索参数
# 根据搜索类型和内容构建查询参数
# 注意Cloudreve V4将搜索条件作为URI的查询部分
search_query = []
if searchType == "keyword" and searchContent:
# 文件名搜索
search_query.append(f"name={quote_plus(searchContent)}")
elif searchType == "internalTag" and searchContent:
# 内部标签搜索
search_query.append(f"tag:internal={quote_plus(searchContent)}")
elif searchType == "externalTag" and searchContent:
# 外部标签搜索
search_query.append(f"tag:external={quote_plus(searchContent)}")
# 构建完整URI
if search_query:
uri = f"{base_uri}?{ '&'.join(search_query) }"
else:
uri = base_uri
# 构建请求参数
params = {
"uri": uri,
"keyword": searchContent,
"page": 0,
"page_size": 100
"page": 0, # 从第一页开始
"page_size": 100, # 使用合理的默认值
"order_by": "updated_at", # 默认按更新时间排序
"order_direction": "desc" # 默认降序
}
# 根据搜索类型调整参数
if searchType == "internalTag":
params["type"] = "internal"
elif searchType == "externalTag":
params["type"] = "tag"
logger.debug(f"发送文件搜索请求: URI={uri}, 搜索类型={searchType}, 搜索内容={searchContent}")
logger.debug(f"发送文件搜索请求: 关键词={searchContent}, 类型={searchType}")
r = self.request("GET", url, params=params)
# 转换响应格式以保持向后兼容
if isinstance(r, dict):
if "data" in r:
if "files" in r["data"]:
# Cloudreve V4 API 格式
return {"code": 0, "data": {"objects": r["data"]["files"]}}
elif isinstance(r["data"], list):
# 如果data是列表直接使用
return {"code": 0, "data": {"objects": r["data"]}}
try:
r = self.request("GET", url, params=params)
logger.warning(f"搜索响应格式不正确: {r}")
return {"code": 0, "data": {"objects": []}}
# 转换响应格式以保持向后兼容
if isinstance(r, dict):
if r.get("code") == 0 and "data" in r:
if "files" in r["data"]:
# Cloudreve V4 API 标准格式
logger.success(f"搜索成功,找到 {len(r['data']['files'])} 个文件")
return {"code": 0, "data": {"objects": r["data"]["files"]}}
elif isinstance(r["data"], list):
# 兼容列表格式响应
return {"code": 0, "data": {"objects": r["data"]}}
else:
logger.warning(f"搜索响应缺少files字段: {r}")
return {"code": 0, "data": {"objects": []}}
else:
# API返回错误
error_msg = r.get("msg", r.get("error", "搜索失败"))
logger.error(f"搜索API返回错误: {error_msg}")
return {"code": -1, "msg": error_msg}
else:
logger.error(f"搜索响应格式无效: {type(r).__name__}")
return {"code": -1, "msg": "搜索响应格式无效"}
except Exception as e:
logger.exception(f"搜索请求异常: {str(e)}")
return {"code": -1, "msg": f"搜索请求异常: {str(e)}"}
def shareSearch(self, keyword, orderBy, order, page):
"""搜索分享 (Cloudreve V4 API)"""
# 使用正确的API端点 - Cloudreve V4使用/share端点获取分享列表
url = "/share"
params = {
"page": page,
"page_size": 50, # 添加默认页面大小以避免"PageSize cannot be empty"错误
"order_by": orderBy,
"order": order,
"keyword": keyword, # 根据实际API支持情况调整
}
r = self.request("GET", url, params=params)
return r
# def shareSearch(self, keyword, orderBy, order, page):
# """搜索分享功能已移除"""
# return {"code": 0, "data": {"objects": []}}
def deleteTag(self, tagId):
"""删除标签"""
"""删除标签 (Cloudreve V4 API)"""
url = f"/tag/{tagId}"
r = self.request("DELETE", url)
# 转换响应格式
if r is None or (isinstance(r, dict) and not r.get("error")):
return {"code": 0, "msg": "标签删除成功"}
# Cloudreve V4 响应格式:{code: 0} 表示成功
if isinstance(r, dict):
if r.get("code") == 0:
return {"code": 0, "msg": "标签删除成功"}
else:
error_msg = r.get("msg", "标签删除失败")
return {"code": -1, "msg": error_msg}
else:
return {"code": -1, "msg": r.get("error", "标签删除失败")}
return {"code": -1, "msg": "标签删除失败:响应格式错误"}
# 重写为不支持添加标签功能
def addTag(self, name, expression):
"""添加标签"""
url = "/tag/filter"
jsons = {
"expression": expression,
"name": name,
"color": "#ff9800",
"icon": "Circle",
}
r = self.request("POST", url, json=jsons)
"""添加标签功能已禁用"""
logger.warning("添加标签功能已禁用")
return {"code": -1, "msg": "添加标签功能已禁用"}
def getMyShares(self, page=1, pageSize=10):
"""获取我的分享列表 (Cloudreve V4 API - GET /user/shares/{user-id})
# 转换响应格式
if r.get("id"):
return {"code": 0, "msg": "标签添加成功", "data": r}
Args:
page: 页码
pageSize: 每页数量
Returns:
分享列表数据
"""
# 使用"me"作为user-id表示当前用户
url = f"/user/shares/me"
params = {
"page": page,
"page_size": pageSize
}
r = self.request("GET", url, params=params)
# Cloudreve V4 响应格式处理
if isinstance(r, dict):
if r.get("code") == 0:
return {
"code": 0,
"msg": "获取分享列表成功",
"data": r.get("data", {})
}
else:
error_msg = r.get("msg", "获取分享列表失败")
return {"code": -1, "msg": error_msg}
else:
return {"code": -1, "msg": r.get("error", "标签添加失败")}
return {"code": -1, "msg": "获取分享列表失败:响应格式错误"}
def getShareFileInfo(self, shareId):
"""获取分享文件信息"""
@@ -589,6 +636,28 @@ class MiaoStarsBasicApi:
return {"code": 0, "msg": "文件内容更新成功"}
else:
return {"code": -1, "msg": r.get("error", "文件内容更新失败")}
def deleteShare(self, shareId):
"""删除分享链接 (Cloudreve V4 API)
Args:
shareId: 分享链接ID
Returns:
操作结果
"""
url = f"/share/{shareId}"
r = self.request("DELETE", url)
# Cloudreve V4 响应格式处理
if isinstance(r, dict):
if r.get("code") == 0:
return {"code": 0, "msg": "删除分享成功"}
else:
error_msg = r.get("msg", "删除分享失败")
return {"code": -1, "msg": error_msg}
else:
return {"code": -1, "msg": "删除分享失败:响应格式错误"}
def renameFile(self, fileUri, newName, fileType="file"):
"""重命名文件 (Cloudreve V4 API)"""