mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-07-13 06:51:14 +00:00
Compare commits
353 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 69d5f269bd | |||
| 459c974cb8 | |||
| 2f22cb01eb | |||
| e17fb99de4 | |||
| 0f926a57ef | |||
| 4380bfe0d6 | |||
| 8127cd0758 | |||
| 71a220f42b | |||
| d3b02676ec | |||
| d8f0dc4f8e | |||
| 48aa5b6148 | |||
| a989841a89 | |||
| 86783e8e46 | |||
| 66b9bcc53a | |||
| ff08615d1e | |||
| 4a6c3a1f90 | |||
| c79702eba8 | |||
| 41fc935c09 | |||
| 5fbbe5b240 | |||
| 9c121c03f2 | |||
| b74c3f31c4 | |||
| f23b97e22c | |||
| 0560989e77 | |||
| f2c9c34324 | |||
| a97268c702 | |||
| 2654b550fb | |||
| 12a5a17a30 | |||
| e346812c0a | |||
| 6b2e391af9 | |||
| 199456cb11 | |||
| 636994387f | |||
| 90c79f7bac | |||
| 79601b36a5 | |||
| 96cef89f08 | |||
| e057825b25 | |||
| ebe848dfe8 | |||
| e259a0989e | |||
| f750aa68e8 | |||
| 49b8501e86 | |||
| fc2e2a4697 | |||
| b4b1d7f923 | |||
| df646b8c43 | |||
| 8e790f6b22 | |||
| 2e76af980e | |||
| 80ccbe5b62 | |||
| aa0cd68f7f | |||
| 51833148b1 | |||
| 0fa77ebf21 | |||
| 584c075930 | |||
| 9e7a3718a4 | |||
| 0e2ca2f1ca | |||
| 52e889333b | |||
| 4745440079 | |||
| b5628eac17 | |||
| d23b11577e | |||
| f1dd9fc0ee | |||
| 0877fadcfb | |||
| 733059dc8e | |||
| 321380c2b9 | |||
| deb121a51b | |||
| b6aef7c239 | |||
| b13a7a5ee1 | |||
| fff6a00690 | |||
| b4da3cee20 | |||
| 0a650996a1 | |||
| 37b91cd388 | |||
| 42b721eabf | |||
| 231d5c3fb9 | |||
| 064efdf3f3 | |||
| 7b364a0f90 | |||
| c8a4ca7f16 | |||
| 97627b824c | |||
| 6dbdc9bd90 | |||
| 4166ea10af | |||
| fa12ab2c51 | |||
| 4fc4ed8640 | |||
| 48172f2769 | |||
| c7e6d68fbd | |||
| e6672a51c5 | |||
| abde7841ac | |||
| 8e661ed1c5 | |||
| 217cb3a776 | |||
| b8c1bca900 | |||
| 5e09b8e92a | |||
| c16bde6bb8 | |||
| eb06eb9f3d | |||
| 0c49088098 | |||
| b970241a64 | |||
| 6c5aafc11e | |||
| ca0846f4a7 | |||
| 14f7fcc5ad | |||
| 23a18aba5c | |||
| 2d5a79bb16 | |||
| 51e1bbefbb | |||
| 6647fc5371 | |||
| b67544f0cd | |||
| ef5826a73b | |||
| a48adbd0df | |||
| 5c60493a24 | |||
| 55e6227de0 | |||
| 24a7395004 | |||
| b2a7187fc5 | |||
| ace7cdc88e | |||
| 2e909b5868 | |||
| de78bcbc98 | |||
| c560f0e902 | |||
| 88860c9302 | |||
| ef65d0e095 | |||
| 6438505f4a | |||
| 1be5030dd1 | |||
| 421b2f4a42 | |||
| a66bf84381 | |||
| 0c4d366d6d | |||
| a1d0a921fa | |||
| 2092230a61 | |||
| 6e5ae6eff3 | |||
| 4f8259d772 | |||
| 8b987d9824 | |||
| e8ba451d18 | |||
| 77758db463 | |||
| 6c58598a8e | |||
| 3ac35230a3 | |||
| ca91302d28 | |||
| e07272a5dc | |||
| 461305e1df | |||
| 8e8ab10a0f | |||
| e754326925 | |||
| 4c92994c6f | |||
| 66c57f47ac | |||
| ec689eadd8 | |||
| c1e15709a7 | |||
| 2848937ce7 | |||
| 42ff0c21b2 | |||
| 3ed7e547e6 | |||
| fad8e688df | |||
| b2f2dcac4c | |||
| fcba78e977 | |||
| 77c9d777a1 | |||
| 4460659210 | |||
| 8631524107 | |||
| 0579588814 | |||
| df2bfb6ac7 | |||
| 517b6f8910 | |||
| 94a46d2833 | |||
| 1631a0faa1 | |||
| 06d5943cb6 | |||
| 3095e13676 | |||
| 482cbce7e8 | |||
| ef2fc3ab98 | |||
| 5b57b05eae | |||
| 093579c6f5 | |||
| c2d4990d7f | |||
| 40e8380738 | |||
| b716e1e861 | |||
| 8432d4952c | |||
| dd8f085f63 | |||
| 161ff8d8a3 | |||
| 1390cd0104 | |||
| 7a02b1e97f | |||
| 036f107c90 | |||
| 5652383450 | |||
| 9a047a5da0 | |||
| 8975743a37 | |||
| 0e30eafe49 | |||
| 7facb62f21 | |||
| 30d43cb961 | |||
| c505b17e35 | |||
| 080c4c753d | |||
| ade0d34d91 | |||
| 56d082eb0b | |||
| 795c4529ba | |||
| 0f5cfe22ea | |||
| 925ad2c3a5 | |||
| f3e96907fe | |||
| 75a1e58a7d | |||
| 379e889f71 | |||
| 40c06f397b | |||
| 9e9302436e | |||
| 6d816d4193 | |||
| 438eda9c08 | |||
| ace39e4633 | |||
| 7712391f29 | |||
| 65f08dcb02 | |||
| 1d332aa6f4 | |||
| ba81641517 | |||
| fb30bdb879 | |||
| fc451d3b41 | |||
| ffee1f3462 | |||
| f30027dd13 | |||
| 8b6aad17f4 | |||
| b77930adfb | |||
| aff8f88076 | |||
| 4e6582e24c | |||
| fa9acaccfd | |||
| 0414f85f12 | |||
| 527dd0eeb4 | |||
| 74ed7475c9 | |||
| 54dc3dba96 | |||
| 9980159090 | |||
| 0b193ebb00 | |||
| f5fc9843b2 | |||
| df1f67dd26 | |||
| b069a5f576 | |||
| 7686763a03 | |||
| 635a6eac37 | |||
| 877edc535f | |||
| 01d59e3c1e | |||
| fece2799e3 | |||
| de9756ee86 | |||
| 51f047a51b | |||
| 04b66e82b7 | |||
| df89253647 | |||
| 45dbca794e | |||
| 857bf28f99 | |||
| e07ce15228 | |||
| 0637bcfd8e | |||
| 23db0563ac | |||
| ccba71aa4e | |||
| fee4bf2ad6 | |||
| 5052fea9ef | |||
| e85215fca1 | |||
| e42fe45329 | |||
| 4240815bd1 | |||
| 6f0c5305e2 | |||
| 757005cad8 | |||
| 81651ad97c | |||
| f3763b6058 | |||
| 82478dc485 | |||
| 703fd05d43 | |||
| ff868b6e2a | |||
| 051a74b37b | |||
| a0a1085623 | |||
| 2612d3919c | |||
| 6f123a236f | |||
| 71e57e6a08 | |||
| 7cb18d8186 | |||
| cdbf670ece | |||
| e0dafee617 | |||
| c37bce1563 | |||
| 0b3c77d644 | |||
| 2cf85caf86 | |||
| 594010ba88 | |||
| d91460d2e2 | |||
| 89713e6ac9 | |||
| 17c9b2538c | |||
| d337b003cb | |||
| 8f1485656b | |||
| f0c4ec3031 | |||
| 458be84aca | |||
| c7716aad34 | |||
| 4a3e734408 | |||
| 54cc212753 | |||
| f4ae1eaa51 | |||
| d2537282c9 | |||
| 87527688c3 | |||
| 2be0b6505a | |||
| 672f100c7c | |||
| 5af402c0c5 | |||
| 693a4f0f63 | |||
| f8d2426ff6 | |||
| 973a9bedcd | |||
| a583733400 | |||
| 78eb51b3ca | |||
| a2606be9d8 | |||
| a4975c72ce | |||
| 58f96822a4 | |||
| 96b0d94986 | |||
| 70b38db8c5 | |||
| b6a9c2d3a0 | |||
| a01df6c7db | |||
| 4455bee570 | |||
| cd0adef2ed | |||
| 4aa24a65fb | |||
| 760dca8772 | |||
| 8269673619 | |||
| 82ec586554 | |||
| ca98cc8708 | |||
| f07800985d | |||
| b042df93b7 | |||
| ecf4441946 | |||
| 39b2612840 | |||
| 218f486e6b | |||
| cfcc25f175 | |||
| 155e88223c | |||
| 05039ece51 | |||
| 1c673f2b46 | |||
| 2232a70228 | |||
| e661b1d817 | |||
| 5a6a65f580 | |||
| 5cdd3bcd30 | |||
| 1233a885b8 | |||
| adf56cd768 | |||
| cd4b208be9 | |||
| 502de1a5d0 | |||
| 4158f869a3 | |||
| ff569d339c | |||
| 10eec323dd | |||
| 0a3db51c7d | |||
| 229aee0b30 | |||
| 44714aa981 | |||
| 2b6138a889 | |||
| 5e424f7bf4 | |||
| 294e47deed | |||
| dc42547b73 | |||
| 7ef7f0706b | |||
| a59b98a7c9 | |||
| 088fee9a4d | |||
| d8666acfe8 | |||
| 209e9c2866 | |||
| 6c3195dea4 | |||
| 7d774a7433 | |||
| f1ec4433cf | |||
| 1f825db261 | |||
| 1019f24f1d | |||
| f5c5b99579 | |||
| e002d19f1b | |||
| 0d5c9651f0 | |||
| 53fc13b95c | |||
| 694c3b0ddc | |||
| 9b3d4577cc | |||
| 77783915dd | |||
| b67ac21a79 | |||
| 603afed2f2 | |||
| c2a7c34496 | |||
| edd40f48ba | |||
| cca3d6b8b9 | |||
| f004512903 | |||
| 6407bb6730 | |||
| b914eeadec | |||
| dcadc6783e | |||
| bc9f43634f | |||
| 4778f0164c | |||
| 9904754a07 | |||
| 1b79077c9e | |||
| c13afb05b3 | |||
| 03e320efb8 | |||
| 7846332476 | |||
| 2d5d3b86e0 | |||
| 7c9ba890af | |||
| 0d609daffa | |||
| c12e56d402 | |||
| c7b38c07d5 | |||
| dc51066cea | |||
| 59d2fb3010 | |||
| a0fe702c10 | |||
| f886f7e366 | |||
| 1d475d88ed | |||
| e64c901912 | |||
| 5fce02e623 | |||
| 13997bc543 | |||
| 3e05b0d6f9 | |||
| 966417f867 | |||
| 601a0d1b91 |
@@ -1,30 +1,70 @@
|
||||
package cn.qaiu.parser.impl;
|
||||
|
||||
import cn.qaiu.entity.FileInfo;
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.PanBase;
|
||||
import cn.qaiu.util.FileSizeConverter;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.MultiMap;
|
||||
import io.vertx.core.Promise;
|
||||
import io.vertx.core.json.JsonArray;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* <a href="https://lecloud.lenovo.com/">联想乐云</a>
|
||||
*/
|
||||
public class LeTool extends PanBase {
|
||||
private static final String API_URL_PREFIX = "https://lecloud.lenovo.com/share/api/clouddiskapi/share/public/v1/";
|
||||
private static final String API_URL_PREFIX = "https://lecloud.lenovo.com/mshare/api/clouddiskapi/share/public/v1/";
|
||||
private static final String DEFAULT_FILE_TYPE = "file";
|
||||
private static final int FILE_TYPE_DIRECTORY = 0; // 目录类型
|
||||
|
||||
private static final MultiMap HEADERS;
|
||||
|
||||
static {
|
||||
HEADERS = MultiMap.caseInsensitiveMultiMap();
|
||||
HEADERS.set("Accept", "application/json, text/plain, */*");
|
||||
HEADERS.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
|
||||
HEADERS.set("Cache-Control", "no-cache");
|
||||
HEADERS.set("Connection", "keep-alive");
|
||||
HEADERS.set("Content-Type", "application/json");
|
||||
HEADERS.set("DNT", "1");
|
||||
HEADERS.set("Origin", "https://lecloud.lenovo.com");
|
||||
HEADERS.set("Pragma", "no-cache");
|
||||
HEADERS.set("Sec-Fetch-Dest", "empty");
|
||||
HEADERS.set("Sec-Fetch-Mode", "cors");
|
||||
HEADERS.set("Sec-Fetch-Site", "same-origin");
|
||||
HEADERS.set("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1 Edg/143.0.0.0");
|
||||
}
|
||||
|
||||
public LeTool(ShareLinkInfo shareLinkInfo) {
|
||||
super(shareLinkInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取干净的 shareId(去掉可能的查询参数)
|
||||
* URL 如 https://lecloud.lenovo.com/share/5eoN3RA5PLhQcH4zE?path=... 会导致 shareKey 包含查询参数
|
||||
*/
|
||||
private String getCleanShareId() {
|
||||
String shareKey = shareLinkInfo.getShareKey();
|
||||
if (shareKey != null && shareKey.contains("?")) {
|
||||
return shareKey.split("\\?")[0];
|
||||
}
|
||||
return shareKey;
|
||||
}
|
||||
|
||||
public Future<String> parse() {
|
||||
final String dataKey = shareLinkInfo.getShareKey();
|
||||
final String dataKey = getCleanShareId();
|
||||
final String pwd = shareLinkInfo.getSharePassword();
|
||||
// {"shareId":"xxx","password":"xxx","directoryId":"-1"}
|
||||
String apiUrl1 = API_URL_PREFIX + "shareInfo";
|
||||
client.postAbs(apiUrl1)
|
||||
.sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", -1))
|
||||
.putHeaders(HEADERS)
|
||||
.sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", "-1"))
|
||||
.onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
if (resJson.containsKey("result")) {
|
||||
@@ -44,7 +84,19 @@ public class LeTool extends PanBase {
|
||||
}
|
||||
JsonObject fileInfoJson = files.getJsonObject(0);
|
||||
if (fileInfoJson != null) {
|
||||
// TODO 文件大小fileSize和文件名fileName
|
||||
// Extract and populate FileInfo
|
||||
FileInfo fileInfo = createFileInfo(fileInfoJson);
|
||||
shareLinkInfo.getOtherParam().put("fileInfo", fileInfo);
|
||||
|
||||
// 判断是否为目录
|
||||
Integer fileType = fileInfoJson.getInteger("fileType");
|
||||
if (fileType != null && fileType == FILE_TYPE_DIRECTORY) {
|
||||
// 如果是目录,返回目录ID
|
||||
String fileId = fileInfoJson.getString("fileId");
|
||||
promise.complete(fileId);
|
||||
return;
|
||||
}
|
||||
|
||||
String fileId = fileInfoJson.getString("fileId");
|
||||
// 根据文件ID获取跳转链接
|
||||
getDownURL(dataKey, fileId);
|
||||
@@ -59,12 +111,195 @@ public class LeTool extends PanBase {
|
||||
return promise.future();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Future<List<FileInfo>> parseFileList() {
|
||||
Promise<List<FileInfo>> listPromise = Promise.promise();
|
||||
|
||||
String dataKey = getCleanShareId();
|
||||
|
||||
// 如果参数里的目录ID不为空,则直接解析目录
|
||||
String dirId = (String) shareLinkInfo.getOtherParam().get("dirId");
|
||||
if (dirId == null || dirId.isEmpty()) {
|
||||
// 如果没有指定目录ID,使用根目录ID "-1"
|
||||
dirId = "-1";
|
||||
}
|
||||
|
||||
// 直接请求shareInfo接口解析目录
|
||||
parseDirectory(dirId, dataKey, listPromise);
|
||||
return listPromise.future();
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析目录下的文件列表
|
||||
*/
|
||||
private void parseDirectory(String directoryId, String shareId, Promise<List<FileInfo>> promise) {
|
||||
String pwd = shareLinkInfo.getSharePassword();
|
||||
if (pwd == null) {
|
||||
pwd = "";
|
||||
}
|
||||
String apiUrl = API_URL_PREFIX + "shareInfo";
|
||||
|
||||
JsonObject requestBody = JsonObject.of("shareId", shareId, "password", pwd, "directoryId", directoryId);
|
||||
log.info("解析目录请求: url={}, body={}", apiUrl, requestBody.encode());
|
||||
|
||||
client.postAbs(apiUrl)
|
||||
.putHeaders(HEADERS)
|
||||
.sendJsonObject(requestBody)
|
||||
.onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
|
||||
if (!resJson.containsKey("result") || !resJson.getBoolean("result")) {
|
||||
promise.fail("解析目录失败: " + resJson.encode());
|
||||
return;
|
||||
}
|
||||
|
||||
JsonObject dataJson = resJson.getJsonObject("data");
|
||||
if (!dataJson.getBoolean("passwordVerified")) {
|
||||
promise.fail("密码验证失败");
|
||||
return;
|
||||
}
|
||||
|
||||
JsonArray files = dataJson.getJsonArray("files");
|
||||
if (files == null || files.isEmpty()) {
|
||||
promise.complete(new ArrayList<>());
|
||||
return;
|
||||
}
|
||||
|
||||
List<FileInfo> fileList = new ArrayList<>();
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
JsonObject fileJson = files.getJsonObject(i);
|
||||
FileInfo fileInfo = createFileInfoForList(fileJson, shareId);
|
||||
fileList.add(fileInfo);
|
||||
}
|
||||
|
||||
promise.complete(fileList);
|
||||
})
|
||||
.onFailure(err -> {
|
||||
log.error("解析目录请求失败: {}", err.getMessage());
|
||||
promise.fail(err);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 为文件列表创建 FileInfo 对象
|
||||
*/
|
||||
private FileInfo createFileInfoForList(JsonObject fileJson, String shareId) {
|
||||
FileInfo fileInfo = new FileInfo();
|
||||
|
||||
try {
|
||||
String fileId = fileJson.getString("fileId");
|
||||
String fileName = fileJson.getString("fileName");
|
||||
Long fileSize = fileJson.getLong("fileSize");
|
||||
Integer fileType = fileJson.getInteger("fileType");
|
||||
|
||||
fileInfo.setFileId(fileId);
|
||||
fileInfo.setFileName(fileName);
|
||||
fileInfo.setPanType(shareLinkInfo.getType());
|
||||
|
||||
// 判断是否为目录
|
||||
if (fileType != null && fileType == FILE_TYPE_DIRECTORY) {
|
||||
// 目录类型
|
||||
fileInfo.setFileType("folder");
|
||||
fileInfo.setSize(0L);
|
||||
fileInfo.setSizeStr("0B");
|
||||
// 设置目录解析的URL - 注意:从API返回的fileId已经是URL编码的,直接使用
|
||||
// 不需要再次编码,避免双重编码导致解析失败
|
||||
fileInfo.setParserUrl(String.format("%s/v2/getFileList?url=%s&dirId=%s",
|
||||
getDomainName(),
|
||||
shareLinkInfo.getShareUrl(),
|
||||
fileId));
|
||||
} else {
|
||||
// 文件类型
|
||||
fileInfo.setFileType(fileType != null ? String.valueOf(fileType) : DEFAULT_FILE_TYPE);
|
||||
fileInfo.setSize(fileSize);
|
||||
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
|
||||
|
||||
// 创建参数JSON并编码为Base64
|
||||
JsonObject paramJson = JsonObject.of(
|
||||
"shareId", shareId,
|
||||
"fileId", fileId
|
||||
);
|
||||
String paramBase64 = Base64.getEncoder().encodeToString(paramJson.encode().getBytes());
|
||||
|
||||
// 设置解析URL和预览URL
|
||||
fileInfo.setParserUrl(String.format("%s/v2/redirectUrl/%s/%s",
|
||||
getDomainName(),
|
||||
shareLinkInfo.getType(),
|
||||
paramBase64))
|
||||
.setPreviewUrl(String.format("%s/v2/viewUrl/%s/%s",
|
||||
getDomainName(),
|
||||
shareLinkInfo.getType(),
|
||||
paramBase64));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.warn("创建文件信息失败: {}", e.getMessage());
|
||||
}
|
||||
|
||||
return fileInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Future<String> parseById() {
|
||||
Promise<String> parsePromise = Promise.promise();
|
||||
|
||||
try {
|
||||
// 从参数中获取解析所需的信息
|
||||
JsonObject paramJson = (JsonObject) shareLinkInfo.getOtherParam().get("paramJson");
|
||||
String shareId = paramJson.getString("shareId");
|
||||
String fileId = paramJson.getString("fileId");
|
||||
|
||||
// 调用获取下载链接
|
||||
getDownURLForById(shareId, fileId, parsePromise);
|
||||
|
||||
} catch (Exception e) {
|
||||
parsePromise.fail("解析参数失败: " + e.getMessage());
|
||||
}
|
||||
|
||||
return parsePromise.future();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据文件ID获取下载URL (用于 parseById)
|
||||
*/
|
||||
private void getDownURLForById(String shareId, String fileId, Promise<String> promise) {
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
JsonArray fileIds = JsonArray.of(fileId);
|
||||
String apiUrl = API_URL_PREFIX + "packageDownloadWithFileIds";
|
||||
|
||||
client.postAbs(apiUrl)
|
||||
.putHeaders(HEADERS)
|
||||
.sendJsonObject(JsonObject.of("fileIds", fileIds, "shareId", shareId, "browserId", uuid))
|
||||
.onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
if (resJson.containsKey("result")) {
|
||||
if (resJson.getBoolean("result")) {
|
||||
JsonObject dataJson = resJson.getJsonObject("data");
|
||||
String downloadUrl = dataJson.getString("downloadUrl");
|
||||
if (downloadUrl == null) {
|
||||
promise.fail("Result JSON数据异常: downloadUrl不存在");
|
||||
return;
|
||||
}
|
||||
// 获取重定向链接
|
||||
clientNoRedirects.getAbs(downloadUrl).send()
|
||||
.onSuccess(res2 -> promise.complete(res2.headers().get("Location")))
|
||||
.onFailure(err -> promise.fail(err));
|
||||
} else {
|
||||
promise.fail(resJson.getString("errcode") + ": " + resJson.getString("errmsg"));
|
||||
}
|
||||
} else {
|
||||
promise.fail("Result JSON数据异常: result字段不存在");
|
||||
}
|
||||
}).onFailure(err -> promise.fail(err));
|
||||
}
|
||||
|
||||
private void getDownURL(String key, String fileId) {
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
JsonArray fileIds = JsonArray.of(fileId);
|
||||
String apiUrl2 = API_URL_PREFIX + "packageDownloadWithFileIds";
|
||||
// {"fileIds":[123],"shareId":"xxx","browserId":"uuid"}
|
||||
client.postAbs(apiUrl2)
|
||||
.putHeaders(HEADERS)
|
||||
.sendJsonObject(JsonObject.of("fileIds", fileIds, "shareId", key, "browserId", uuid))
|
||||
.onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
@@ -89,4 +324,51 @@ public class LeTool extends PanBase {
|
||||
}
|
||||
}).onFailure(handleFail(apiUrl2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create FileInfo object from JSON response
|
||||
* Uses exact field names from the API response without fallback checks
|
||||
*/
|
||||
private FileInfo createFileInfo(JsonObject fileInfoJson) {
|
||||
FileInfo fileInfo = new FileInfo();
|
||||
|
||||
try {
|
||||
// Set fileId
|
||||
String fileId = fileInfoJson.getString("fileId");
|
||||
if (fileId != null) {
|
||||
fileInfo.setFileId(fileId);
|
||||
}
|
||||
|
||||
// Set fileName
|
||||
String fileName = fileInfoJson.getString("fileName");
|
||||
if (fileName != null) {
|
||||
fileInfo.setFileName(fileName);
|
||||
}
|
||||
|
||||
// Set file size
|
||||
Long fileSize = fileInfoJson.getLong("fileSize");
|
||||
if (fileSize != null) {
|
||||
fileInfo.setSize(fileSize);
|
||||
// Convert to readable size string
|
||||
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
|
||||
}
|
||||
|
||||
// Set fileType (API returns it as an integer)
|
||||
Integer fileTypeInt = fileInfoJson.getInteger("fileType");
|
||||
if (fileTypeInt != null) {
|
||||
fileInfo.setFileType(String.valueOf(fileTypeInt));
|
||||
} else {
|
||||
// Default to generic file type if not available
|
||||
fileInfo.setFileType(DEFAULT_FILE_TYPE);
|
||||
}
|
||||
|
||||
// Set panType
|
||||
fileInfo.setPanType(shareLinkInfo.getType());
|
||||
|
||||
} catch (Exception e) {
|
||||
log.warn("Error extracting file info from JSON: {}", e.getMessage());
|
||||
}
|
||||
|
||||
return fileInfo;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,7 +400,7 @@ export default {
|
||||
const data = result.data
|
||||
|
||||
// 检查是否支持目录解析
|
||||
const supportedPans = ["iz", "lz", "fj", "ye"]
|
||||
const supportedPans = ["iz", "lz", "fj", "ye", "le"]
|
||||
if (!supportedPans.includes(data.shareLinkInfo.type)) {
|
||||
this.$message.error("当前网盘不支持目录解析")
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user