"use strict";
// ==UserScript==
// @name 挊
// @namespace 撸
// @description 自动获取磁链接并自动离线下载
// @include http*://avmo.pw/*
// @include http*://avso.pw/*
// @include http*://avxo.pw/*
// @include http*://www.av28.com/*/movie/*
// @include http*://*javlibrary.com/*
// @include http*://*javlib.com/*
// @include http*://*javl10.com/*
// @include http*://*jav11b.com/*
// @include http*://www.libredmm.com/products/*
// @include http*://www.javbus.com/*
// @include http*://www.javbus.me/*
// @include http*://www.javbus2.com/*
// @include http*://www.javbus3.com/*
// @include http*://www.javbus5.com/*
// @include http*://www.icpmp.com/fanhao/*.html
// @include http*://blog.jav4you.com/*
// @include http*://*1pondo.tv/*/index.htm
// @include http*://pan.baidu.com/disk/home*
// @include http*://115.com/?tab=offline&mode=wangpan
// @include http*://www.furk.net/users/files/add
// @version 1.43
// @run-at document-end
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// ==/UserScript==
var main = {
//av信息查询 类
jav: {
type: 0,
re: /(avmo|avso|avxo|av28).*movie.*/,
insert_where: "#movie-share",
vid: function vid() {
return document.querySelector(".header").nextElementSibling.innerHTML;
}
},
javlibrary: {
type: 0,
re: /(javlibrary|javlib|javl10|jav11b).*\?v=.*/,
insert_where: "#video_favorite_edit",
vid: function vid() {
return document.querySelector("#video_id").getElementsByClassName("text")[0].innerHTML;
}
},
javbus: {
type: 0,
re: /javbus/,
insert_where: "#star-div",
vid: function vid() {
return document.querySelector(".header").nextElementSibling.textContent;
}
},
fanhaoku: {
type: 0,
re: /icpmp/,
insert_where: ".mod_film",
vid: function vid() {
return document.querySelector(".title_inner").title;
}
},
libredmm: {
type: 0,
re: /libredmm/,
insert_where: ".container",
vid: function vid() {
return location.href.match(/products\/(.*)/)[1];
}
},
blogjav4you: {
type: 0,
re: /blog\.jav4you\.com/,
insert_where: ".posttext",
vid: function vid() {
return document.querySelector(".posttitle a").textContent.match(/\[(.*)\]/)[1];
}
},
pondo1: {
type: 0,
re: /1pondo\.tv.*\/index.htm/,
insert_where: ".hdg3",
vid: function vid() {
return location.pathname.split("/")[3];
}
},
dmm: {
type: 0,
re: /dmm\.co\.jp/,
insert_where: ".lh4",
vid: function vid() {
var result = location.href.replace(/.*cid=/, "").replace(/\/\??.*/, "").match(/[^h_0-9].*/);
return result[0] ? result[0].replace("00", "") : "";
}
},
//网盘下载 类
//这些 $ 是真正的 jquery
baidu: {
type: 1,
re: /pan\.baidu\.com/,
fill_form: function fill_form(magnet) {
document.querySelector(".g-button[data-button-id=b13]").click();
setTimeout(function () {
document.querySelector("#_disk_id_2").click();
setTimeout(function () {
document.querySelector("#share-offline-link").value = magnet;
document.querySelector(".g-button[data-button-id=b65]").click();
}, 500);
}, 1500);
}
},
115: {
type: 1,
re: /115\.com/,
fill_form: function fill_form(link) {
var rsc = setInterval(function () {
if (document.readyState == "complete") {
clearInterval(rsc);
setTimeout(function () {
Core["OFFL5Plug"].OpenLink();
setTimeout(function () {
$("#js_offline_new_add").val(link);
}, 300);
}, 1000);
}
}, 400);
}
},
letv: {
type: 1,
re: /cloud\.letv\.com/,
fill_form: function fill_form(link) {
setTimeout(function () {
$("#offline-btn").click();
setTimeout(function () {
$("#offline_clear_complete").prev().click();
setTimeout(function () {
$("#offline-add-link").val(link);
}, 500);
}, 1000);
}, 2000);
}
},
furk: {
type: 1,
re: /www\.furk\.net/,
fill_form: function fill_form(link) {
setTimeout(function () {
$("#url").val(link.replace("magnet:?xt=urn:btih:", ""));
}, 1500);
}
},
360: {
type: 1,
re: /yunpan\.360\.cn\/my/,
fill_form: function fill_form(link) {
yunpan.cmdCenter.showOfflineDia();
setTimeout(function () {
$(".offdl-btn-create").click();
setTimeout(function () {
$("#offdlUrl").val(link);
}, 500);
}, 1000);
}
},
uc: {
type: 1,
re: /disk\.yun\.uc\.cn\//,
fill_form: function fill_form(link) {
setTimeout(function () {
$("#newuclxbtn_index").click();
setTimeout(function () {
$("#uclxurl").val(link);
}, 1000);
}, 1200);
}
}
};
var offline_sites = {
baidu: {
url: "http://pan.baidu.com/disk/home",
name: "百度云",
enable: true
},
115: {
name: "115离线",
url: "http://115.com/?tab=offline&mode=wangpan",
enable: true
},
letv: {
name: "乐视云",
url: "http://cloud.letv.com/webdisk/home/index",
enable: false
},
360: {
name: "360云",
url: "http://yunpan.360.cn/my/",
enable: false
},
uc: {
name: "UC离线",
url: "http://disk.yun.uc.cn/",
enable: false
},
furk: {
name: "Furk",
url: "https://www.furk.net/users/files/add",
enable: true
}
};
var common = {
add_style: function add_style() {
GM_addStyle(["#nong-table{border-collapse: initial !important;background-color: white !important;text-align: center !important;margin:10px auto;color:#666 !important;font-size:13px;text-align:center !important;border: 1px solid #cfcfcf !important;border-radius: 10px !important;}", "#nong-table a {margin-right: 5px !important;color:blue}", "#nong-table a:hover {color:#d20f00 !important;}", "#nong-table th,#nong-table td{text-align: inherit !important;height:30px;padding:0 1em 0 !important;}", ".nong-row{text-align: inherit !important;height:30px;padding:0 1em 0 !important;border: 1px solid #EFEFEF !important;}", ".nong-row:hover{background-color: #dae8ff !important;}", ".nong-offline-download{color: rgb(0, 180, 30) !important;}", ".nong-offline-download:hover{color:red !important;}"].join(""));
},
handle_copy_event: function handle_copy_event(event) {
event.target.innerHTML = "成功";
GM_setClipboard(event.target.href);
setTimeout(function () {
event.target.innerHTML = "复制";
}, 1000);
event.preventDefault(); //阻止跳转
},
handle_dl_event: function handle_dl_event(event) {
var mag = event.target.parentElement.parentElement.parentElement.getAttribute("mag");
console.info("磁链接", mag);
GM_setValue("magnet", mag);
},
reg_event: function reg_event() {
var selector_event_map = [{
selector: ".nong-copy",
type: "click",
fn: this.handle_copy_event
}, {
selector: ".nong-offline-download",
type: "click",
fn: this.handle_dl_event
}];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = selector_event_map[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var obj = _step.value;
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = document.querySelectorAll(obj.selector)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var elem = _step2.value;
//console.log(elem, obj.type, obj.fn);
elem.addEventListener(obj.type, obj.fn);
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
},
parsetext: function parsetext(text) {
var doc = null;
try {
doc = document.implementation.createHTMLDocument("");
doc.documentElement.innerHTML = text;
return doc;
} catch (e) {
alert("parse error");
}
}
};
var magnet_table = {
template: {
create_head: function create_head(src) {
var a = document.createElement("tr");
a.className = "nong-row";
a.id = "nong-head";
var head_str = ["大小", "操作", "离线下载"];
var th_list = [document.createElement("th"), document.createElement("th"), document.createElement("th"), document.createElement("th")];
var select_box = document.createElement("select");
var option_str = my_search.search_name_string;
//console.log("get", GM_getValue("search_index"));
var index = GM_getValue("search_index", 0);
var op_value = 0;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = option_str[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var str = _step3.value;
var op = document.createElement("option");
op.value = op_value;
op.textContent = str;
if (index == op_value) {
op.setAttribute("selected", "selected");
}
op_value++;
select_box.appendChild(op);
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
select_box.addEventListener("change", function (e) {
GM_setValue("search_index", this.value);
var table = document.querySelector("#nong-table");
table.parentElement.removeChild(table);
run();
});
th_list[0].appendChild(select_box);
th_list[1].appendChild(document.createElement("a"));
th_list[1].lastChild.setAttribute("href", src);
th_list[1].lastChild.setAttribute("target", "_blank");
th_list[1].lastChild.textContent = head_str[0];
th_list[2].appendChild(document.createElement("a"));
th_list[2].lastChild.textContent = head_str[1];
th_list[3].appendChild(document.createElement("a"));
th_list[3].lastChild.textContent = head_str[2];
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = th_list[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var th = _step4.value;
a.appendChild(th);
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
return a;
},
create_row: function create_row(data) {
var tr = document.createElement("tr");
tr.className = "nong-row";
tr.setAttribute("mag", data.mag);
var td = document.createElement("td");
var _arr = [this.create_info(data.title, data.mag), this.create_size(data.size, data.src), this.create_operation(data.mag), this.create_offline()];
for (var _i = 0; _i < _arr.length; _i++) {
var elem = _arr[_i];
var c = td.cloneNode(true);
c.appendChild(elem);
tr.appendChild(c);
}
return tr;
},
create_row_for_sukebei: function create_row_for_sukebei(data) {
var tr = document.createElement("tr");
tr.className = "nong-row";
tr.setAttribute("mag", data.mag);
var td = document.createElement("td");
var append_elems = [function (title, src, self) {
return self.create_info(title, src);
}(data.title, data.src, this), function (size, src, self) {
return self.create_size(size, src);
}(data.size, data.src, this), function (torrent_url, self) {
var operate = self.create_operation(torrent_url);
operate.firstChild.textContent = "种子";
operate.firstChild.setAttribute("class", "nong-copy-sukebei");
operate.firstChild.setAttribute("target", "_blank");
return operate;
}(data.torrent_url, this), function (self) {
var div = document.createElement("div");
div.textContent = "暂不支持离线下载";
return div;
}(this)];
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
for (var _iterator5 = append_elems[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var elem = _step5.value;
var c = td.cloneNode(true);
c.appendChild(elem);
tr.appendChild(c);
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
return tr;
},
create_info: function create_info(title, mag) {
var a = this.info.cloneNode(true);
a.firstChild.textContent = title.length < max_title_length ? title : title.substr(0, max_title_length) + "...";
a.firstChild.href = mag;
a.title = title;
return a;
},
create_size: function create_size(size, src) {
var a = this.size.cloneNode(true);
a.textContent = size;
a.href = src;
return a;
},
create_operation: function create_operation(mag) {
var a = this.operation.cloneNode(true);
a.firstChild.href = mag;
return a;
},
create_offline: function create_offline() {
var a = this.offline.cloneNode(true);
a.className = "nong-offline";
return a;
},
info: function () {
var a = document.createElement("div");
var b = document.createElement("a");
b.textContent = "name";
b.href = "src";
b.target = "_blank";
a.appendChild(b);
return a;
}(),
size: function () {
var a = document.createElement("a");
a.textContent = "size";
return a;
}(),
operation: function () {
var a = document.createElement("div");
var copy = document.createElement("a");
copy.className = "nong-copy";
copy.textContent = "复制";
a.appendChild(copy);
return a;
}(),
offline: function () {
var a = document.createElement("div");
var b = document.createElement("a");
b.className = "nong-offline-download";
b.target = "_blank";
for (var k in offline_sites) {
if (offline_sites[k].enable) {
var c = b.cloneNode(true);
c.href = offline_sites[k].url;
c.textContent = offline_sites[k].name;
a.appendChild(c);
}
}
return a;
}()
},
generate: function generate(src, data) {
var tab = document.createElement("table");
tab.id = "nong-table";
tab.appendChild(this.template.create_head(src));
//console.log(src);
//console.log(data);
if (src.match("sukebei.nyaa.se")) {
var _iteratorNormalCompletion6 = true;
var _didIteratorError6 = false;
var _iteratorError6 = undefined;
try {
for (var _iterator6 = data[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
var d = _step6.value;
tab.appendChild(this.template.create_row_for_sukebei(d));
}
} catch (err) {
_didIteratorError6 = true;
_iteratorError6 = err;
} finally {
try {
if (!_iteratorNormalCompletion6 && _iterator6.return) {
_iterator6.return();
}
} finally {
if (_didIteratorError6) {
throw _iteratorError6;
}
}
}
} else {
var _iteratorNormalCompletion7 = true;
var _didIteratorError7 = false;
var _iteratorError7 = undefined;
try {
for (var _iterator7 = data[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
var _d = _step7.value;
tab.appendChild(this.template.create_row(_d));
}
} catch (err) {
_didIteratorError7 = true;
_iteratorError7 = err;
} finally {
try {
if (!_iteratorNormalCompletion7 && _iterator7.return) {
_iterator7.return();
}
} finally {
if (_didIteratorError7) {
throw _iteratorError7;
}
}
}
}
return tab;
}
};
var my_search = {
current: function current(kw, cb) {
var search = my_search[GM_getValue("search_index", 0)];
try {
return search(kw, cb);
} catch (e) {
this.search_error();
}
},
search_error: function search_error(r) {
alert("搜索出现错误,请检查网络");
},
search_name_string: ["btso", "btdb", "sukebei.nyaa", "btkitty"],
0: function _(kw, cb) {
GM_xmlhttpRequest({
method: "GET",
url: "https://btso.pw/search/" + kw,
onload: function onload(result) {
var doc = common.parsetext(result.responseText);
var data = [];
var t = doc.getElementsByClassName("data-list")[0];
if (t) {
var _iteratorNormalCompletion8 = true;
var _didIteratorError8 = false;
var _iteratorError8 = undefined;
try {
for (var _iterator8 = t.getElementsByTagName("a")[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
var elem = _step8.value;
if (!elem.className.match("btn")) {
data.push({
"title": elem.title,
"mag": "magnet:?xt=urn:btih:" + elem.outerHTML.replace(/.*hash\//, "").replace(/" .*\n.*\n.*\n.*/, ""),
"size": elem.nextElementSibling.textContent,
"src": elem.href
});
}
}
} catch (err) {
_didIteratorError8 = true;
_iteratorError8 = err;
} finally {
try {
if (!_iteratorNormalCompletion8 && _iterator8.return) {
_iterator8.return();
}
} finally {
if (_didIteratorError8) {
throw _iteratorError8;
}
}
}
} else {
data.push({
"title": "没有找到磁链接",
"mag": "",
"size": "0",
"src": result.finalUrl
});
}
cb(result.finalUrl, data);
},
onerror: function onerror(e) {
console.error(e);
throw "search error";
}
});
},
1: function _(kw, cb) {
GM_xmlhttpRequest({
method: "GET",
url: "https://btdb.in/q/" + kw + "/",
onload: function onload(result) {
var doc = common.parsetext(result.responseText);
var data = [];
var t = doc.getElementsByClassName("item-title");
if (t) {
var _iteratorNormalCompletion9 = true;
var _didIteratorError9 = false;
var _iteratorError9 = undefined;
try {
for (var _iterator9 = t[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
var elem = _step9.value;
data.push({
"title": elem.firstChild.title,
"mag": elem.nextElementSibling.firstElementChild.href,
"size": elem.nextElementSibling.children[1].textContent,
"src": "https://btdb.in" + elem.firstChild.getAttribute("href")
});
}
} catch (err) {
_didIteratorError9 = true;
_iteratorError9 = err;
} finally {
try {
if (!_iteratorNormalCompletion9 && _iterator9.return) {
_iterator9.return();
}
} finally {
if (_didIteratorError9) {
throw _iteratorError9;
}
}
}
} else {
data.push({
"title": "没有找到磁链接",
"mag": "",
"size": "0",
"src": result.finalUrl
});
}
cb(result.finalUrl, data);
},
onerror: function onerror(e) {
console.error(e);
throw "search error";
}
});
},
2: function _(kw, cb) {
GM_xmlhttpRequest({
method: "GET",
url: "https://sukebei.nyaa.se/?page=search&cats=0_0&filter=0&term=" + kw,
onload: function onload(result) {
var doc = common.parsetext(result.responseText);
var data = [];
var t = doc.getElementsByClassName("tlistrow");
if (t) {
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
try {
for (var _iterator10 = t[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var elem = _step10.value;
data.push({
"title": elem.querySelector(".tlistname a").textContent,
"mag": "",
"torrent_url": "https:" + elem.querySelector(".tlistdownload a").getAttribute("href"),
"size": elem.querySelector(".tlistsize").textContent,
"src": "https:" + elem.querySelector(".tlistname a").getAttribute("href")
});
}
} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
}
}
}
} else {
data.push({
"title": "没有找到磁链接",
"mag": "",
"torrent_url": "",
"size": "0",
"src": result.finalUrl
});
}
cb(result.finalUrl, data);
},
onerror: function onerror(e) {
console.error(e);
throw "search error";
}
});
},
3: function _(kw, cb) {
GM_xmlhttpRequest({
method: "POST",
url: "http://btkitty.bid/",
data: "keyword=" + kw,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function onload(result) {
var doc = common.parsetext(result.responseText);
var data = [];
var t = doc.getElementsByClassName("list-con");
if (t) {
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
try {
for (var _iterator11 = t[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var elem = _step11.value;
data.push({
"title": elem.querySelector("dt a").textContent,
"mag": elem.querySelector("dd a").href,
"size": elem.querySelector(".option span:nth-child(3) b").textContent,
"src": elem.querySelector("dt a").href
});
}
} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
} finally {
try {
if (!_iteratorNormalCompletion11 && _iterator11.return) {
_iterator11.return();
}
} finally {
if (_didIteratorError11) {
throw _iteratorError11;
}
}
}
} else {
data.push({
"title": "没有找到磁链接",
"mag": "",
"size": "0",
"src": result.finalUrl
});
}
cb(result.finalUrl, data);
},
onerror: function onerror(e) {
console.error(e);
throw "search error";
}
});
}
};
var display_table = function display_table(vid, insert_where) {
common.add_style();
my_search.current(vid, function (data, src) {
var tab = magnet_table.generate(data, src);
if (typeof insert_where === "string") {
var elem = document.querySelector(insert_where);
//console.log("display_table", tab, elem);
if (elem) {
elem.parentElement.insertBefore(tab, elem);
}
} else if (typeof insert_where === "function") {
insert_where(tab);
} else {
console.error("插入表格错误");
}
common.reg_event();
});
};
var vid_mode = function vid_mode(v) {
var vid = "";
try {
vid = v.vid();
} catch (error) {
vid = "";
console.error("没有找到番号", v.vid.toString());
}
if (vid) {
console.info("番号:", vid);
display_table(vid, v.insert_where);
}
};
var dl_mode = function dl_mode(v) {
var mag = GM_getValue("magnet", "");
//console.info(1, "开始离线下载", mag);
if (mag) {
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.innerHTML = "(" + v.fill_form.toString() + ")(\"" + mag + "\")";
document.body.appendChild(script);
//console.info(info);
}
GM_getValue("magnet", "");
};
var run = function run() {
max_title_length = GM_getValue("max_title_length", 40);
var main_keys = Object.keys(main);
for (var i = 0; i < main_keys.length; i++) {
var v = main[main_keys[i]];
if (v.re && v.re.test(location.href)) {
if (v.type === 0) {
//----
//for javlibrary
if (main_keys[i] === "javlibrary") {
if (document.querySelector("#adultwarningprompt")) {
document.querySelectorAll("#adultwarningprompt input")[0].click();
}
}
//----
vid_mode(v);
} else if (v.type == 1) {
dl_mode(v);
}
break;
}
}
};
var max_title_length = GM_getValue("max_title_length", 40);
var set_max_title_length = function set_max_title_length() {
var len = prompt("请输入你想要的标题长度", GM_getValue("max_title_length", 40));
if (len !== null && len !== "") {
GM_setValue("max_title_length", len);
var table = document.querySelector("#nong-table");
table.parentElement.removeChild(table);
run();
}
};
GM_registerMenuCommand("挊-标题长度", set_max_title_length);
run();