Add Trakt.tv Button to DebridMediaManager

Adds a Trakt.tv button that redirects to the corresponding Trakt.tv page

// ==UserScript==
// @name         Add Trakt.tv Button to DebridMediaManager
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Adds a Trakt.tv button that redirects to the corresponding Trakt.tv page
// @author       You
// @match        https://debridmediamanager.com/show/*
// @match        https://debridmediamanager.com/movie/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    function createTraktButton() {
        const url = window.location.href;
        const match = url.match(/\/(show|movie)\/(tt\d+)/);
        if (!match) return null;

        const [, type, imdbId] = match;
        const traktUrl = `https://trakt.tv/${type}s/${imdbId}`;

        const button = document.createElement('button');
        button.className = 'mb-1 mr-2 mt-0 rounded border-2 border-red-500 bg-red-900/30 p-1 text-xs text-red-100 transition-colors hover:bg-red-800/50';
        button.innerHTML = `
            <b class="flex items-center justify-center">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="mr-1 h-3 w-3" aria-hidden="true">
                    <defs>
                        <radialGradient id="trakt-grad" cx="48.46" cy="-.95" r="64.84" gradientUnits="userSpaceOnUse">
                            <stop offset="0" stop-color="#9f42c6"/><stop offset=".27" stop-color="#a041c3"/>
                            <stop offset=".42" stop-color="#a43ebb"/><stop offset=".53" stop-color="#aa39ad"/>
                            <stop offset=".64" stop-color="#b4339a"/><stop offset=".73" stop-color="#c02b81"/>
                            <stop offset=".82" stop-color="#cf2061"/><stop offset=".9" stop-color="#e1143c"/>
                            <stop offset=".97" stop-color="#f50613"/><stop offset="1" stop-color="red"/>
                        </radialGradient>
                    </defs>
                    <path fill="url(#trakt-grad)" d="M48,11.26v25.47c0,6.22-5.05,11.27-11.27,11.27H11.26c-6.22,0-11.26-5.05-11.26-11.27V11.26C0,5.04,5.04,0,11.26,0h25.47c3.32,0,6.3,1.43,8.37,3.72.47.52.89,1.08,1.25,1.68.18.29.34.59.5.89.33.68.6,1.39.79,2.14.1.37.18.76.23,1.15.09.54.13,1.11.13,1.68Z"/>
                    <path fill="#fff" d="M13.62,17.97l7.92,7.92,1.47-1.47-7.92-7.92-1.47,1.47ZM28.01,32.37l1.47-1.46-2.16-2.16,20.32-20.32c-.19-.75-.46-1.46-.79-2.14l-22.46,22.46,3.62,3.62ZM12.92,18.67l-1.46,1.46,14.4,14.4,1.46-1.47-4.32-4.31L46.35,5.4c-.36-.6-.78-1.16-1.25-1.68l-23.56,23.56-8.62-8.61ZM47.87,9.58l-19.17,19.17,1.47,1.46,17.83-17.83v-1.12c0-.57-.04-1.14-.13-1.68ZM25.16,22.27l-7.92-7.92-1.47,1.47,7.92,7.92,1.47-1.47ZM41.32,35.12c0,3.42-2.78,6.2-6.2,6.2H12.88c-3.42,0-6.2-2.78-6.2-6.2V12.88c0-3.42,2.78-6.21,6.2-6.21h20.78v-2.07H12.88c-4.56,0-8.28,3.71-8.28,8.28v22.24c0,4.56,3.71,8.28,8.28,8.28h22.24c4.56,0,8.28-3.71,8.28-8.28v-3.51h-2.07v3.51Z"/>
                </svg>
                Trakt
            </b>
        `;
        
        button.onclick = () => window.open(traktUrl, '_blank');
        return button;
    }

    function insertButton() {
        const baseSelector = '#__next > div.min-h-screen.max-w-full.bg-gray-900.text-gray-100 > div.grid.auto-cols-auto.grid-flow-col.auto-rows-auto.gap-2';
        const targetDiv = document.querySelector(`${baseSelector} > div:nth-child(6)`) || 
                          document.querySelector(`${baseSelector} > div:nth-child(5)`);
        
        if (!targetDiv || targetDiv.querySelector('svg[viewBox="0 0 48 48"]')) return false;
        
        const button = createTraktButton();
        if (button) {
            targetDiv.insertBefore(button, targetDiv.firstChild);
            return true;
        }
        return false;
    }

    function init() {
        let attempts = 0;
        const retry = setInterval(() => {
            if (insertButton() || ++attempts >= 25) clearInterval(retry);
        }, 200);
    }

    document.readyState === 'loading' ? 
        document.addEventListener('DOMContentLoaded', init) : init();

    new MutationObserver(mutations => {
        if (mutations.some(m => m.type === 'childList' && 
            [...m.addedNodes].some(n => n.nodeType === 1 && 
                (n.querySelector?.('#__next') || n.id === '__next')))) {
            setTimeout(init, 100);
        }
    }).observe(document.body, { childList: true, subtree: true });

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址