Auto Link Collector and Downloader

Collect links from fitgirl fuckingfast paste page which contains all the link and automatically start the download

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Auto Link Collector and Downloader
// @namespace    Violentmonkey Scripts
// @version      1.1
// @description  Collect links from fitgirl fuckingfast paste page which contains all the link and automatically start the download
// @author       OrekiKun
// @match        https://paste.fitgirl-repacks.site/*
// @match        https://fuckingfast.co/*
// @grant        GM_openInTab
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @run-at       document-idle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log('Script loaded successfully!');

    // Add CSS styles using GM_addStyle (bypasses CSP)
    GM_addStyle(`
        #download-control-panel {
            position: fixed !important;
            top: 10px !important;
            right: 10px !important;
            background: white !important;
            border: 2px solid #333 !important;
            border-radius: 8px !important;
            padding: 15px !important;
            box-shadow: 0 4px 12px rgba(0,0,0,0.3) !important;
            z-index: 999999 !important;
            max-width: 300px !important;
            font-family: Arial, sans-serif !important;
            font-size: 14px !important;
        }

        .dl-panel-title {
            margin: 0 0 10px 0 !important;
            color: #333 !important;
            font-size: 16px !important;
            font-weight: bold !important;
        }

        .dl-panel-info {
            margin: 5px 0 !important;
            color: #666 !important;
        }

        .dl-btn {
            border: none !important;
            padding: 8px 16px !important;
            border-radius: 4px !important;
            cursor: pointer !important;
            margin-right: 5px !important;
            font-size: 12px !important;
        }

        .dl-btn-start {
            background: #4CAF50 !important;
            color: white !important;
        }

        .dl-btn-close {
            background: #f44336 !important;
            color: white !important;
        }

        .dl-status {
            margin-top: 10px !important;
            font-size: 12px !important;
            color: #666 !important;
        }

        .dl-indicator {
            position: fixed !important;
            top: 10px !important;
            left: 10px !important;
            background: #4CAF50 !important;
            color: white !important;
            padding: 10px !important;
            border-radius: 4px !important;
            z-index: 999999 !important;
            font-family: Arial, sans-serif !important;
        }
    `);

    // Configuration
    const CONFIG = {
        sourceSelector: '#plaintext ul li a',
        downloadButtonSelector: 'button.link-button.text-5xl.gay-button',
        downloadDelay: 3000,
        tabCloseDelay: 5000
    };

    // Check if we're on the source page
    function isSourcePage() {
        const hasElement = document.querySelector('#plaintext ul') !== null;
        console.log('Checking for #plaintext ul:', hasElement);
        return hasElement;
    }

    // Check if we're on a download page
    function isDownloadPage() {
        const hasButton = document.querySelector(CONFIG.downloadButtonSelector) !== null;
        console.log('Checking for download button:', hasButton);
        return hasButton;
    }

    // Collect all links from the source page
    function collectLinks() {
        const links = [];
        const linkElements = document.querySelectorAll(CONFIG.sourceSelector);

        console.log('Found link elements:', linkElements.length);

        linkElements.forEach(function(link, index) {
            if (link.href) {
                links.push({
                    url: link.href,
                    text: link.textContent.trim()
                });
                console.log('Link ' + (index + 1) + ':', link.href);
            }
        });

        return links;
    }

    // Create control panel
    function createControlPanel(links) {
        console.log('Creating control panel...');

        // Remove existing panel if any
        const existingPanel = document.getElementById('download-control-panel');
        if (existingPanel) {
            existingPanel.remove();
        }

        const panel = document.createElement('div');
        panel.id = 'download-control-panel';

        const title = document.createElement('h3');
        title.className = 'dl-panel-title';
        title.textContent = '🚀 Link Downloader';

        const info = document.createElement('p');
        info.className = 'dl-panel-info';
        info.textContent = 'Found ' + links.length + ' links';

        const startBtn = document.createElement('button');
        startBtn.id = 'start-download';
        startBtn.className = 'dl-btn dl-btn-start';
        startBtn.textContent = 'Start Downloads';

        const closeBtn = document.createElement('button');
        closeBtn.id = 'close-panel';
        closeBtn.className = 'dl-btn dl-btn-close';
        closeBtn.textContent = 'Close';

        const status = document.createElement('div');
        status.id = 'download-status';
        status.className = 'dl-status';

        panel.appendChild(title);
        panel.appendChild(info);
        panel.appendChild(startBtn);
        panel.appendChild(closeBtn);
        panel.appendChild(status);

        document.body.appendChild(panel);
        console.log('Panel added to body');

        // Add event listeners
        startBtn.addEventListener('click', function() {
            console.log('Start button clicked');
            startDownloadProcess(links);
        });

        closeBtn.addEventListener('click', function() {
            console.log('Close button clicked');
            panel.remove();
        });
    }

    // Start download process
    function startDownloadProcess(links) {
        const statusDiv = document.getElementById('download-status');
        let currentIndex = 0;

        function processNextLink() {
            if (currentIndex >= links.length) {
                statusDiv.textContent = '✓ All downloads completed!';
                statusDiv.style.color = 'green';
                return;
            }

            const link = links[currentIndex];
            statusDiv.textContent = 'Processing ' + (currentIndex + 1) + '/' + links.length + ': ' + link.text;

            GM_setValue('currentDownload', JSON.stringify({
                url: link.url,
                index: currentIndex,
                total: links.length
            }));

            GM_openInTab(link.url, {
                active: false,
                insert: true
            });

            currentIndex++;
            setTimeout(processNextLink, 2000);
        }

        processNextLink();
    }

    // Handle download page
    function handleDownloadPage() {
        const downloadInfo = GM_getValue('currentDownload');
        if (!downloadInfo) return;

        const info = JSON.parse(downloadInfo);

        setTimeout(function() {
            const downloadButton = document.querySelector(CONFIG.downloadButtonSelector);

            if (downloadButton) {
                console.log('Download button found, clicking...');

                const indicator = document.createElement('div');
                indicator.className = 'dl-indicator';
                indicator.textContent = 'Auto-downloading... (' + (info.index + 1) + '/' + info.total + ')';
                document.body.appendChild(indicator);

                downloadButton.click();

                setTimeout(function() {
                    window.close();
                }, CONFIG.tabCloseDelay);
            } else {
                console.log('Download button not found');
                setTimeout(function() {
                    window.close();
                }, 2000);
            }
        }, CONFIG.downloadDelay);
    }

    // Debug function to check page structure
    function debugPage() {
        console.log('=== PAGE DEBUG ===');
        console.log('URL:', window.location.href);

        // Check for plaintext div
        const plaintextDiv = document.querySelector('#plaintext');
        console.log('Has #plaintext div:', !!plaintextDiv);

        if (plaintextDiv) {
            const ul = plaintextDiv.querySelector('ul');
            console.log('Has ul inside #plaintext:', !!ul);

            if (ul) {
                const lis = ul.querySelectorAll('li');
                const links = ul.querySelectorAll('li a');
                console.log('Li elements:', lis.length);
                console.log('Links in li elements:', links.length);
            }
        }

        // Alternative selectors to try
        console.log('All divs with plaintext-related ids:');
        document.querySelectorAll('[id*="plaintext"], [id*="plain"], [class*="plaintext"]').forEach(function(el) {
            console.log('Found element:', el.tagName, el.id, el.className);
        });

        console.log('=== END DEBUG ===');
    }

    // Initialize script
    function init() {
        console.log('Initializing script...');
        debugPage();

        if (isSourcePage()) {
            console.log('Source page detected');
            const links = collectLinks();
            if (links.length > 0) {
                createControlPanel(links);
                console.log('Created panel with ' + links.length + ' links');
            } else {
                console.log('No links found in #plaintext ul li a');
                // Try alternative approach - show panel anyway for testing
                createControlPanel([]);
            }
        } else if (isDownloadPage()) {
            console.log('Download page detected');
            handleDownloadPage();
        } else {
            console.log('Neither source nor download page detected');
            // For debugging - show what we can find
            debugPage();
        }
    }

    // Multiple initialization attempts
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        setTimeout(init, 1000);
    }

    // Also try when window loads
    window.addEventListener('load', function() {
        setTimeout(init, 2000);
    });

})();