Files
JHS-enhance/src/plugins/list-page-button.js
T
lzyme.dev@gmail.com 3c582535c0 add missing file
2026-08-29 16:54:48 +08:00

283 lines
15 KiB
JavaScript

import { BasePlugin } from '../core/base-plugin.js';
import { __publicField, isJavBus, isJavDb, isSearchPage, currentHref, Status_FAVORITE, NO, YES } from '../core/constants.js';
class ListPageButtonPlugin extends BasePlugin {
getName() {
return "ListPageButtonPlugin";
}
async handle() {
if (!window.isListPage) return;
await this.createMenuBtn();
this.bindEvent();
await storageManager.getSetting("autoPage") === YES ? $("#sort-toggle-btn").hide() : this.sortItems().then();
}
async createMenuBtn() {
const showWaitCheckBtn = await storageManager.getSetting("showWaitCheckBtn", YES), showWaitDownBtn = await storageManager.getSetting("showWaitDownBtn", YES);
if (isJavDb) {
const isStarPage = currentHref.includes("/actors/");
let $el = $(".main-tabs, .tabs"), addBlacklistBtnText = "加入黑名单", addBlacklistBtnColor = "#d22020", otherCss = "", blacklistItem = null;
if (isStarPage) {
$el = $(".toolbar, .section-addition").filter(":last");
const blacklist = await storageManager.getBlacklist(), actressPageInfo = this.getActressPageInfo();
if (blacklist.find((item => item.starId === actressPageInfo.starId))) {
addBlacklistBtnText = "已加入黑名单";
addBlacklistBtnColor = "#885d5d";
}
} else currentHref.includes("/tags") && utils.loopDetector((() => $("#jhs-check-tag").text().trim()), (async () => {
const $addBlacklistBtn = $("#addBlacklistBtn");
$addBlacklistBtn.attr("data-tip", "将当前分类标签加入到黑名单, 后续有作品更新也会纳入屏蔽中");
const checkTag = $("#jhs-check-tag").text().trim();
if (!checkTag) return;
const tagStarId = "no-" + checkTag, blacklist = await storageManager.getBlacklist();
blacklistItem = blacklist.find((item => item.starId === tagStarId));
if (blacklistItem) {
$addBlacklistBtn.css("backgroundColor", "#885d5d");
$("#addBlacklistBtn span").text("已加入黑名单");
}
}));
const isFc2Page2 = currentHref.includes("advanced_search");
isFc2Page2 ? $el = $("h2.section-title") : otherCss = "flex-grow:1;";
const jhs_sortMethod = localStorage.getItem("jhs_sortMethod"), sortText = "当前排序方式: " + ("rateCount" === jhs_sortMethod ? "评价人数" : "date" === jhs_sortMethod ? "时间" : "默认");
$el.append(`\n <div style="display: flex;align-items: center; ${otherCss} ">\n <a id="waitCheckBtn" class="menu-btn main-tab-btn" data-tip="打开未鉴定的列表项, 并自动播放视频" style="background-color:#56c938 !important; ${showWaitCheckBtn === NO ? "display: none" : ""}"><span>打开待鉴定</span></a>\n <a id="waitDownBtn" class="menu-btn main-tab-btn" style="background-color:#2caac0 !important; ${showWaitDownBtn === NO ? "display: none" : ""}"><span>打开已收藏</span></a>\n ${isStarPage ? `\n <a id="addBlacklistBtn" class="menu-btn main-tab-btn" style="background-color:${addBlacklistBtnColor} !important;" data-tip="将演员加入黑名单, 后续有作品更新也会纳入屏蔽中"><span>${addBlacklistBtnText}</span></a>\n <a id="filterAllVideo" class="menu-btn main-tab-btn" style="background-color:#e8ab39 !important;margin-right: 30px!important;" data-tip="一键屏蔽已选分类的视频列表至鉴定记录中"><span>一键屏蔽所有作品</span></a>\n ` : ""}\n ${currentHref.includes("/tags") ? `\n <a id="addBlacklistBtn" class="menu-btn main-tab-btn" style="background-color:${addBlacklistBtnColor} !important;" data-tip="将演员加入黑名单, 后续有作品更新也会纳入屏蔽中"><span>${addBlacklistBtnText}</span></a>\n ` : ""}\n </div>\n <div style="display: flex;align-items: center;">\n <a id="newVideoBtn" class="menu-btn main-tab-btn" style="background-color:#2c6cc0 !important;"><span>新作品检测 (<span id="newVideoCount">0</span>)</span></a>\n <a id="blacklistBtn" class="menu-btn main-tab-btn" style="background-color:#34393f !important;"><span>演员黑名单</span></a>\n ${isSearchPage || isFc2Page2 ? "" : `<a id="sort-toggle-btn" class="menu-btn main-tab-btn" style="background-color:#8783ab !important;"> ${sortText} </a>`}\n </div>\n `);
}
if (isJavBus) {
const isStarPage = currentHref.includes("/star/");
let addBlacklistBtnText = "加入黑名单", addBlacklistBtnColor = "#d22020";
if (isStarPage) {
const blacklist = await storageManager.getBlacklist(), actressPageInfo = this.getActressPageInfo();
if (blacklist.find((item => item.starId === actressPageInfo.starId))) {
addBlacklistBtnText = "已加入黑名单";
addBlacklistBtnColor = "#885d5d";
}
}
$(".masonry").parent().prepend(`\n <div style="margin: 10px; display: flex;">\n <a id="waitCheckBtn" class="menu-btn main-tab-btn" style="background-color:#56c938 !important; ${showWaitCheckBtn === NO ? "display: none" : ""}"><span>打开待鉴定</span></a>\n <a id="waitDownBtn" class="menu-btn main-tab-btn" style="background-color:#2caac0 !important; ${showWaitDownBtn === NO ? "display: none" : ""}"><span>打开已收藏</span></a>\n \n ${isStarPage ? ` \n <a id="addBlacklistBtn" class="menu-btn main-tab-btn" style="background-color:${addBlacklistBtnColor} !important;" data-tip="将演员加入黑名单, 后续有作品更新也会纳入屏蔽中"><span>${addBlacklistBtnText}</span></a>\n <a id="filterAllVideo" class="menu-btn main-tab-btn" style="background-color:#e8ab39 !important;" data-tip="一键屏蔽已选分类的视频列表至鉴定记录中"><span>一键屏蔽所有作品</span></a>\n ` : '<a id="blacklistBtn" class="menu-btn main-tab-btn" style="background-color:#34393f !important;"><span>演员黑名单</span></a>'}\n </div>\n `);
}
const newVideoPlugin = window.pluginManager.getBean("NewVideoPlugin");
newVideoPlugin && newVideoPlugin.showNewVideoCount().then();
}
bindEvent() {
$("#waitCheckBtn").on("click", (event => {
this.openWaitCheck(event).then();
}));
$("#waitDownBtn").on("click", (event => {
this.openFavorite(event).then();
}));
$("#newVideoBtn").on("click", (event => {
this.getBean("NewVideoPlugin").openDialog();
}));
$("#blacklistBtn").on("click", (event => {
this.getBean("BlacklistPlugin").openBlacklistDialog();
}));
$("#sort-toggle-btn").on("click", (event => {
const currentMethod = localStorage.getItem("jhs_sortMethod") || "default";
// 1. 定义排序状态的循环顺序
const sortCycle = ["default", "rateCount", "totalScore", "date"];
let nextIndex = sortCycle.indexOf(currentMethod) + 1;
if (nextIndex >= sortCycle.length || nextIndex < 0) nextIndex = 0;
const newMethod = sortCycle[nextIndex];
// 2. 映射对应的文本
const methodText = {
default: "默认",
rateCount: "评价人数",
totalScore: "总分",
date: "时间"
}[newMethod];
$(event.target).text(`当前排序方式: ${methodText}`);
localStorage.setItem("jhs_sortMethod", newMethod);
this.sortItems().then();
}));
const blacklistPlugin = this.getBean("BlacklistPlugin");
$("#addBlacklistBtn").on("click", (async event => {
await blacklistPlugin.addBlacklist(event);
}));
$("#filterAllVideo").on("click", (async event => {
let tempEvent = {
clientX: event.clientX,
clientY: event.clientY + 80
}, $actor = isJavDb ? $(".actor-section-name") : $(".avatar-box .photo-info .pb10");
if (0 === $actor.length) {
show.error("获取演员名称失败");
return;
}
let actorName = $actor.text().trim().split(",")[0];
utils.q(tempEvent, "一键屏蔽已选分类的视频列表至鉴定记录中?", (async () => {
this.loadObj = loading();
try {
await blacklistPlugin.filterAllVideo(actorName);
window.refresh();
} catch (e) {
console.error(e);
} finally {
this.loadObj.close();
}
}));
}));
}
async sortItems() {
if (currentHref.includes("handle") || currentHref.includes("advanced_search")) return;
const autoPage = await storageManager.getSetting("autoPage");
if (isSearchPage || autoPage === YES) return;
const method = localStorage.getItem("jhs_sortMethod");
if (!method) return;
$(".movie-list .item").each((function(index) {
$(this).attr("data-original-index") || $(this).attr("data-original-index", index);
}));
const $container = $(".movie-list"), $items = $(".item", $container);
if ("default" === method) {
$items.sort((function(a, b) {
return $(a).data("original-index") - $(b).data("original-index");
})).appendTo($container);
} else {
const items = $items.get();
items.sort((function(a, b) {
// 按评价人数排序
if ("rateCount" === method) {
const getScore = el => {
const match = $(el).find(".score .value").text().match(/由(\d+)人/);
return match ? parseFloat(match[1]) : 0;
};
return getScore(b) - getScore(a);
}
// 新增:按总分排序 (平均分 * 评价人数)
else if ("totalScore" === method) {
const getTotalScore = el => {
const text = $(el).find(".score .value").text();
// 分别提取分数和人数,增加容错率
const scoreMatch = text.match(/([\d.]+)分/);
const countMatch = text.match(/由(\d+)人/);
const score = scoreMatch ? parseFloat(scoreMatch[1]) : 0;
const count = countMatch ? parseFloat(countMatch[1]) : 0;
return score * count;
};
return getTotalScore(b) - getTotalScore(a);
}
// 按时间排序
else {
const getDate = el => {
const dateStr = $(el).find(".meta").text().trim();
return new Date(dateStr);
};
return getDate(b) - getDate(a);
}
}));
$container.empty().append(items);
}
}
async openWaitCheck(event) {
const maxCount = await storageManager.getSetting("waitCheckCount", 5);
let count = 0;
$(`${this.getSelector().itemSelector}:visible`).each(((i, el) => {
if (count >= maxCount) return !1;
const $box2 = $(el);
if ($box2.find(".status-tag").length > 0) return;
const {carNum: carNum2, aHref: aHref} = this.getBoxCarInfo($box2);
if (carNum2.includes("FC2-")) {
const movieId = this.parseMovieId(aHref);
this.getBean("Fc2Plugin").openFc2Page(movieId, carNum2, aHref);
} else {
let url = aHref + (aHref.includes("?") ? "&autoPlay=1" : "?autoPlay=1");
window.open(url);
}
count++;
}));
0 === count && show.info("没有需鉴定的视频");
}
async openFavorite() {
let favoriteList, openCount = await storageManager.getSetting("waitCheckCount", 5), randomOpenWaitDown = await storageManager.getSetting("randomOpenWaitDown", NO), dataList = await storageManager.getCarList();
favoriteList = randomOpenWaitDown === YES ? dataList.filter((item => item.status === Status_FAVORITE)).sort((() => Math.random() - .5)) : dataList.filter((item => item.status === Status_FAVORITE)).sort(((a, b) => b.createDate - a.createDate));
for (let i = 0; i < openCount; i++) {
if (i >= favoriteList.length) return;
let data = favoriteList[i], carNum2 = data.carNum, url = data.url;
if (carNum2.includes("FC2-")) {
const movieId = this.parseMovieId(url);
await this.getBean("Fc2Plugin").openFc2Page(movieId, carNum2, url);
} else window.open(url);
clog.debug("打开已收藏", carNum2, url);
}
}
}
export const translateText = async (text, sourceLang = "ja", targetLang = "zh-CN") => {
if (!text) throw new Error("翻译文本不能为空");
const url = "https://translate-pa.googleapis.com/v1/translate?" + new URLSearchParams({
"params.client": "gtx",
dataTypes: "TRANSLATION",
key: "AIzaSyDLEeFI5OtFBwYBIoK_jj5m32rZK5CkCXA",
"query.sourceLanguage": sourceLang,
"query.targetLanguage": targetLang,
"query.text": text
}), res = await fetch(url);
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
return (await res.json()).translation;
}, TAG_STYLES = {
IS_FILTERED: {
text: "🚫 已屏蔽",
color: "#de3333",
reasonType: "单番号屏蔽",
isCounted: !0,
countKey: "currentPageFilterCount"
},
IS_FAVORITE: {
text: "⭐ 已收藏",
color: "#25b1dc",
reasonType: "",
isCounted: !0,
countKey: "currentPageFavoriteCount"
},
IS_HAS_DOWN: {
text: "📥️ 已下载",
color: "#7bc73b",
reasonType: "",
isCounted: !0,
countKey: "currentPageHasDownCount"
},
IS_HAS_WATCH: {
text: "🔍 已观看",
color: "#d7a80c",
reasonType: "",
isCounted: !0,
countKey: "currentPageHasWatchCount"
},
IS_KEYWORD_FILTER: {
text: "❌ 关键词屏蔽",
color: "#de3333",
reasonType: "",
isCounted: !0,
countKey: "currentPageKeywordFilterCount"
},
IS_ACTOR_FILTER: {
text: "♂️ 男演员屏蔽",
color: "#b22222",
reasonType: "",
isCounted: !0,
countKey: "currentPageActorFilterCount"
},
IS_ACTRESS_FILTER: {
text: "♀️ 女演员屏蔽",
color: "#cd5c5c",
reasonType: "",
isCounted: !0,
countKey: "currentPageActorFilterCount"
},
IS_WAIT_CHECK: {
text: "",
color: "",
reasonType: "",
isCounted: !0,
countKey: "currentPageWaitCheckCount"
}
};
export { ListPageButtonPlugin };