新增下载高清封面

This commit is contained in:
lzyme.dev@gmail.com
2026-09-01 15:24:40 +08:00
parent 080cbb00ee
commit 11c5650efb
3 changed files with 43 additions and 23 deletions
+21 -11
View File
@@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name JHS-enhance // @name JHS-enhance
// @namespace JHS-enhance // @namespace JHS-enhance
// @version 3.3.10 // @version 3.3.11
// @author xiebro,fireinrain // @author xiebro,fireinrain
// @description Jav-鉴黄师 增强脚本。列表页:作品状态标签、一键筛选、新作品检测、演员黑名单过滤;详情页:磁力链接高亮、DMM 多画质预览视频、标题翻译、整合字幕搜索(迅雷+SubTitleCat)并支持 115 直传、多源预览图(javfree/projectjav/javstore)含来源切换;数据:115 网盘目录匹配与多目录选择、云盘备份/恢复、跨 Tab 同步;其他:自动翻页、分类折叠、Top250、以图识图、热门榜单、评论查看、相关清单。支持 JavDB / JavBus / JavSee / SeeJav / FC2 / JavTrailers // @description Jav-鉴黄师 增强脚本。列表页:作品状态标签、一键筛选、新作品检测、演员黑名单过滤;详情页:磁力链接高亮、DMM 多画质预览视频、标题翻译、整合字幕搜索(迅雷+SubTitleCat)并支持 115 直传、多源预览图(javfree/projectjav/javstore)含来源切换;数据:115 网盘目录匹配与多目录选择、云盘备份/恢复、跨 Tab 同步;其他:自动翻页、分类折叠、Top250、以图识图、热门榜单、评论查看、相关清单。支持 JavDB / JavBus / JavSee / SeeJav / FC2 / JavTrailers
// @license MIT // @license MIT
@@ -10428,7 +10428,7 @@ ${err.stack}` : "");
} }
return null; return null;
}; };
const fromJavxyCover = async (code) => { const getJavxyCover = async (code) => {
const query = String(code || "").trim(); const query = String(code || "").trim();
if (!query) return null; if (!query) return null;
for (const endpoint of JAVXY_ENDPOINTS) { for (const endpoint of JAVXY_ENDPOINTS) {
@@ -15714,20 +15714,20 @@ ${err.stack}` : "");
})); }));
$("#downloadCoverBtn").on("click", (async () => { $("#downloadCoverBtn").on("click", (async () => {
if (!isEligibleDmmCoverCode(carNum2)) { if (!isEligibleDmmCoverCode(carNum2)) {
layer.msg("当前番号不支持下载高清封面"); show.error("当前番号不支持下载高清封面");
return; return;
} }
const $btn = $("#downloadCoverBtn"); const $btn = $("#downloadCoverBtn");
$btn.addClass("is-loading").prop("disabled", true); $btn.addClass("is-loading").prop("disabled", true);
try { try {
const coverData = await fromJavxyCover(carNum2); const coverData = await getJavxyCover(carNum2);
if (!coverData) { if (!coverData) {
layer.msg("未找到高清封面"); show.error("未找到高清封面");
return; return;
} }
const coverUrl = coverData.url || coverData.highCover || coverData.cover; const coverUrl = coverData.url || coverData.highCover || coverData.cover;
if (!coverUrl) { if (!coverUrl) {
layer.msg("封面链接为空"); show.error("封面链接为空");
return; return;
} }
const fileName = `${carNum2}-cover.jpg`; const fileName = `${carNum2}-cover.jpg`;
@@ -15737,16 +15737,26 @@ ${err.stack}` : "");
responseType: "blob", responseType: "blob",
onload: (response) => { onload: (response) => {
if (response.status === 200) { if (response.status === 200) {
utils.download(response.response, fileName); const blobUrl = URL.createObjectURL(response.response);
const a = document.createElement("a");
a.href = blobUrl;
a.download = fileName;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
}, 100);
show.ok("封面下载已开始");
} else { } else {
layer.msg(`封面下载失败: ${response.status}`); show.error(`封面下载失败: ${response.status}`);
} }
}, },
onerror: () => layer.msg("封面下载网络错误"), onerror: () => show.error("封面下载网络错误"),
ontimeout: () => layer.msg("封面下载超时") ontimeout: () => show.error("封面下载超时")
}); });
} catch (e) { } catch (e) {
layer.msg("获取封面信息失败"); show.error("获取封面信息失败");
} finally { } finally {
$btn.removeClass("is-loading").prop("disabled", false); $btn.removeClass("is-loading").prop("disabled", false);
} }
+2 -2
View File
@@ -211,7 +211,7 @@ const getJavxyVideoUrls = async (code, failedSources = []) => {
return null; return null;
}; };
const fromJavxyCover = async (code) => { const getJavxyCover = async (code) => {
const query = String(code || '').trim(); const query = String(code || '').trim();
if (!query) return null; if (!query) return null;
@@ -240,7 +240,7 @@ export {
fromJavxyCcCd, fromJavxyCcCd,
fallbackJavxyResult, fallbackJavxyResult,
getJavxyVideoUrls, getJavxyVideoUrls,
fromJavxyCover, getJavxyCover,
normalizeJavxySource, normalizeJavxySource,
isJpSourceTemporarilyFailed, isJpSourceTemporarilyFailed,
markJpSourceTemporarilyFailed, markJpSourceTemporarilyFailed,
+20 -10
View File
@@ -13,7 +13,7 @@ import {
} from '../core/constants.js'; } from '../core/constants.js';
import { HotkeyManager } from './preview-video.js'; import { HotkeyManager } from './preview-video.js';
import {GM_xmlhttpRequest} from 'vite-plugin-monkey/dist/client'; import {GM_xmlhttpRequest} from 'vite-plugin-monkey/dist/client';
import {fromJavxyCover} from '../api/javxy.js'; import {getJavxyCover} from '../api/javxy.js';
class DetailPageButtonPlugin extends BasePlugin { class DetailPageButtonPlugin extends BasePlugin {
getName() { getName() {
@@ -102,20 +102,20 @@ class DetailPageButtonPlugin extends BasePlugin {
})); }));
$("#downloadCoverBtn").on("click", (async () => { $("#downloadCoverBtn").on("click", (async () => {
if (!isEligibleDmmCoverCode(carNum2)) { if (!isEligibleDmmCoverCode(carNum2)) {
layer.msg("当前番号不支持下载高清封面"); show.error("当前番号不支持下载高清封面");
return; return;
} }
const $btn = $("#downloadCoverBtn"); const $btn = $("#downloadCoverBtn");
$btn.addClass("is-loading").prop("disabled", true); $btn.addClass("is-loading").prop("disabled", true);
try { try {
const coverData = await fromJavxyCover(carNum2); const coverData = await getJavxyCover(carNum2);
if (!coverData) { if (!coverData) {
layer.msg("未找到高清封面"); show.error("未找到高清封面");
return; return;
} }
const coverUrl = coverData.url || coverData.highCover || coverData.cover; const coverUrl = coverData.url || coverData.highCover || coverData.cover;
if (!coverUrl) { if (!coverUrl) {
layer.msg("封面链接为空"); show.error("封面链接为空");
return; return;
} }
const fileName = `${carNum2}-cover.jpg`; const fileName = `${carNum2}-cover.jpg`;
@@ -125,16 +125,26 @@ class DetailPageButtonPlugin extends BasePlugin {
responseType: 'blob', responseType: 'blob',
onload: (response) => { onload: (response) => {
if (response.status === 200) { if (response.status === 200) {
utils.download(response.response, fileName); const blobUrl = URL.createObjectURL(response.response);
const a = document.createElement('a');
a.href = blobUrl;
a.download = fileName;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
}, 100);
show.ok("封面下载已开始");
} else { } else {
layer.msg(`封面下载失败: ${response.status}`); show.error(`封面下载失败: ${response.status}`);
} }
}, },
onerror: () => layer.msg("封面下载网络错误"), onerror: () => show.error("封面下载网络错误"),
ontimeout: () => layer.msg("封面下载超时"), ontimeout: () => show.error("封面下载超时"),
}); });
} catch (e) { } catch (e) {
layer.msg("获取封面信息失败"); show.error("获取封面信息失败");
} finally { } finally {
$btn.removeClass("is-loading").prop("disabled", false); $btn.removeClass("is-loading").prop("disabled", false);
} }