show-magnet

show magnet link under the result item

当前为 2021-03-22 提交的版本,查看 最新版本

// ==UserScript==
// @name         show-magnet
// @namespace    http://tampermonkey.net/
// @version      0.6
// @description  show magnet link under the result item
// @author       leeyi

// @match        *.clg5.info/search*
// @match        *.clg8.co/search*
// @match        *.eclzz.shop/s/*
// @match        *.cilichong.com/main-search*

// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue

// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/linq.js/3.2.3/linq.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/dayjs/1.10.3/dayjs.min.js
// ==/UserScript==

'use strict';

$(() => {
    let linq = Enumerable;

    let data = {};
    let ctx = {};
    ctx.handlers = [];

    let conf = {};
    conf.key = 'KAKAPO';
    conf.now = dayjs();
    conf.tryCount = 3;
    conf.tryTimeout = 100;

    ctx.init = () => {
        ctx.readData();
        let pageUrl = $(location).attr("href");
        linq.from(ctx.handlers).forEach(t => {
            if (t.key.test(pageUrl)) {
                try {
                    t.exec();
                } catch (error) {
                    console.error(error)
                }
            }
        });
    }

    ctx.readData = () => {
        data = GM_getValue(conf.key, {});
        data.links = data.links || {};
        ctx.cleanData();
    }

    ctx.saveData = () => {
        GM_setValue(conf.key, data);
    }

    ctx.cleanData = () => {
        let arr = linq.from(data.links).where(t => !ctx.isValidInfo(t.value)).select(t => t.key).toArray();
        if (arr.length) {
            linq.from(arr).forEach(href => delete data.links[href]);
            ctx.saveData();
        }
    }

    ctx.isValidInfo = info => {
        return info && conf.now.diff(dayjs(info.create_at), 'month') < 1 && ctx.isValidLink(info.link);
    }

    ctx.isValidLink = link => {
        return link && link.startsWith('magnet:?');
    }

    ctx.addHandler = handler => {
        ctx.handlers.push(handler);
    }

    ctx.requestUrl = (url, on_done, on_fail) => {
        let t = {};
        t.count = conf.tryCount;
        t.on_done = html => {
            on_done(html);
        }
        t.on_fail = () => {
            if (t.count == 0) {
                console.warn(`get ${url} failed...`);
                if (on_fail) {
                    on_fail(url);
                }
            } else {
                console.warn(`${t.count} try ${url} failed...`);
                t.count -= 1;
                setTimeout(t.get, conf.tryTimeout);
            }
        }
        t.get = () => {
            $.get(url).done(t.on_done).fail(t.on_fail);
        };
        t.get();
    }

    ctx.addCopyAllLink = (el, links) => {
        let a = $(`<a style="cursor: pointer;">拷贝所有链接</a>`);
        a.on('click', () => {
            let s = linq.from(links).toJoinedString('\n');
            GM_setClipboard(s);
        });
        el.append(a);
    }

    ctx.addMagnetLink = (href, links, el, link, cache) => {
        let p = $(`<p>`);
        el.append(p);
        let a = $(`<a href="${link}">${link}</a>`);
        a.on('click', () => GM_setClipboard(link));
        el.append(a);
        links.push(link);
        if (cache) {
            return;
        }
        let info = {};
        info.create_at = dayjs();
        info.href = href;
        info.link = link;
        data.links[href] = info;
        ctx.saveData();
    }

    ctx.addErrorTip = el => {
        let p = $(`<p>`);
        el.append(p);
        let div = $(`<div>获取链接失败</div>`);
        el.append(div);
    }

    ctx.addHandler({
        key: /clg\d\./g,
        exec: () => {
            let items = $('#Search_list_wrapper > li');
            let links = [];
            ctx.addCopyAllLink($('#Search_container > div.Search_box > div.Search_nav'), links);
            linq.from(items.toArray()).forEach(t => {
                let title = $('a.SearchListTitle_result_title', t);
                if (!title) {
                    return;
                }
                let anchor = $('div.Search_list_info', t);
                let href = title.prop('href');
                let info = data.links[href];
                if (info) {
                    ctx.addMagnetLink(href, links, anchor, info.link, true);
                    return;
                }
                ctx.requestUrl(href, html => {
                    let root = $(html);
                    let link = $('a.Information_magnet', root).prop('href');
                    if (ctx.isValidLink(link)) {
                        ctx.addMagnetLink(href, links, anchor, link);
                    } else {
                        ctx.addErrorTip(anchor);
                    }
                }, () => {
                    ctx.addErrorTip(anchor);
                });
            });
        },
    });

    ctx.addHandler({
        key: /eclzz\./g,
        exec: () => {
            let items = $('div.search-item');
            let links = [];
            ctx.addCopyAllLink($('#sort-bar'), links);
            linq.from(items.toArray()).forEach(t => {
                let title = $('div.item-title a', t);
                if (!title) {
                    return;
                }
                let anchor = $(t);
                let href = title.prop('href');
                let info = data.links[href];
                if (info) {
                    ctx.addMagnetLink(href, links, anchor, info.link, true);
                    return;
                }
                ctx.requestUrl(href, html => {
                    let root = $(html);
                    let link = $('#m_link', root).prop('value');
                    if (ctx.isValidLink(link)) {
                        ctx.addMagnetLink(href, links, anchor, link);
                    } else {
                        ctx.addErrorTip(anchor);
                    }
                }, () => {
                    ctx.addErrorTip(anchor);
                });
            });
        },
    });

    ctx.addHandler({
        key: /cilichong\./g,
        exec: () => {
            let items = $('li.hash-name');
            let links = [];
            ctx.addCopyAllLink($('div.hash-info'), links);
            linq.from(items.toArray()).forEach(t => {
                let title = $('a', t);
                if (!title) {
                    return;
                }
                let anchor = $(t);
                let href = title.prop('href');
                let info = data.links[href];
                if (info) {
                    ctx.addMagnetLink(href, links, anchor, info.link, true);
                    return;
                }
                ctx.requestUrl(href, html => {
                    let root = $(html);
                    let link = $('a.magnet-download', root).prop('href');
                    if (ctx.isValidLink(link)) {
                        ctx.addMagnetLink(href, links, anchor, link);
                    } else {
                        ctx.addErrorTip(anchor);
                    }
                }, () => {
                    ctx.addErrorTip(anchor);
                });
            });
        },
    });

    ctx.init();
});

QingJ © 2025

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