// ==UserScript==
// @name show-magnet
// @namespace http://tampermonkey.net/
// @version 0.3
// @description auto show magnet link under the search item
// @author leeyi
// @match *.clg*.co/search*
// @match *.clg*.info/search*
// @match *.eclzz.*/s/*
// @match *.eclzz.*/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();
});