From 39f252fa0bd4f4b2a70c3cbeae476a7e4564bd08 Mon Sep 17 00:00:00 2001 From: "lzyme.dev@gmail.com" Date: Sat, 29 Aug 2026 18:44:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=9B=AE=E5=BD=95=E5=8F=AF=E9=80=89?= =?UTF-8?q?=E5=88=A0=E9=99=A4,=E6=9A=82=E6=97=B6=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8B=E8=BD=BD=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/jhs-enhance.user.js | 95 +++++++++++++++++++++++++-------- src/plugins/cover-button.js | 92 +++++++++++++++++++++++-------- src/plugins/wangpan-115-task.js | 1 + src/plugins/wangpan-115.js | 6 +-- 4 files changed, 146 insertions(+), 48 deletions(-) diff --git a/dist/jhs-enhance.user.js b/dist/jhs-enhance.user.js index 1d1b2f0..882edff 100644 --- a/dist/jhs-enhance.user.js +++ b/dist/jhs-enhance.user.js @@ -8082,7 +8082,6 @@ ${err.stack}` : ""); } return fileId; } - async deleteOfflineTasksByKeyword(keyword) { try { const singInfo = await (async () => { @@ -8715,7 +8714,7 @@ ${err.stack}` : ""); title="点击查看匹配详情">匹配${matchList.length}个`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0 && matchList[0].dirId) { - $deleteBtn.attr("data-dir-id", matchList[0].dirId); + $deleteBtn.attr("data-match", JSON.stringify(matchList)); $deleteBtn.show(); } } else { @@ -8723,7 +8722,7 @@ ${err.stack}` : ""); title="点击重新尝试匹配">未匹配`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0) { - $deleteBtn.removeAttr("data-dir-id"); + $deleteBtn.removeAttr("data-match"); $deleteBtn.hide(); } } @@ -8788,7 +8787,7 @@ ${err.stack}` : ""); title="${title}">匹配${matchList.length}个`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0 && matchList[0].dirId) { - $deleteBtn.attr("data-dir-id", matchList[0].dirId); + $deleteBtn.attr("data-match", JSON.stringify(matchList)); $deleteBtn.show(); } } else $box2.find(".video-title").prepend(` { + this.showDeleteDialog(carNum2, matchList, $box2); + })); + } + + showDeleteDialog(carNum2, matchList, $box2) { + const formatSize = (bytes) => { + if (!bytes) return "-"; + const units = ["B", "KB", "MB", "GB", "TB"]; + let size = parseFloat(bytes), unit = 0; + for (; size >= 1024 && unit < units.length - 1;) size /= 1024, unit++; + return size.toFixed(2) + " " + units[unit]; + }; + let html = '
'; + html += `
作品 ${carNum2} 匹配到 ${matchList.length} 个文件夹:
`; + html += '
'; + for (let i = 0; i < matchList.length; i++) { + const m = matchList[i]; + html += `
+ +
`; + } + html += "
"; + const layerIndex = layer.open({ + type: 1, + title: `删除115作品文件夹`, + content: html, + area: ["520px", "auto"], + btn: ["确定删除", "取消"], + shadeClose: false, + yes: async (index) => { + const $layer = $(`#layui-layer${index}`); + const checked = $layer.find(".jhs-delete-folder-cb:checked"); + if (0 === checked.length) { + show.error("请至少选择一个文件夹"); + return; + } + const selected = checked.map((function () { + return parseInt($(this).data("index")); + })).get(); + layer.close(index); let loadObj = loading(); + let deletedCount = 0; try { - const result = await gmHttp.postForm("https://webapi.115.com/rb/delete", { - pid: 0, - "fid[0]": dirId - }); - loadObj.close(); - if (result && result.state) { - show.ok(`作品 "${carNum2}" 已从115删除`); - const matchPlugin = this.getBean("WangPan115MatchPlugin"); - const matchList = await matchPlugin.searchFiles(carNum2); - matchPlugin.updateMatchStatus($box2, carNum2, matchList); - this.getBean("WangPan115TaskPlugin").deleteOfflineTasksByKeyword(carNum2); - } else { - const errMsg = result && result.error_msg ? result.error_msg : "未知错误"; - show.error(`删除失败: ${errMsg}`); + for (const i of selected) { + const m = matchList[i]; + const result = await gmHttp.postForm("https://webapi.115.com/rb/delete", { + pid: m.dirId, + "fid[0]": m.folderId + }); + result && result.state ? deletedCount++ : console.error(`删除失败: ${m.name}`, result); } + loadObj.close(); + show.ok(`作品 "${carNum2}" 已删除 ${deletedCount} 个文件夹`); + const matchPlugin = this.getBean("WangPan115MatchPlugin"); + const newMatchList = await matchPlugin.searchFiles(carNum2); + matchPlugin.updateMatchStatus($box2, carNum2, newMatchList); + this.getBean("WangPan115TaskPlugin").deleteOfflineTasksByKeyword(carNum2); } catch (error) { loadObj.close(); console.error("删除115文件失败:", error); show.error(`删除失败: ${error.message || "网络错误"}`); } - })); + } + }); + $(`#layui-layer${layerIndex}`).on("change", ".jhs-delete-select-all", (function () { + const checked = $(this).prop("checked"); + $(`#layui-layer${layerIndex} .jhs-delete-folder-cb`).prop("checked", checked); })); } showImg($svgElement, $img, carNum2) { diff --git a/src/plugins/cover-button.js b/src/plugins/cover-button.js index 492c714..8e0df64 100644 --- a/src/plugins/cover-button.js +++ b/src/plugins/cover-button.js @@ -139,40 +139,88 @@ class CoverButtonPlugin extends BasePlugin { event.preventDefault(); event.stopPropagation(); const $btn = $(event.currentTarget); - const dirId = $btn.attr("data-dir-id"); - if (!dirId) { - show.error("未找到115目录ID"); + const matchData = $btn.attr("data-match"); + if (!matchData) { + show.error("未找到115匹配数据"); return; } + const matchList = JSON.parse(matchData); const $box2 = $btn.closest(".item"); const {carNum: carNum2} = this.getBoxCarInfo($box2); - utils.q(event, `确认删除115中作品 "${carNum2}" 的整个目录吗?此操作不可撤销!`, (async () => { + this.showDeleteDialog(carNum2, matchList, $box2); + })); + } + + showDeleteDialog(carNum2, matchList, $box2) { + const formatSize = bytes => { + if (!bytes) return "-"; + const units = ["B", "KB", "MB", "GB", "TB"]; + let size = parseFloat(bytes), unit = 0; + for (; size >= 1024 && unit < units.length - 1;) size /= 1024, unit++; + return size.toFixed(2) + " " + units[unit]; + }; + let html = '
'; + html += `
作品 ${carNum2} 匹配到 ${matchList.length} 个文件夹:
`; + html += '
'; + for (let i = 0; i < matchList.length; i++) { + const m = matchList[i]; + html += `
+ +
`; + } + html += "
"; + const layerIndex = layer.open({ + type: 1, + title: `删除115作品文件夹`, + content: html, + area: ["520px", "auto"], + btn: ["确定删除", "取消"], + shadeClose: !1, + yes: async index => { + const $layer = $(`#layui-layer${index}`); + const checked = $layer.find(".jhs-delete-folder-cb:checked"); + if (0 === checked.length) { + show.error("请至少选择一个文件夹"); + return; + } + const selected = checked.map((function () { + return parseInt($(this).data("index")); + })).get(); + layer.close(index); let loadObj = loading(); + let deletedCount = 0; try { - // 使用旧版115删除API删除整个作品目录 - // 删除后也会尝试删除对应的离线下载任务记录,避免重新下载时提示"任务已存在" - // 注意:旧版任务删除接口(task_del)可能已失效,新版接口需要安全验证,若删除失败请手动清理 - const result = await gmHttp.postForm("https://webapi.115.com/rb/delete", { - pid: 0, - "fid[0]": dirId - }); - loadObj.close(); - if (result && result.state) { - show.ok(`作品 "${carNum2}" 已从115删除`); - const matchPlugin = this.getBean("WangPan115MatchPlugin"); - const matchList = await matchPlugin.searchFiles(carNum2); - matchPlugin.updateMatchStatus($box2, carNum2, matchList); - // this.getBean("WangPan115TaskPlugin").deleteOfflineTasksByKeyword(carNum2); - } else { - const errMsg = result && result.error_msg ? result.error_msg : "未知错误"; - show.error(`删除失败: ${errMsg}`); + for (const i of selected) { + const m = matchList[i]; + const result = await gmHttp.postForm("https://webapi.115.com/rb/delete", { + pid: m.dirId, + "fid[0]": m.folderId + }); + result && result.state ? deletedCount++ : console.error(`删除失败: ${m.name}`, result); } + loadObj.close(); + show.ok(`作品 "${carNum2}" 已删除 ${deletedCount} 个文件夹`); + const matchPlugin = this.getBean("WangPan115MatchPlugin"); + const newMatchList = await matchPlugin.searchFiles(carNum2); + matchPlugin.updateMatchStatus($box2, carNum2, newMatchList); + //暂时没有删除离线任务的功能 + //this.getBean("WangPan115TaskPlugin").deleteOfflineTasksByKeyword(carNum2); } catch (error) { loadObj.close(); console.error("删除115文件失败:", error); show.error(`删除失败: ${error.message || "网络错误"}`); } - })); + } + }); + $(`#layui-layer${layerIndex}`).on("change", ".jhs-delete-select-all", (function () { + const checked = $(this).prop("checked"); + $(`#layui-layer${layerIndex} .jhs-delete-folder-cb`).prop("checked", checked); })); } showImg($svgElement, $img, carNum2) { diff --git a/src/plugins/wangpan-115-task.js b/src/plugins/wangpan-115-task.js index 4548442..9b7c4e8 100644 --- a/src/plugins/wangpan-115-task.js +++ b/src/plugins/wangpan-115-task.js @@ -146,6 +146,7 @@ class WangPan115TaskPlugin extends BasePlugin { return fileId; } + //TODO: 暂时没有删除离线任务 // async deleteOfflineTasksByKeyword(keyword) { // try { // const singInfo = await (async () => { diff --git a/src/plugins/wangpan-115.js b/src/plugins/wangpan-115.js index 8014177..cf010bd 100644 --- a/src/plugins/wangpan-115.js +++ b/src/plugins/wangpan-115.js @@ -345,14 +345,14 @@ const _WangPan115MatchPlugin = class _WangPan115MatchPlugin extends BasePlugin { $box2.find(".jhs-match-btn").replaceWith(`
匹配${matchList.length}个`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0 && matchList[0].dirId) { - $deleteBtn.attr("data-dir-id", matchList[0].dirId); + $deleteBtn.attr("data-match", JSON.stringify(matchList)); $deleteBtn.show(); } } else { $box2.find(".jhs-match-btn").replaceWith(`未匹配`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0) { - $deleteBtn.removeAttr("data-dir-id"); + $deleteBtn.removeAttr("data-match"); $deleteBtn.hide(); } } @@ -409,7 +409,7 @@ const _WangPan115MatchPlugin = class _WangPan115MatchPlugin extends BasePlugin { $box2.find(".video-title").prepend(`匹配${matchList.length}个`); const $deleteBtn = $box2.find(".delete115Svg"); if ($deleteBtn.length > 0 && matchList[0].dirId) { - $deleteBtn.attr("data-dir-id", matchList[0].dirId); + $deleteBtn.attr("data-match", JSON.stringify(matchList)); $deleteBtn.show(); } } else $box2.find(".video-title").prepend(`未匹配`);