Download Link Collector

Collects magnet/ed2k links and provides copy to clipboard.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Download Link Collector
// @namespace    dlc
// @version      0.1.0
// @description  Collects magnet/ed2k links and provides copy to clipboard.
// @author       wzzzzz
// @license MIT

// @include      *://*javbus.com/*
// @include      *://www.*bus*/*
// @include      *://www.*javsee*/*
// @include      *://www.*seejav*/*
// @include      *://www.south-plus.net/*

// @include      *://*sehuatang.net/*

// @include      *://*onejav.com/*

// @include      *://*avsox.*/*

// @include      *://*jav321.com/video/*
// @grant        GM_setClipboard
// ==/UserScript==
(function() {
    'use strict';

    // 收集磁力链接
    function collectLinks() {
        function traverseDOM(element) {
            let downloadLinks = [];

            if (element.nodeType === Node.TEXT_NODE) {
                // 如果当前节点是文本节点,则在文本中查找链接
                let innerText = element.nodeValue;
                let collect_str = collect(innerText);
                if (collect_str && collect_str.length) downloadLinks = downloadLinks.concat(collect_str);
            } else if (element.tagName === 'LI') {
                let collect_str = collect(element.innerHTML);
                if (collect_str && collect_str.length) downloadLinks = downloadLinks.concat(collect_str);
            } else if (element.nodeType === Node.ELEMENT_NODE) {
                // 如果当前节点是元素节点,则递归遍历其子元素
                for (let i = 0; i < element.childNodes.length; i++) {
                    downloadLinks = downloadLinks.concat(traverseDOM(element.childNodes[i]));
                }
            }

            return downloadLinks;
        }

        // 提取链接
        function collect(link_str) {
            if (!link_str) return '';
            let result = '';
            let pattern = /(magnet:\?xt=urn:btih:)[0-9a-fA-F]{40}/g;
            let pattern_lite = /[0-9a-fA-F]{40}[\s]?/g;
            let pattern_ed2k = /ed2k:\/\/\|file\|.+\|\//g;
            let matches = link_str.match(pattern);
            let matches_ed2k = link_str.match(pattern_ed2k);
            if (matches) {
                result = matches;
            } else if (matches_ed2k) {
                result = matches_ed2k;
            }
            else {
                let lites = link_str.match(pattern_lite);
                if (lites) {
                    lites = lites.map(str => `magnet:?xt=urn:btih:${str.replace(/^\s*|\s*$/g, '')}`);
                    result = lites;
                }
            }
            return result
        }

        // 链接去重
        function unique(arr) {
            let result = [];
            let obj = {};
            for (let i = 0; i < arr.length; i++) {
                let str = arr[i].toLowerCase();
                if (!obj[str]) {
                    result.push(arr[i]);
                    obj[str] = true;
                }
            }
            return result;
        }

        // 获取 <body> 元素
        let bodyElement = document.getElementsByTagName('body')[0];

        // 遍历 <body> 元素的所有子元素,并查找链接
        let downloadLinks = unique(traverseDOM(bodyElement));

        let linksText = downloadLinks.join("\n");

        console.log(downloadLinks);

        // 复制链接到剪贴板
        if (downloadLinks.length > 0) {
            let copyButton = document.createElement('button');
            copyButton.textContent = `Copy ${downloadLinks.length} Links`;
            copyButton.style.position = 'fixed';
            copyButton.style.bottom = '20px';
            copyButton.style.right = '20px';
            copyButton.style.zIndex = '9999';
            document.body.appendChild(copyButton);

            copyButton.addEventListener('click', function() {
                navigator.clipboard.writeText(linksText).then(function() {
                    alert('Links copied to clipboard!');
                }).catch(function(error) {
                    console.error('Failed to copy links to clipboard:', error);
                });
            });
        }
    }

    // 页面加载完成后收集磁力链接
    window.addEventListener('load', function() {
        collectLinks();
    });

})();