迅雷电影天堂磁力链批量下载

迅雷电影天堂 | 详情页 | 磁力链列表上方标题行新增【批量下载磁力链】超链接

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         迅雷电影天堂磁力链批量下载
// @namespace    http://tampermonkey.net/
// @version      2024-09-29
// @description  迅雷电影天堂 | 详情页 | 磁力链列表上方标题行新增【批量下载磁力链】超链接
// @author       JoyofFire
// @match        https://www.xl720.com/thunder/*.html
// @grant        none
// @run-at       document-idle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const selectors = {
        title: ".entry-content > h2:last-of-type",
        anchor: "#zdownload .down_btn_cl a",
    };
    const values = {
        magnet_protocal: "magnet:",
        dl_btn_text: "> 批量下载磁力链 <",
        new_tab: "_blank",
    };

    const $ = (querySelectorAll) => (x) => [...querySelectorAll(x)];
    const dom$ = $(document.querySelectorAll.bind(document));
    const el$ = (el) => $(el.document.querySelectorAll.bind(el));

    const anchor_to_link = (a) => a.href;
    const is_magnet = (x) => `${x}`.startsWith(values.magnet_protocal);
    const anchors_to_links = (xs) => xs.map(anchor_to_link).filter(is_magnet);
    const text_to_blob = (x) => new Blob([x], { type: "text/plain" });

    const maybe_title = () => new Promise((resolve, reject) => {
        const matches = dom$(selectors.title);
        const _return = matches.length > 0 ? resolve : reject;
        _return(matches.at(-1));
    });

    const append_href_to_title = (url) => (title) => {
        const a = document.createElement("a");
        a.target = values.new_tab;
        a.textContent = values.dl_btn_text;
        a.href = url;
        title.append(a);
        return { title, url };
    };

    const handle_error = (error) => {
        if (!error) {
            alert("找不到标题行!无法添加按钮!");
            return;
        }
        console.error(error);
    };

    const main = () => {
        const anchors = dom$(selectors.anchor);
        const links = anchors_to_links(anchors);
        const links_text = links.join("\n");
        const text_blob = text_to_blob(links_text);
        const text_url = URL.createObjectURL(text_blob);

        maybe_title()
            .then(append_href_to_title(text_url))
            .then(console.info.bind(console))
            .catch(handle_error);
    };

    main();
})();