Javdb Redirection for AV Sites

Adds quick actions for video IDs on supported sites (copy, JavDB jump, custom search), displays and allows editing of JavDB watch status/rating, and adds version jump buttons to Missav player pages. Features are individually toggleable.

< Feedback on Javdb Redirection for AV Sites

Review: Good - script works

§
Posted: 2025-08-26

博主你好,因为missav是无码和中字选一的,字幕需要外挂,希望可以在missav界面挂载一个字幕快捷搜索按钮,字幕猫(https://subtitlecat.com/)对于av字幕比较全,希望可以添加~!

§
Posted: 2025-08-26

字幕需要外挂

是什么意思?Missav能外挂字幕?

§
Posted: 2025-08-26

不是,下载后在本地外挂字幕,有个快捷按钮方便些

§
Posted: 2025-08-27

这个功能和本脚本功能有差异,暂时就不内置进去了。另写了个专门实现你需求功能的脚本,你把下面代码复制新建个脚本就行了。效果如图,点击按钮打开字幕猫搜索结果新标签页。

// ==UserScript==
// @name         MissAV Subtitle Searcher
// @name:zh-CN   MissAV 字幕搜索器
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  Uses MutationObserver for reliability and better regex for compatibility. Adds a button to search for subtitles on Subtitlecat.
// @description:zh-CN 使用 MutationObserver 提升可靠性,并通过更优的正则表达式增强兼容性。在 MissAV 页面上添加一个按钮用于搜索字幕。
// @author       Gemini
// @match        *://missav.*/*
// @grant        none
// @icon         https://subtitlecat.com/favicon.ico
// ==/UserScript==

(function() {
    'use strict';

    /**
     * 监视指定的DOM节点,直到回调函数返回true。
     * @param {Node} targetNode - 被监视的DOM节点。
     * @param {function(): boolean} callback - 每次DOM变动时执行的回调函数。该函数应在任务完成时返回true,以停止监视。
     */
    function observeDOM(targetNode, callback) {
        const observer = new MutationObserver((mutationsList, obs) => {
            // 每次DOM变化时,都尝试执行回调函数
            if (callback()) {
                // 如果回调函数返回true(表示成功执行),则停止监视
                obs.disconnect();
                // console.log('Observer disconnected.');
            }
        });

        // 配置监视器以观察子节点和后代节点的变化
        const config = { childList: true, subtree: true };
        observer.observe(targetNode, config);

        // 初始执行一次,以防目标元素在脚本运行时已经存在
        if (callback()) {
            observer.disconnect();
            // console.log('Observer disconnected on initial check.');
        }
    }

    /**
     * 脚本主函数,负责查找元素、提取番号并添加按钮。
     * @returns {boolean} - 如果成功添加按钮或确定无需再执行,则返回true;否则返回false。
     */
    function main() {
        const idSelector = 'div.space-y-2 div.text-secondary span.font-medium';
        const buttonContainerSelector = 'div.flex.flex-wrap.justify-center.space-x-4.md\\:space-x-6.py-8.rounded-md.shadow-sm';

        // 检查按钮是否已存在,防止重复添加
        if (document.getElementById('subtitle-search-button')) {
            return true; // 任务已完成,告知观察者停止
        }

        const idElement = document.querySelector(idSelector);
        const buttonContainer = document.querySelector(buttonContainerSelector);

        // 只有当两个目标元素都存在时,才执行核心逻辑
        if (!idElement || !buttonContainer) {
            return false; // 目标元素尚未加载,告知观察者继续监视
        }

        // --- 提取番号、创建和添加按钮的逻辑 ---

        const originalId = idElement.textContent.trim();
        // 优化后的表达式,兼容更多格式
        // 优先匹配 [字母-数字] 格式,其次匹配由字母、数字、连字符、下划线组成的通用番号
        const match = originalId.match(/([a-zA-Z]+-\d+)|([a-zA-Z0-9_]+-\d+)|([a-zA-Z0-9]+)/i);
        // match 结果是一个数组,第一个有效捕获组或整体匹配是我们的目标
        const cleanedId = match ? (match[1] || match[2] || match[0]) : '';

        if (!cleanedId) {
            // 如果ID元素存在但无法匹配,也视为完成,停止监视
            console.log('Subtitle Searcher: ID found but could not be parsed.');
            return true;
        }

        const searchUrl = `https://subtitlecat.com/index.php?search=${cleanedId}`;
        const newButton = document.createElement('a');
        newButton.id = 'subtitle-search-button'; // 添加ID以便检查和停止重复执行
        newButton.href = searchUrl;
        newButton.target = '_blank';
        newButton.rel = 'noopener noreferrer';
        newButton.className = 'inline-flex items-center whitespace-nowrap text-sm text-nord4 leading-4 font-medium focus:outline-none hover:text-nord6';
        newButton.innerHTML = `
            <span class="mr-1 md:mr-2 text-base" style="font-family: sans-serif;">🅭</span>
            <span>字幕</span>
        `;

        buttonContainer.prepend(newButton);
        console.log(`Subtitle Searcher: Button added for ID: ${cleanedId}`);

        return true; // 任务已完成,告知观察者停止
    }

    // 启动监视,目标是整个文档的body,以确保能捕捉到所有动态内容
    observeDOM(document.body, main);

})();
§
Posted: 2025-08-27

大佬牛逼,感谢

Post reply

Sign in to post a reply.