JAV_ONLINE

JavDB、JavBus添加MissAV跳转播放

// ==UserScript==
// @name        JAV_ONLINE
// @version     0.0.2
// @namespace   http://tampermonkey.net/
// @match       https://javdb.com/v/*
// @match       https://www.javbus.com/*
// @author      none
// @description JavDB、JavBus添加MissAV跳转播放
// @license MIT
// @grant        GM_xmlhttpRequest
// @connect      missav.ai
// ==/UserScript==
(function () {
    'use strict';

    let domain = document.location.hostname.split('.').slice(-2).join('.')
    console.log('<JAV_ONLINE> Detect domain: ' + domain)

    let plate;
    switch (domain) {
        case 'javdb.com':
            plate = $('.first-block .value').text();
            search_movie(plate, (playAlt, playUrl) => {
                let $cover = $('.column-video-cover > a');
                let $pb = $cover.find('.play-button');
                if ($pb.length === 0) {
                    $pb = $(`<div class="play-button">
                    <span class="icon"><img src="/packs/media/images/btn-play-b414746c.svg"></span>
                    <span class="text">${playAlt}</span>
                </div>`);
                    $cover.append($pb);
                    $cover.addClass('cover-container');
                    $cover.removeAttr('data-fancybox');

                } else {
                    $pb.find('.text').text(playAlt);
                }
                $cover.attr('href', playUrl);
                $cover.attr('target', '_blank');
            });
            break
        case 'javbus.com':
            plate = $('div.movie > div.info  > p:first-child > span:last-child').text();
            search_movie(plate, (playAlt, playUrl) => {
                let cover = $('div.screencap > a.bigImage');
                cover.append(`<a href="${playUrl}" target="_blank" onclick="event.stopPropagation();" style="position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);color: white;background-color: rgba(0,0,0,0.5); padding: 8px 16px;text-decoration: none;border-radius: 4px;font-weight: bold;font-size: x-large;pointer-events: auto;">${playAlt}`);
            });
            break
        default:
            break
    }

})();

function gmFetch(url) {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            headers: {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
                'Referer': 'https://missav.ai'
            },
            onload: response => resolve(response.responseText),
            onerror: error => reject(error)
        });
    });
}

async function search_movie(plate, callback) {
    if(!plate) {
        return;
    }
    console.log('Searching for plate:', plate);
    try {
        const searchUrl = `https://missav.ai/en/search/${plate}`;
        const html = await gmFetch(searchUrl);

        const parser = new DOMParser();
        const doc = parser.parseFromString(html, 'text/html');
        const result = doc.querySelector('.thumbnail div:first-child a:first-child');

        let playAlt = '暂无资源';
        let playUrl = '#';
        if (result) {
            playUrl = result.href;
            playAlt = result.getAttribute('alt').includes('uncensored') ? '跳转播放-无码' : '跳转播放';
            console.log(`playUrl: ${playUrl}`);
        } else {
            console.log('No results found for:', plate);
        }

        callback(playAlt, playUrl);

    } catch (error) {
        console.error('Error searching movie:', error);
    }
}