Greasy Fork

网盘资源查找助手:快速获取IMDb、TMDb、豆瓣电影资源

自动搜索IMDB、TMDB、豆瓣电影资源,快速获取夸克、百度网盘、阿里云盘资源链接!

// ==UserScript==
// @name         网盘资源查找助手:快速获取IMDb、TMDb、豆瓣电影资源
// @namespace    https://github.com/yourusername
// @version      2.0.3
// @description  自动搜索IMDB、TMDB、豆瓣电影资源,快速获取夸克、百度网盘、阿里云盘资源链接!
// @author       Your Name
// @icon           https://img3.doubanio.com/favicon.ico
// @match        *://*.themoviedb.org/*
// @match        *://*.douban.com/subject/*
// @match        *://*.imdb.com/title/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // 添加样式
    GM_addStyle(`
        .resource-panel {
            position: fixed;
            top: 60px;
            right: 20px;
            background: white;
            padding: 20px;
            border-radius: 12px;
            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
            z-index: 9999;
            width: 300px;
            font-family: Arial, sans-serif;
        }
        .resource-item {
            margin: 10px 0;
            padding: 12px;
            background: #f8f9fa;
            border-radius: 8px;
            border-left: 4px solid #01b4e4;
        }
        .resource-title {
            margin-bottom: 8px;
            color: #01b4e4;
            font-weight: bold;
        }
        .resource-link {
            display: inline-block;
            padding: 6px 12px;
            background: #01b4e4;
            color: white;
            text-decoration: none;
            border-radius: 4px;
            font-size: 13px;
        }
    `);

    // 从URL中提取媒体信息
    function extractMediaInfo() {
        const url = window.location.href;
        
        // TMDB匹配
        const tmdbPattern = /themoviedb\.org\/(movie|tv|collection)\/(\d+)/;
        const tmdbMatch = url.match(tmdbPattern);
        if (tmdbMatch) {
            return {
                source: 'tmdb',
                mediaType: tmdbMatch[1],
                id: tmdbMatch[2]
            };
        }

    // IMDB匹配
    const imdbPattern = /imdb\.com\/title\/(tt\d+)/;
    const imdbMatch = url.match(imdbPattern);
    if (imdbMatch) {
        return {
            source: 'imdb',
            id: imdbMatch[1]
        };
    }
    
        
        // 豆瓣匹配
        const doubanPattern = /movie\.douban\.com\/subject\/(\d+)/;
        const doubanMatch = url.match(doubanPattern);
        if (doubanMatch) {
            return {
                source: 'douban',
                id: doubanMatch[1]
            };
        }
        
        return null;
    }

    // 从豆瓣页面提取 IMDb ID
    function extractIMDbId() {
        const spans = document.querySelectorAll('span.pl');
        for (const span of spans) {
            if (span.textContent.includes('IMDb:')) {
                const imdbText = span.nextSibling?.textContent?.trim();
                if (imdbText && imdbText.startsWith('tt')) {
                    return imdbText;
                }
            }
        }
        return null;
    }

    // 格式化文件大小
    function formatSize(bytes) {
        if (bytes === 0) return '0 B';
        const k = 1024;
        const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
        const i = Math.floor(Math.log(bytes) / Math.log(k));
        return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
    }

    // 获取平台名称
    function getPlatformName(url) {
        if (url.includes('https://pan.quark.cn')) return '夸克网盘';
        if (url.includes('https://pan.baidu.com')) return '百度网盘';
        if (url.includes('https://www.alipan.com')) return '阿里云盘';
        return '未知平台';
    }

    // 创建浮动面板
    function createFloatingPanel(result) {
        // 移除已存在的面板
        const existingPanel = document.querySelector('.resource-panel');
        if (existingPanel) {
            existingPanel.remove();
        }

        const panel = document.createElement('div');
        panel.className = 'resource-panel';

        let content = `
            <div style="position: absolute; top: 10px; right: 10px; cursor: pointer;" class="close-btn">×</div>
            <h3 style="margin: 0 0 15px 0; color: #333; font-size: 16px;">
                找到 ${result.total} 个资源
            </h3>
        `;

        if (result.data && result.data.length > 0) {
            content += `<div style="max-height: 400px; overflow-y: auto;">`;
            result.data.forEach(resource => {
                content += `
                    <div class="resource-item">
                        <div class="resource-title">
                            ${resource.quality} ${getPlatformName(resource.url)}资源
                        </div>
                        ${resource.release_type ? `
                            <div style="font-size: 13px; color: #666; margin-bottom: 4px;">
                                发布类型: ${resource.release_type}
                            </div>
                        ` : ''}
                        ${resource.size ? `
                            <div style="font-size: 13px; color: #666; margin-bottom: 4px;">
                                大小: ${formatSize(resource.size)}
                            </div>
                        ` : ''}
                        <div style="font-size: 13px; color: #666; margin-bottom: 8px;">
                            语言: ${resource.languages ? resource.languages.join(', ') : ''}
                        </div>
                        <a href="${resource.url}" target="_blank" class="resource-link">
                            打开链接${resource.password ? ' (密码: ' + resource.password + ')' : ''}
                        </a>
                    </div>
                `;
            });
            content += `</div>`;
        } else {
            content += `<div style="color: #666;">未找到资源</div>`;
        }

        panel.innerHTML = content;
        document.body.appendChild(panel);

        // 添加关闭按钮事件
        panel.querySelector('.close-btn').addEventListener('click', () => panel.remove());
    }

    // 主要执行函数
    async function init() {
        const info = extractMediaInfo();
        if (!info) return;

        try {
            let apiUrl;
            
            if (info.source === 'tmdb') {
                const mediaType = info.mediaType === 'tv' ? 'season' : info.mediaType;
                apiUrl = `https://api.aipan.xyz/api/${mediaType}/${info.id}/resources`;
            } else if (info.source === 'douban') {
                const imdbId = extractIMDbId();
                if (!imdbId) {
                    createFloatingPanel({
                        data: [],
                        total: 0,
                        message: '未找到IMDb ID'
                    });
                    return;
                }
                apiUrl = `https://api.aipan.xyz/api/imdb/${imdbId}/resources`;
            } else if (info.source === 'imdb') {
            apiUrl = `https://api.aipan.xyz/api/imdb/${info.id}/resources`;
        }

            // 使用 GM_xmlhttpRequest 替代 fetch
            GM_xmlhttpRequest({
                method: 'GET',
                url: apiUrl,
                headers: {
                    'Accept': 'application/json'
                },
                onload: function(response) {
                    if (response.status === 200) {
                        const data = JSON.parse(response.responseText);
                        createFloatingPanel(data);
                    } else {
                        createFloatingPanel({
                            data: [],
                            total: 0,
                            message: '获取资源失败'
                        });
                    }
                },
                onerror: function(error) {
                    console.error('Error:', error);
                    createFloatingPanel({
                        data: [],
                        total: 0,
                        message: '获取资源失败'
                    });
                }
            });
        } catch (error) {
            console.error('Error:', error);
            createFloatingPanel({
                data: [],
                total: 0,
                message: '获取资源失败'
            });
        }
    }

    // 启动脚本
    init();
})();