// ==UserScript==
// @name bilibili视频下载
// @namespace https://github.com/injahow
// @version 2.5.6
// @description 支持Web、RPC、Blob、Aria等下载方式;支持下载flv、dash、mp4视频格式;支持下载港区番剧;支持下载字幕弹幕;支持换源播放等功能
// @author injahow
// @copyright 2021, injahow (https://github.com/injahow)
// @license MIT
// @source https://github.com/injahow/user.js
// @supportURL https://github.com/injahow/user.js/issues
// @match *://www.bilibili.com/video/av*
// @match *://www.bilibili.com/video/BV*
// @match *://www.bilibili.com/list/*
// @match *://www.bilibili.com/bangumi/play/ep*
// @match *://www.bilibili.com/bangumi/play/ss*
// @match *://www.bilibili.com/cheese/play/ep*
// @match *://www.bilibili.com/cheese/play/ss*
// @match https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png*
// @require https://static.hdslb.com/js/jquery.min.js
// @icon https://static.hdslb.com/images/favicon.ico
// @compatible chrome
// @compatible firefox
// @grant none
// @downloadURL none
// ==/UserScript==
/* globals $ waitForKeyElements */
// @[ You can find all source codes in GitHub repo ]
!function() {
"use strict";
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
"value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
}
}
var user = new (function() {
function User() {
!function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
}(this, User), this.is_login = !1, this.vip_status = 0, this.mid = "", this.uname = "",
this.has_init = !1, this.lazyInit();
}
return function _createClass(Constructor, protoProps, staticProps) {
return protoProps && _defineProperties(Constructor.prototype, protoProps), staticProps && _defineProperties(Constructor, staticProps),
Object.defineProperty(Constructor, "prototype", {
writable: !1
}), Constructor;
}(User, [ {
key: "needReplace",
value: function needReplace() {
return !this.is_login || !this.vip_status && video.base().needVip();
}
}, {
key: "isVIP",
value: function isVIP() {
return 1 === this.vip_status;
}
}, {
key: "lazyInit",
value: function lazyInit(last_init) {
this.has_init || (window.__BILI_USER_INFO__ ? (this.is_login = window.__BILI_USER_INFO__.isLogin,
this.vip_status = window.__BILI_USER_INFO__.vipStatus, this.mid = window.__BILI_USER_INFO__.mid || "",
this.uname = window.__BILI_USER_INFO__.uname || "") : window.__BiliUser__ && (this.is_login = window.__BiliUser__.isLogin,
window.__BiliUser__.cache ? (this.vip_status = window.__BiliUser__.cache.data.vipStatus,
this.mid = window.__BiliUser__.cache.data.mid || "", this.uname = window.__BiliUser__.cache.data.uname || "") : (this.vip_status = 0,
this.mid = "", this.uname = "")), this.has_init = last_init);
}
} ]), User;
}());
function store_defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
"value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
}
}
var Store = function() {
function Store() {
!function store_classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
}(this, Store), this.prefix = "bp_";
}
return function store_createClass(Constructor, protoProps, staticProps) {
return protoProps && store_defineProperties(Constructor.prototype, protoProps),
staticProps && store_defineProperties(Constructor, staticProps), Object.defineProperty(Constructor, "prototype", {
writable: !1
}), Constructor;
}(Store, [ {
key: "get",
value: function get() {
var key = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
return localStorage.getItem(this.prefix + key) || "";
}
}, {
key: "set",
value: function set() {
var key = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", value = arguments.length > 1 ? arguments[1] : void 0;
localStorage.setItem(this.prefix + key, value);
}
} ]), Store;
}(), store = new Store;
var scroll_scroll = {
show: function show_scroll() {
$("div#bp_config").is(":hidden") && $("div#message_box").is(":hidden") && $("body").css("overflow", "auto");
},
hide: function hide_scroll() {
$("body").css("overflow", "hidden");
}
}, message = '
'),
$(bili_player_id).hide()) : $("#bilibili-player")[0] ? ($(bili_player_id).before('
'),
$(bili_player_id).hide()) : $("#edu-player")[0] ? ($(bili_player_id).before('
'),
$(bili_player_id).hide()) : MessageBox_alert('
', (function() {
recover_player();
})), api.get_subtitle_url(0, (function dplayer_init() {
var subtitle_url = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
if (window.bp_dplayer = new DPlayer({
container: $("#bp_dplayer")[0],
mutex: !1,
volume: 1,
autoplay: !0,
video: {
url: url,
type: "auto"
},
subtitle: {
url: subtitle_url,
type: "webvtt",
fontSize: "35px",
bottom: "5%",
color: "#fff"
},
danmaku: !0,
apiBackend: {
read: function read(options) {
request_danmaku(options, video.base().cid());
},
send: function send(options) {
options.error("此脚本无法将弹幕同步到云端");
}
},
contextmenu: [ {
text: "脚本信息",
link: "https://github.com/injahow/user.js"
}, {
text: "脚本作者",
link: "https://injahow.com"
} ]
}), url_2 && "#" !== url_2) {
$("body").append('
'), window.bp_dplayer_2 = new DPlayer({
container: $("#bp_dplayer_2")[0],
mutex: !1,
volume: 1,
autoplay: !1,
video: {
url: url_2,
type: "auto"
}
});
var _ref = [ window.bp_dplayer, window.bp_dplayer_2 ], bp_dplayer = _ref[0], bp_dplayer_2 = _ref[1];
bp_dplayer.on("play", (function() {
!bp_dplayer.paused && bp_dplayer_2.play();
})), bp_dplayer.on("playing", (function() {
!bp_dplayer.paused && bp_dplayer_2.play();
})), bp_dplayer.on("timeupdate", (function() {
Math.abs(bp_dplayer.video.currentTime - bp_dplayer_2.video.currentTime) > 1 && (bp_dplayer_2.pause(),
bp_dplayer_2.seek(bp_dplayer.video.currentTime)), !bp_dplayer.paused && bp_dplayer_2.play();
})), bp_dplayer.on("seeking", (function() {
bp_dplayer_2.pause(), bp_dplayer_2.seek(bp_dplayer.video.currentTime);
})), bp_dplayer.on("waiting", (function() {
bp_dplayer_2.pause(), bp_dplayer_2.seek(bp_dplayer.video.currentTime);
})), bp_dplayer.on("pause", (function() {
bp_dplayer_2.pause(), bp_dplayer_2.seek(bp_dplayer.video.currentTime);
})), bp_dplayer.on("suspend", (function() {
bp_dplayer_2.speed(bp_dplayer.video.playbackRate);
})), bp_dplayer.on("volumechange", (function() {
bp_dplayer_2.volume(bp_dplayer.video.volume), bp_dplayer_2.video.muted = bp_dplayer.video.muted;
}));
}
}));
},
danmaku: {
config: danmaku_config
}
};
function check_defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
"value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
}
}
var check = new (function() {
function Check() {
!function check_classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
}(this, Check), this.aid = "", this.cid = "", this.q = "", this.epid = "";
}
return function check_createClass(Constructor, protoProps, staticProps) {
return protoProps && check_defineProperties(Constructor.prototype, protoProps),
staticProps && check_defineProperties(Constructor, staticProps), Object.defineProperty(Constructor, "prototype", {
writable: !1
}), Constructor;
}(Check, [ {
key: "refresh",
value: function refresh() {
console.log("refresh..."), $("#video_download").hide(), $("#video_download_2").hide(),
player.recover_player();
try {
var vb = video.base();
this.aid = vb.aid(), this.cid = vb.cid(), this.epid = vb.epid(), this.q = video.get_quality().q,
window.bp_episodes = null;
} catch (err) {
console.log(err);
}
}
} ]), Check;
}());
function download_createForOfIteratorHelper(o, allowArrayLike) {
var it = "undefined" != typeof Symbol && o[Symbol.iterator] || o["@@iterator"];
if (!it) {
if (Array.isArray(o) || (it = download_unsupportedIterableToArray(o)) || allowArrayLike && o && "number" == typeof o.length) {
it && (o = it);
var i = 0, F = function F() {};
return {
s: F,
n: function n() {
return i >= o.length ? {
done: !0
} : {
done: !1,
value: o[i++]
};
},
e: function e(_e) {
throw _e;
},
f: F
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var err, normalCompletion = !0, didErr = !1;
return {
s: function s() {
it = it.call(o);
},
n: function n() {
var step = it.next();
return normalCompletion = step.done, step;
},
e: function e(_e2) {
didErr = !0, err = _e2;
},
f: function f() {
try {
normalCompletion || null == it.return || it.return();
} finally {
if (didErr) throw err;
}
}
};
}
function _toConsumableArray(arr) {
return function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return download_arrayLikeToArray(arr);
}(arr) || function _iterableToArray(iter) {
if ("undefined" != typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) return Array.from(iter);
}(arr) || download_unsupportedIterableToArray(arr) || function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}();
}
function download_unsupportedIterableToArray(o, minLen) {
if (o) {
if ("string" == typeof o) return download_arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
return "Object" === n && o.constructor && (n = o.constructor.name), "Map" === n || "Set" === n ? Array.from(o) : "Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? download_arrayLikeToArray(o, minLen) : void 0;
}
}
function download_arrayLikeToArray(arr, len) {
(null == len || len > arr.length) && (len = arr.length);
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function rpc_type() {
return config_config.rpc_domain.match("https://") || config_config.rpc_domain.match(/localhost|127\.0\.0\.1/) ? "post" : "ariang";
}
var download_rpc_clicked = !1;
function download_rpc_post(video) {
download_rpc_post_all([ video ]);
}
function download_rpc_post_all(videos) {
if (download_rpc_clicked) Message_miaow(); else {
download_rpc_clicked = !0;
var data = _toConsumableArray(videos);
ajax(function get_rpc_post(data) {
data instanceof Array || (data = data instanceof Object ? [ data ] : []);
var rpc = {
domain: config_config.rpc_domain,
port: config_config.rpc_port,
token: config_config.rpc_token,
dir: config_config.rpc_dir
};
return {
url: "".concat(rpc.domain, ":").concat(rpc.port, "/jsonrpc"),
type: "POST",
dataType: "json",
data: JSON.stringify(data.map((function(_ref4) {
var url = _ref4.url, filename = _ref4.filename, rpc_dir = _ref4.rpc_dir, param = {
out: filename,
header: [ "User-Agent: ".concat(window.navigator.userAgent), "Referer: ".concat(window.location.href) ]
};
return (rpc_dir || rpc.dir) && (param.dir = rpc_dir || rpc.dir), {
id: window.btoa("BParse_".concat(Date.now(), "_").concat(Math.random())),
jsonrpc: "2.0",
method: "aria2.addUri",
params: [ "token:".concat(rpc.token), [ url ], param ]
};
})))
};
}(data)).then((function(res) {
res.length === data.length ? Message_success("RPC请求成功") : Message_warning("请检查RPC参数");
})).catch((function() {
Message_error("请检查RPC服务配置");
})).finally((function() {
return download_rpc_clicked = !1;
})), Message_info("发送RPC下载请求");
}
}
function open_ariang(rpc) {
var hash_tag = rpc ? "#!/settings/rpc/set/".concat(rpc.domain.replace("://", "/"), "/").concat(rpc.port, "/jsonrpc/").concat(window.btoa(rpc.token)) : "", url = config_config.ariang_host + hash_tag, a = document.createElement("a");
a.setAttribute("target", "_blank"), a.setAttribute("onclick", "window.bp_aria2_window=window.open('".concat(url, "');")),
a.click();
}
function download_rpc_ariang_send(video) {
var bp_aria2_window = window.bp_aria2_window, time = 100;
bp_aria2_window && !bp_aria2_window.closed || (open_ariang(), time = 3e3), setTimeout((function() {
var bp_aria2_window = window.bp_aria2_window, task_hash = "#!/new/task?" + [ "url=".concat(encodeURIComponent(window.btoa(video.url))), "out=".concat(encodeURIComponent(video.filename)), "header=User-Agent:".concat(window.navigator.userAgent), "header=Referer:".concat(window.location.href) ].join("&");
bp_aria2_window && !bp_aria2_window.closed ? (bp_aria2_window.location.href = config_config.ariang_host + task_hash,
Message_success("发送RPC请求")) : Message_warning("AriaNG页面未打开");
}), time);
}
function download_rpc_ariang() {
for (var _len = arguments.length, videos = new Array(_len), _key = 0; _key < _len; _key++) videos[_key] = arguments[_key];
0 != videos.length && (1 == videos.length && videos[0] instanceof Array ? download_rpc_ariang.apply(void 0, _toConsumableArray(videos[0])) : (download_rpc_ariang_send(videos.pop()),
setTimeout((function() {
download_rpc_ariang.apply(void 0, videos);
}), 100)));
}
var download_blob_clicked = !1, need_show_progress = !0;
function download_blob(url, filename) {
if (download_blob_clicked) return Message_miaow(), void (need_show_progress = !0);
var xhr = new XMLHttpRequest;
xhr.open("get", url), xhr.responseType = "blob", xhr.onload = function() {
if (200 === this.status || 304 === this.status) {
if ("msSaveOrOpenBlob" in navigator) return void navigator.msSaveOrOpenBlob(this.response, filename);
var blob_url = URL.createObjectURL(this.response), a = document.createElement("a");
a.style.display = "none", a.href = blob_url, a.download = filename, a.click(), URL.revokeObjectURL(blob_url);
}
}, need_show_progress = !0, xhr.onprogress = function(evt) {
if (4 != this.state) {
var loaded = evt.loaded, tot = evt.total;
!function show_progress(_ref5) {
var total = _ref5.total, loaded = _ref5.loaded, percent = _ref5.percent;
need_show_progress && MessageBox_alert("文件大小:".concat(Math.floor(total / 1048576), "MB(").concat(total, "Byte)
") + "已经下载:".concat(Math.floor(loaded / 1048576), "MB(").concat(loaded, "Byte)
") + "当前进度:".concat(percent, "%
下载中请勿操作浏览器,刷新或离开页面会导致下载取消!
再次点击下载按钮可查看下载进度。"), (function() {
need_show_progress = !1;
})), total === loaded && (MessageBox_alert("下载完成,请等待浏览器保存!"), download_blob_clicked = !1);
}({
total: tot,
loaded: loaded,
percent: Math.floor(100 * loaded / tot)
});
}
}, xhr.send(), download_blob_clicked = !0, Message_info("准备开始下载");
}
function _download_danmaku_ass(cid, title) {
var return_type = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, callback = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null;
ajax({
url: "https://api.bilibili.com/x/v1/dm/list.so?oid=".concat(cid),
dataType: "text"
}).then((function(result) {
var result_dom = $(result.replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, ""));
if (!result_dom || !result_dom.find("d")[0]) return "callback" === return_type && callback ? void callback() : void Message_warning("未发现弹幕");
var _step2, danmaku_data = result_dom.find("d").map((function(i, el) {
var item = $(el), p = item.attr("p").split(","), type = 0;
return "4" === p[1] ? type = 2 : "5" === p[1] && (type = 1), [ {
time: parseFloat(p[0]),
type: type,
color: parseInt(p[3]),
text: item.text()
} ];
})).get().sort((function(a, b) {
return a.time - b.time;
})), dialogue = function dialogue(danmaku, scroll_id, fix_id) {
var text = danmaku.text, time = danmaku.time, commands = [ 0 === danmaku.type ? function scrollCommand(top, left_a, left_b) {
return "\\move(".concat(left_a, ",").concat(top, ",").concat(left_b, ",").concat(top, ")");
}(50 * (1 + Math.floor(15 * Math.random())), 1920 + 50 * danmaku.text.length / 2, 0 - 50 * danmaku.text.length / 2) : function fixCommand(top, left) {
return "\\pos(".concat(left, ",").concat(top, ")");
}(50 * (1 + fix_id % 15), 960), function isWhite(color) {
return 16777215 === color;
}(danmaku.color) ? "" : function colorCommand(color) {
return "\\c&H".concat(((255 & color) << 16 | (color >> 8 & 255) << 8 | color >> 16 & 255).toString(16), "&");
}(danmaku.color) ], formatTime = function formatTime(seconds) {
var div = function div(i, j) {
return Math.floor(i / j);
}, pad = function pad(n) {
return n < 10 ? "0" + n : "" + n;
}, integer = Math.floor(seconds), hour = div(integer, 3600), minute = div(integer, 60) % 60, second = integer % 60, minorSecond = Math.floor(100 * (seconds - integer));
return "".concat(hour, ":").concat(pad(minute), ":").concat(pad(second), ".").concat(minorSecond);
}, fields = [ 0, formatTime(time), formatTime(time + (0 === danmaku.type ? 8 : 4)), "Medium", "", "0", "0", "0", "", "{" + commands.join("") + "}" + function encode(text) {
return text.replace(/\{/g, "{").replace(/\}/g, "}").replace(/\r|\n/g, "");
}(text) ];
return "Dialogue: " + fields.join(",");
}, content = [ "[Script Info]", "; Script generated by injahow/user.js", "; https://github.com/injahow/user.js", "Title: ".concat(title), "ScriptType: v4.00+", "PlayResX: ".concat(1920), "PlayResY: ".concat(1080), "Timer: 10.0000", "WrapStyle: 2", "ScaledBorderAndShadow: no", "", "[V4+ Styles]", "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding", "Style: Small,微软雅黑,36,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,0,0,0,0,100,100,0,0,1,1.2,0,5,0,0,0,0", "Style: Medium,微软雅黑,52,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,0,0,0,0,100,100,0,0,1,1.2,0,5,0,0,0,0", "Style: Large,微软雅黑,64,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,0,0,0,0,100,100,0,0,1,1.2,0,5,0,0,0,0", "Style: Larger,微软雅黑,72,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,0,0,0,0,100,100,0,0,1,1.2,0,5,0,0,0,0", "Style: ExtraLarge,微软雅黑,90,&H66FFFFFF,&H66FFFFFF,&H66000000,&H66000000,0,0,0,0,100,100,0,0,1,1.2,0,5,0,0,0,0", "", "[Events]", "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text" ], fix_id = 0, _iterator2 = download_createForOfIteratorHelper(danmaku_data);
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
var danmaku = _step2.value;
0 === danmaku.type ? 0 : fix_id++, content.push(dialogue(danmaku, 0, fix_id));
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
var data = content.join("\n");
if (null === return_type || "file" === return_type) {
var blob_url = URL.createObjectURL(new Blob([ data ], {
type: "text/ass"
})), a = document.createElement("a");
a.style.display = "none", a.href = blob_url, a.download = title + ".ass", a.click(),
URL.revokeObjectURL(blob_url);
} else "callback" === return_type && callback && callback(data);
})).catch((function() {
"callback" === return_type && callback && callback();
}));
}
function download_danmaku_ass(cid, title) {
_download_danmaku_ass(cid, title, "file");
}
function download_subtitle_vtt() {
var p = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, file_name = arguments.length > 1 ? arguments[1] : void 0, download_subtitle = function download_subtitle(blob_url) {
if (blob_url) {
var a = document.createElement("a");
a.setAttribute("target", "_blank"), a.setAttribute("href", blob_url), a.setAttribute("download", file_name + ".vtt"),
a.click(), URL.revokeObjectURL(blob_url);
} else Message_warning("未发现字幕");
};
api.get_subtitle_url(p, download_subtitle);
}
function download_blob_zip(blob_data, filename) {
if (blob_data) {
var blob_url = URL.createObjectURL(blob_data), a = document.createElement("a");
a.setAttribute("target", "_blank"), a.setAttribute("href", blob_url), a.setAttribute("download", filename + ".zip"),
a.click(), URL.revokeObjectURL(blob_url);
}
}
function download_danmaku_ass_zip(videos, zip) {
if (videos) {
if (0 === videos.length) return 0 === Object.keys(zip.files).length ? void Message_warning("未发现弹幕") : void zip.generateAsync({
type: "blob"
}).then((function(data) {
return download_blob_zip(data, video.base().filename() + "_ass");
}));
var _videos$pop = videos.pop(), cid = _videos$pop.cid, filename = _videos$pop.filename;
_download_danmaku_ass(cid, filename, "callback", (function(data) {
data && zip.file(filename + ".ass", data), setTimeout((function() {
download_danmaku_ass_zip(videos, zip);
}), 1e3);
}));
}
}
function download_subtitle_vtt_zip(videos, zip) {
if (videos) {
if (0 === videos.length) return 0 === Object.keys(zip.files).length ? void Message_warning("未发现字幕") : void zip.generateAsync({
type: "blob"
}).then((function(data) {
return download_blob_zip(data, video.base().filename() + "_vtt");
}));
var _videos$pop2 = videos.pop(), p = _videos$pop2.p, filename = _videos$pop2.filename;
api.get_subtitle_data(p, (function(data) {
data && zip.file(filename + ".vtt", data), setTimeout((function() {
download_subtitle_vtt_zip(videos, zip);
}), 1e3);
}));
}
}
function format(url) {
return url ? url.match(".mp4|.m4s") ? ".mp4" : url.match(".flv") ? ".flv" : ".mp4" : "";
}
var Download = {
url_format: format,
download: function download(url, filename, type) {
filename = filename.replace(/[\/\\*|]+/g, "-").replace(/:/g, ":").replace(/\?/g, "?").replace(/"/g, "'").replace(//g, "》"),
"blob" === type ? download_blob(url, filename) : "rpc" === type && function download_rpc(url, filename) {
var type = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "post";
"post" === type ? download_rpc_post({
url: url,
filename: filename
}) : "ariang" === type && download_rpc_ariang({
url: url,
filename: filename
});
}(url, filename, rpc_type());
},
download_all: function download_all() {
var vb = video.base(), _ref = [ video.get_quality().q, vb.total() ], q = _ref[0], total = _ref[1];
$("body").on("click", 'input[name="option_video"]', (function(event) {
function get_option_index(element) {
return element && parseInt(element.id.split("_")[1]) || 0;
}
if ($(this).is(":checked") ? $(this).parent().css("color", "rgba(0,0,0,1)") : $(this).parent().css("color", "rgba(0,0,0,0.5)"),
event.ctrlKey || event.altKey) {
var current_select_option_index = get_option_index(event.target), option_videos = _toConsumableArray(document.getElementsByName("option_video"));
if (event.target.checked) for (var i = get_option_index(option_videos.filter((function(e) {
return e.checked && get_option_index(e) < current_select_option_index;
})).slice(-1)[0]); i < current_select_option_index; i++) option_videos[i].checked = !0,
option_videos[i].parentNode.style.color = "rgba(0,0,0,1)"; else for (var _i = get_option_index(option_videos.filter((function(e) {
return !e.checked && get_option_index(e) < current_select_option_index;
})).slice(-1)[0]); _i < current_select_option_index; _i++) option_videos[_i].checked = !1,
option_videos[_i].parentNode.style.color = "rgba(0,0,0,0.5)";
}
}));
for (var video_html = "", i = 0; i < total; i++) video_html += "" + '
");
var all_checked = !1;
$("body").on("click", "button#checkbox_btn", (function() {
all_checked ? (all_checked = !1, $('input[name="option_video"]').prop("checked", all_checked),
$('input[name="option_video"]').parent().css("color", "rgba(0,0,0,0.5)")) : (all_checked = !0,
$('input[name="option_video"]').prop("checked", all_checked), $('input[name="option_video"]').parent().css("color", "rgb(0,0,0)"));
}));
var _step, option_support_html = "", _iterator = download_createForOfIteratorHelper(video.get_quality_support());
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
var item = _step.value;
option_support_html += '
");
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
var msg = "" + '
\n \n \n 无法设置MP4清晰度\n
\n
\n \n \n
\n
\n \n \n \n \n 字幕\n \n \n \n 弹幕\n \n
\n
\n 保存目录:\n \n
\n
\n 为避免请求被拦截,设置了延时且不支持下载无法播放的视频;请勿频繁下载过多视频,可能触发风控导致不可再下载!\n \n
\n ').concat(video_html, '\n
\n
\n \n
');
function download_videos(video_tasks, i, videos) {
if (video_tasks.length) {
if (i >= video_tasks.length) return MessageBox_alert("视频地址请求完成!"), void ("post" === rpc_type() && videos.length > 0 && (download_rpc_post_all(videos),
videos.length = 0));
var task = video_tasks[i], msg = "第".concat(i + 1, "(").concat(i + 1, "/").concat(video_tasks.length, ")个视频");
MessageBox_alert("".concat(msg, ":获取中..."));
api.get_urls(task.p, task.q, task.format, (function success(res) {
if (setTimeout((function() {
download_videos(video_tasks, ++i, videos);
}), 4e3), !res.code) {
Message_success("请求成功" + (res.times ? "
今日剩余请求次数".concat(res.times) : "")),
MessageBox_alert("".concat(msg, ":获取成功!"));
var _ref3 = [ res.url, rpc_type(), res.video, res.audio ], url = _ref3[0], type = _ref3[1], video_url = _ref3[2], audio_url = _ref3[3];
"post" === type ? ("dash" === task.format ? videos.push({
url: video_url,
filename: task.filename + format(video_url),
rpc_dir: task.rpc_dir
}, {
url: audio_url,
filename: task.filename + ".m4a",
rpc_dir: task.rpc_dir
}) : videos.push({
url: url,
filename: task.filename + format(url),
rpc_dir: task.rpc_dir
}), videos.length > 3 && (download_rpc_post_all(videos), videos.length = 0)) : "ariang" === type && ("dash" === task.format ? download_rpc_ariang({
url: video_url,
filename: task.filename + format(video_url)
}, {
url: audio_url,
filename: task.filename + ".m4a"
}) : download_rpc_ariang({
url: url,
filename: task.filename + format(url)
}));
}
}), (function error() {
download_videos(video_tasks, ++i, videos);
}));
}
}
MessageBox_confirm(msg, (function() {
for (var _ref2 = [ $("#dl_video").is(":checked"), $("#dl_subtitle").is(":checked"), $("#dl_danmaku").is(":checked"), $("#dl_format").val(), $("#dl_quality").val() || q, $("#dl_rpc_dir").val() ], dl_video = _ref2[0], dl_subtitle = _ref2[1], dl_danmaku = _ref2[2], dl_format = _ref2[3], dl_quality = _ref2[4], dl_rpc_dir = _ref2[5], videos = [], _i2 = 0; _i2 < total; _i2++) if ($("input#option_".concat(_i2)).is(":checked")) {
var p = _i2 + 1;
videos.push({
cid: vb.cid(p),
p: p,
q: dl_quality,
format: dl_format,
filename: vb.filename(p),
rpc_dir: dl_rpc_dir
});
}
dl_video && download_videos(videos, 0, []), dl_subtitle && (1 === videos.length ? download_subtitle_vtt(videos[0].p, videos[0].filename) : download_subtitle_vtt_zip([].concat(videos), new JSZip)),
dl_danmaku && (1 === videos.length ? download_danmaku_ass(videos[0].cid, videos[0].filename) : download_danmaku_ass_zip([].concat(videos), new JSZip));
})), $("#dl_quality").val(q), $("body").on("click", 'input[name="dl_option"]', (function() {
$(this).is(":checked") ? $(this).parent().css("color", "rgba(0,0,0,1)") : $(this).parent().css("color", "rgba(0,0,0,0.5)");
}));
},
download_danmaku_ass: download_danmaku_ass,
download_subtitle_vtt: download_subtitle_vtt,
open_ariang: open_ariang
}, config = '
', config_config = {
base_api: "https://api.injahow.cn/bparse/",
request_type: "auto",
format: "mp4",
host_key: "0",
replace_force: "0",
auth: "0",
download_type: "web",
rpc_domain: "http://localhost",
rpc_port: "16800",
rpc_token: "",
rpc_dir: "",
aria2c_connection_level: "min",
aria2c_addition_parameters: "",
ariang_host: "http://ariang.injahow.com/",
auto_download: "0",
video_quality: "0",
danmaku_speed: "15",
danmaku_fontsize: "22"
}, default_config = Object.assign({}, config_config), hostMap = {
ks3: "upos-sz-mirrorks3.bilivideo.com",
ks3b: "upos-sz-mirrorks3b.bilivideo.com",
ks3c: "upos-sz-mirrorks3c.bilivideo.com",
ks32: "upos-sz-mirrorks32.bilivideo.com",
kodo: "upos-sz-mirrorkodo.bilivideo.com",
kodob: "upos-sz-mirrorkodob.bilivideo.com",
cos: "upos-sz-mirrorcos.bilivideo.com",
cosb: "upos-sz-mirrorcosb.bilivideo.com",
bos: "upos-sz-mirrorbos.bilivideo.com",
wcs: "upos-sz-mirrorwcs.bilivideo.com",
wcsb: "upos-sz-mirrorwcsb.bilivideo.com",
hw: "upos-sz-mirrorhw.bilivideo.com",
hwb: "upos-sz-mirrorhwb.bilivideo.com",
upbda2: "upos-sz-upcdnbda2.bilivideo.com",
upws: "upos-sz-upcdnws.bilivideo.com",
uptx: "upos-sz-upcdntx.bilivideo.com",
uphw: "upos-sz-upcdnhw.bilivideo.com",
js: "upos-tf-all-js.bilivideo.com",
hk: "cn-hk-eq-bcache-01.bilivideo.com",
akamai: "upos-hz-mirrorakam.akamaized.net"
}, videoQualityMap = {
127: "8K 超高清",
120: "4K 超清",
116: "1080P 60帧",
112: "1080P 高码率",
80: "1080P 高清",
74: "720P 60帧",
64: "720P 高清",
48: "720P 高清(MP4)",
32: "480P 清晰",
16: "360P 流畅"
}, help_clicked = !1, config_functions = {
save_config: function save_config() {
var old_config;
try {
old_config = JSON.parse(store.get("config_str")), store.set("config_str", JSON.stringify(config_config));
} catch (err) {
old_config = Object.assign({}, config_config);
}
for (var _i = 0, _arr = [ "base_api", "format", "auth", "video_quality" ]; _i < _arr.length; _i++) {
var key = _arr[_i];
if (config_config[key] !== old_config[key]) {
$("#video_download").hide(), $("#video_download_2").hide();
break;
}
}
config_config.host_key !== old_config.host_key && (check.refresh(), $("#video_url").attr("href", "#"),
$("#video_url_2").attr("href", "#")), config_config.rpc_domain !== old_config.rpc_domain && (config_config.rpc_domain.match("https://") || config_config.rpc_domain.match(/(localhost|127\.0\.0\.1)/) || MessageBox_alert("检测到当前RPC不是localhost本地接口,即将跳转到AriaNg网页控制台页面;请查看控制台RPC接口参数是否正确,第一次加载可能较慢请耐心等待;配置好后即可使用脚本进行远程下载,使用期间不用关闭AriaNg页面!", (function() {
Download.open_ariang({
domain: config_config.rpc_domain,
port: config_config.rpc_port,
token: config_config.rpc_token
});
})));
for (var _i2 = 0, _arr2 = [ "danmaku_speed", "danmaku_fontsize" ]; _i2 < _arr2.length; _i2++) {
var _key = _arr2[_i2];
if (config_config[_key] !== old_config[_key]) {
player.danmaku.config();
break;
}
}
$("#bp_config").hide(), $("#bp_config").css("opacity", 0), scroll_scroll.show();
},
reset_config: function reset_config() {
for (var key in default_config) "auth" !== key && (config_config[key] = default_config[key],
$("#".concat(key)).val(default_config[key]));
},
show_help: function show_help() {
help_clicked ? Message_miaow() : (help_clicked = !0, ajax({
url: "".concat(config_config.base_api, "/auth/v2/?act=help"),
dataType: "text"
}).then((function(res) {
res ? MessageBox_alert(res) : Message_warning("获取失败");
})).finally((function() {
return help_clicked = !1;
})));
},
show_login: function show_login() {
auth.login("1");
},
show_login_2: function show_login_2() {
auth.login("0");
},
show_logout: function show_logout() {
auth.logout();
},
show_login_help: function show_login_help() {
MessageBox_confirm("进行授权之后在远程请求时拥有用户账号原有的权限,例如能够获取用户已经付费或承包的番剧,是否需要授权?", (function() {
auth.login();
}));
}
};
function getCookie(cookieName) {
for (var cookieList = document.cookie.split(";"), i = 0; i < cookieList.length; ++i) {
var arr = cookieList[i].split("=");
if (cookieName === arr[0].trim()) return arr[1];
}
return null;
}
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter((function(sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
}))), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(Object(source), !0).forEach((function(key) {
_defineProperty(target, key, source[key]);
})) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach((function(key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
}));
}
return target;
}
function _defineProperty(obj, key, value) {
return key in obj ? Object.defineProperty(obj, key, {
value: value,
enumerable: !0,
configurable: !0,
writable: !0
}) : obj[key] = value, obj;
}
function auth_defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
"value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
}
}
var Auth = function() {
function Auth() {
!function auth_classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
}(this, Auth), this.auth_clicked = !1, this.auth_window = null, this.TV_KEY = "4409e2ce8ffd12b8",
this.TV_SEC = "59b43e04ad6965f34319062b478f83dd";
}
return function auth_createClass(Constructor, protoProps, staticProps) {
return protoProps && auth_defineProperties(Constructor.prototype, protoProps), staticProps && auth_defineProperties(Constructor, staticProps),
Object.defineProperty(Constructor, "prototype", {
writable: !1
}), Constructor;
}(Auth, [ {
key: "checkLoginStatus",
value: function checkLoginStatus() {
var _this = this, _ref = [ store.get("auth_id"), store.get("auth_sec"), store.get("access_key"), store.get("auth_time") || 0 ], auth_id = _ref[0], auth_sec = _ref[1], access_key = _ref[2], auth_time = _ref[3];
access_key && (user.is_login && (config_config.base_api !== store.get("pre_base_api") || Date.now() - parseInt(auth_time) > 2592e5) && ajax({
url: "https://passport.bilibili.com/api/oauth?access_key=".concat(access_key),
type: "GET",
dataType: "json"
}).then((function(res) {
res.code ? (Message_info("授权已过期,准备重新授权"), _this.reLogin()) : (store.set("auth_time", Date.now()),
ajax({
url: "".concat(config_config.base_api, "/auth/?act=check&auth_id=").concat(auth_id, "&auth_sec=").concat(auth_sec, "&access_key=").concat(access_key),
type: "GET",
dataType: "json"
}).then((function(res) {
res.code && (Message_info("检查失败,准备重新授权"), _this.reLogin());
})));
})), store.set("pre_base_api", config_config.base_api));
}
}, {
key: "makeAPIData",
value: function makeAPIData(param, sec) {
return _objectSpread(_objectSpread({}, param), {}, {
sign: md5("".concat(Object.entries(param).map((function(e) {
return "".concat(e[0], "=").concat(e[1]);
})).join("&")).concat(sec))
});
}
}, {
key: "_login",
value: function _login(resolve) {
var _this2 = this;
this.auth_clicked ? Message_miaow() : (this.auth_clicked = !0, ajax({
url: "https://passport.bilibili.com/x/passport-tv-login/qrcode/auth_code",
type: "POST",
data: this.makeAPIData({
appkey: this.TV_KEY,
csrf: getCookie("bili_jct") || "",
local_id: "0",
ts: Date.now()
}, this.TV_SEC)
}).then(resolve).catch((function() {
return _this2.auth_clicked = !1;
})));
}
}, {
key: "login",
value: function login() {
var useApp = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "1", do_login = "1" === useApp ? this.loginApp.bind(this) : this.loginWeb.bind(this);
store.get("auth_id") ? MessageBox_confirm("发现授权记录,是否重新授权?", do_login) : do_login();
}
}, {
key: "reLogin",
value: function reLogin() {
this.logout(), store.set("auth_time", "0"), this.loginApp();
}
}, {
key: "loginApp",
value: function loginApp() {
var _this3 = this;
this._login((function(res) {
if (res && !res.code) {
var _res$data = res.data, url = _res$data.url, auth_code = _res$data.auth_code, is_login = 0, box = MessageBox_alert('
请使用哔哩哔哩客户端扫码登录
', (function() {
is_login || Message_info("登陆失败!"), clearInterval(timer), _this3.auth_clicked = !1;
}));
new QRCode(document.getElementById("login_qrcode"), url);
var timer = setInterval((function() {
_ajax({
url: "https://passport.bilibili.com/x/passport-tv-login/qrcode/poll",
type: "POST",
data: _this3.makeAPIData({
appkey: _this3.TV_KEY,
auth_code: auth_code,
csrf: getCookie("bili_jct") || "",
local_id: "0",
ts: Date.now().toString()
}, _this3.TV_SEC)
}).then((function(res) {
!res.code && res.data ? (console.log("login success"), is_login = 1, _this3.doAuth(res.data.token_info),
box.affirm()) : 86038 === res.code && box.affirm();
}));
}), 3e3);
}
}));
}
}, {
key: "loginWeb",
value: function loginWeb() {
var _this4 = this;
this._login((function(res) {
if (res && !res.code) {
var _res$data2 = res.data, url = _res$data2.url, auth_code = _res$data2.auth_code;
_this4.auth_window = window.open(url);
var is_login = 0, timer = setInterval((function() {
if (!_this4.auth_window || _this4.auth_window.closed) return clearInterval(timer),
_this4.auth_clicked = !1, void (is_login || Message_info("登陆失败!"));
_ajax({
url: "https://passport.bilibili.com/x/passport-tv-login/qrcode/poll",
type: "POST",
data: _this4.makeAPIData({
appkey: _this4.TV_KEY,
auth_code: auth_code,
csrf: getCookie("bili_jct") || "",
local_id: "0",
ts: Date.now().toString()
}, _this4.TV_SEC)
}).then((function(res) {
!res.code && res.data ? (console.log("login success"), _this4.doAuth(res.data.token_info),
is_login = 1, _this4.auth_window.close()) : 86038 === res.code && _this4.auth_window.close();
})).catch((function() {
return _this4.auth_window.close();
}));
}), 3e3);
}
}));
}
}, {
key: "logout",
value: function logout() {
var _this5 = this;
if (store.get("auth_id")) if (this.auth_clicked) Message_miaow(); else {
var _ref2 = [ store.get("auth_id"), store.get("auth_sec") ], auth_id = _ref2[0], auth_sec = _ref2[1];
ajax({
url: "".concat(config_config.base_api, "/auth/?act=logout&auth_id=").concat(auth_id, "&auth_sec=").concat(auth_sec),
type: "GET",
dataType: "json"
}).then((function(res) {
res.code ? Message_warning("注销失败") : (Message_success("注销成功"), store.set("auth_id", ""),
store.set("auth_sec", ""), store.set("auth_time", "0"), store.set("access_key", ""),
$("#auth").val("0"), config_config.auth = "0");
})).finally((function() {
return _this5.auth_clicked = !1;
}));
} else MessageBox_alert("没有发现授权记录");
}
}, {
key: "doAuth",
value: function doAuth(param) {
var _this6 = this;
this.auth_window && !this.auth_window.closed && (this.auth_window.close(), this.auth_window = null),
ajax({
url: "".concat(config_config.base_api, "/auth/?act=login&").concat(Object.entries(_objectSpread({
auth_id: store.get("auth_id"),
auth_sec: store.get("auth_sec")
}, param)).map((function(e) {
return "".concat(e[0], "=").concat(e[1]);
})).join("&")),
type: "GET",
dataType: "json"
}).then((function(res) {
res.code ? Message_warning("授权失败") : (Message_success("授权成功"), res.auth_id && res.auth_sec && (store.set("auth_id", res.auth_id),
store.set("auth_sec", res.auth_sec)), store.set("access_key", param.access_token),
store.set("auth_time", Date.now()), $("#auth").val("1"), config_config.auth = "1");
})).finally((function() {
return _this6.auth_clicked = !1;
}));
}
} ]), Auth;
}(), auth = new Auth, more_style = " ", btn_list = {
setting_btn: "脚本设置",
bilibili_parse: "请求地址",
video_download: "下载视频",
video_download_2: "下载音频",
video_download_all: "批量下载",
more: {
download_danmaku: "下载弹幕",
download_subtitle: "下载字幕"
}
}, download_svg = '
', svg_map = {
setting_btn: '
',
bilibili_parse: '
',
video_download: download_svg,
video_download_2: download_svg,
video_download_all: download_svg
};
function make_toolbar_bangumi(main_class_name, sub_class_names) {
var toolbar_elements = Object.keys(btn_list).map((function(key) {
if ("more" === key) {
var more_map = btn_list[key];
return "" + '
更多
\n
'.concat(Object.keys(more_map).map((function(key) {
return function more_element(id, name) {
return '- ').concat(name, "
");
}(key, more_map[key]);
})).join(""), "
\n
");
}
return function list_element(id, class_names, svg, name) {
return "" + '
\n \n ').concat(svg, '\n \n ').concat(name, "\n
");
}(key, sub_class_names, svg_map[key], btn_list[key]);
})).join("");
return "" + '
\n ').concat(toolbar_elements, "\n ").concat(more_style, "\n
");
}
function main_slicedToArray(arr, i) {
return function main_arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}(arr) || function main_iterableToArrayLimit(arr, i) {
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
if (null == _i) return;
var _s, _e, _arr = [], _n = !0, _d = !1;
try {
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), !i || _arr.length !== i); _n = !0) ;
} catch (err) {
_d = !0, _e = err;
} finally {
try {
_n || null == _i.return || _i.return();
} finally {
if (_d) throw _e;
}
}
return _arr;
}(arr, i) || function main_unsupportedIterableToArray(o, minLen) {
if (!o) return;
if ("string" == typeof o) return main_arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
"Object" === n && o.constructor && (n = o.constructor.name);
if ("Map" === n || "Set" === n) return Array.from(o);
if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return main_arrayLikeToArray(o, minLen);
}(arr, i) || function main_nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}();
}
function main_arrayLikeToArray(arr, len) {
(null == len || len > arr.length) && (len = arr.length);
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function main_defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0,
"value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);
}
}
var Main = function() {
function Main() {
!function main_classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
}(this, Main), console.log("\n".concat(" %c bilibili-parse-download.user.js v", "2.5.6", " ").concat("b7225b5", " %c https://github.com/injahow/user.js ", "\n", "\n"), "color: #fadfa3; background: #030307; padding:5px 0;", "background: #fadfa3; padding:5px 0;");
}
return function main_createClass(Constructor, protoProps, staticProps) {
return protoProps && main_defineProperties(Constructor.prototype, protoProps), staticProps && main_defineProperties(Constructor, staticProps),
Object.defineProperty(Constructor, "prototype", {
writable: !1
}), Constructor;
}(Main, [ {
key: "init",
value: function init() {
!function initToolbar() {
if ($("#arc_toolbar_report")[0]) $("#arc_toolbar_report").after('
'); else if ($("#toolbar_module")[0]) $("#toolbar_module").after('
'); else if ($("div.video-toolbar")[0]) $("div.video-toolbar").after('
'); else if ($("#playlistToolbar")[0]) {
var toolbar_obj = $("#playlistToolbar"), toolbar_obj_2 = toolbar_obj.clone();
toolbar_obj_2.attr("id", "playlistToolbar_2");
var left = toolbar_obj_2.find(".video-toolbar-left"), right = toolbar_obj_2.find(".video-toolbar-right");
left.children().remove(), right.children().remove(), Object.keys(btn_list).map((function(key) {
if ("more" !== key) {
var item = toolbar_obj.find(".toolbar-left-item-wrap").eq(0).clone();
item.attr("id", key);
var svg = svg_map[key].replaceAll("#757575", "currentColor").replace("class", 'class="'.concat(item.find("svg").attr("class"), '"')), span = item.find("span").text(btn_list[key]), item_div = item.find("div").eq(0);
item_div.attr("title", btn_list[key]), item_div.removeClass("on"), item_div.children().remove(),
item_div.append(svg).append(span), left.append(item);
} else {
var more_map = btn_list[key], el = "" + '
更多
\n
'.concat(Object.keys(more_map).map((function(key) {
return '- ').concat(more_map[key], "
");
})).join(""), "
\n
");
right.append(el + more_style);
}
})), toolbar_obj.after(toolbar_obj_2);
} else if ($(".player-left-components")[0]) {
var _toolbar_obj = $(".player-left-components").children().eq(0), toolbar_class = _toolbar_obj.attr("class"), span_class = _toolbar_obj.children().eq(0).attr("class"), span_class_svg = _toolbar_obj.children().eq(0).children().eq(0).attr("class"), span_class_text = _toolbar_obj.children().eq(0).children().eq(1).attr("class");
_toolbar_obj.after(make_toolbar_bangumi(toolbar_class, [ span_class, span_class_svg, span_class_text ]));
} else if ($(".edu-play-left")[0]) {
var _toolbar_obj2 = $(".edu-play-left").children().eq(1), _toolbar_class = _toolbar_obj2.attr("class"), _span_class = _toolbar_obj2.children().eq(0).attr("class"), _span_class_svg = _toolbar_obj2.children().eq(0).children().eq(0).attr("class"), _span_class_text = _toolbar_obj2.children().eq(0).children().eq(1).attr("class");
_toolbar_obj2.after(make_toolbar_bangumi(_toolbar_class, [ _span_class, _span_class_svg, _span_class_text ]));
}
}();
var root_div = document.createElement("div");
root_div.id = "bp_root", document.body.append(root_div), function initConfig(el) {
var options = '
';
for (var k in hostMap) options += '
");
for (var _k in config = config.replace("{{host_key_options}}", options), options = '
',
videoQualityMap) options += '
");
config = config.replace("{{video_quality_options}}", options), el && $(el)[0] ? $(el).append(config) : $("body").append(config);
var config_str = store.get("config_str");
if (config_str) try {
var old_config = JSON.parse(config_str);
for (var key in old_config) Object.hasOwnProperty.call(config_config, key) && (config_config[key] = old_config[key]);
} catch (_unused) {
console.log("初始化脚本配置");
}
config_config.auth = store.get("auth_id") && store.get("auth_sec") ? "1" : "0",
store.set("config_str", JSON.stringify(config_config));
var _loop = function _loop(_key2) {
if ("auth" === _key2) return "continue";
$("#".concat(_key2)).on("input", (function(e) {
config_config[_key2] = e.delegateTarget.value;
}));
};
for (var _key2 in config_config) _loop(_key2);
for (var _k2 in config_functions) {
var e = $("#".concat(_k2))[0];
e && (e.onclick = config_functions[_k2]);
}
for (var _key3 in config_config) $("#".concat(_key3)).val(config_config[_key3]);
window.onbeforeunload = function() {
var bp_aria2_window = window.bp_aria2_window;
bp_aria2_window && !bp_aria2_window.closed && bp_aria2_window.close();
};
}("#".concat(root_div.id)), function initMessage(el) {
el && $(el)[0] ? $(el).append(message) : $("body").append(message);
}("#".concat(root_div.id)), user.lazyInit(), auth.checkLoginStatus(), check.refresh(),
$("#".concat(root_div.id)).append('
'),
$("#".concat(root_div.id)).append('
'),
$("#".concat(root_div.id)).append('
');
}
}, {
key: "run",
value: function run() {
var api_url, api_url_temp;
this.init();
var evt = {
setting_btn: function setting_btn() {
for (var key in user.lazyInit(!0), config_config) $("#".concat(key)).val(config_config[key]);
$("#bp_config").show(), $("#bp_config").animate({
opacity: "1"
}, 300), scroll_scroll.hide();
},
bilibili_parse: function bilibili_parse() {
user.lazyInit(!0);
var vb = video.base(), _ref = [ vb.type(), vb.aid(), vb.p(), vb.cid(), vb.epid() ], type = _ref[0], aid = _ref[1], p = _ref[2], cid = _ref[3], epid = _ref[4], q = video.get_quality().q;
api_url = "".concat(config_config.base_api, "?av=").concat(aid, "&p=").concat(p, "&cid=").concat(cid, "&ep=").concat(epid, "&q=").concat(q, "&type=").concat(type, "&format=").concat(config_config.format, "&otype=json&_host=").concat(config_config.host_key, "&_req=").concat(config_config.request_type, "&_q=").concat(config_config.video_quality);
var _ref2 = [ store.get("auth_id"), store.get("auth_sec") ], auth_id = _ref2[0], auth_sec = _ref2[1];
if ("1" === config_config.auth && auth_id && auth_sec && (api_url += "&auth_id=".concat(auth_id, "&auth_sec=").concat(auth_sec)),
api_url !== api_url_temp || "local" === config_config.request_type) $("#video_url").attr("href", "#"),
$("#video_url_2").attr("href", "#"), api_url_temp = api_url, Message_info("开始请求"),
api.get_url((function(res) {
if (res && !res.code) {
var _url, _url_;
if (Message_success("请求成功"), res.times && Message_info("剩余请求次数:".concat(res.times)),
res.url) _url = res.url.replace("http://", "https://"), _url_ = "#"; else {
if (!res.video || !res.audio) return void Message_warning("数据错误");
_url = res.video.replace("http://", "https://"), _url_ = res.audio.replace("http://", "https://");
}
$("#video_url").attr("href", _url), $("#video_url").attr("download", vb.filename() + Download.url_format(_url)),
$("#video_download").show(), "#" !== _url_ && ($("#video_url_2").attr("href", _url_),
$("#video_url_2").attr("download", vb.filename() + "_audio.mp4"), $("#video_download_2").show()),
(user.needReplace() || vb.isLimited() || "1" === config_config.replace_force) && player.replace_player(_url, _url_),
"1" === config_config.auto_download && $("#video_download").click();
}
})); else {
Message_miaow();
var url = $("#video_url").attr("href"), url_2 = $("#video_url_2").attr("href");
url && "#" !== url && ($("#video_download").show(), "dash" === config_config.format && $("#video_download_2").show(),
(user.needReplace() || vb.isLimited() || "1" === config_config.replace_force) && !$("#bp_dplayer")[0] && player.replace_player(url, url_2),
"1" === config_config.auto_download && $("#video_download").click());
}
},
download_danmaku: function download_danmaku() {
var vb = video.base();
Download.download_danmaku_ass(vb.cid(), vb.filename());
},
download_subtitle: function download_subtitle() {
Download.download_subtitle_vtt(0, video.base().filename());
},
video_download_all: function video_download_all() {
user.lazyInit(!0), store.get("auth_id") && store.get("auth_sec") ? "rpc" === config_config.download_type ? Download.download_all() : MessageBox_confirm("仅支持使用RPC接口批量下载,请确保RPC环境正常,是否继续?", (function() {
Download.download_all();
})) : MessageBox_confirm("批量下载仅支持授权用户使用RPC接口下载,是否进行授权?", (function() {
auth.login();
}));
},
video_download: function video_download() {
var type = config_config.download_type;
if ("web" === type) $("#video_url")[0].click(); else if ("a" === type) {
var _ref3 = [ $("#video_url").attr("href"), $("#video_url_2").attr("href"), $("#video_url").attr("download"), $("#video_url_2").attr("download") ], video_url_2 = _ref3[1], file_name = _ref3[2], file_name_2 = _ref3[3], msg = "建议使用IDM、FDM等软件安装其浏览器插件后,鼠标右键点击链接下载~
" + '
>视频地址<') + ("dash" === config_config.format ? '
>音频地址<') : "");
MessageBox_alert(msg);
} else if ("aria" === type) {
var _ref4 = [ $("#video_url").attr("href"), $("#video_url_2").attr("href") ], _video_url = _ref4[0], _video_url_ = _ref4[1], video_title = video.base().filename(), _file_name = video_title + Download.url_format(_video_url), _file_name_ = video_title + ".m4a", aria2c_header = '--header "User-Agent: '.concat(window.navigator.userAgent, '" --header "Referer: ').concat(window.location.href, '"'), _ref6 = main_slicedToArray({
min: [ 1, 5 ],
mid: [ 16, 8 ],
max: [ 32, 16 ]
}[config_config.aria2c_connection_level] || [ 1, 5 ], 2), url_max_connection = _ref6[0], server_max_connection = _ref6[1], aria2c_max_connection_parameters = "--max-concurrent-downloads ".concat(url_max_connection, " --max-connection-per-server ").concat(server_max_connection), _map = [ 'aria2c "'.concat(_video_url, '" --out "').concat(_file_name, '"'), 'aria2c "'.concat(_video_url_, '" --out "').concat(_file_name_, '"') ].map((function(code) {
return "".concat(code, " ").concat(aria2c_header, " ").concat(aria2c_max_connection_parameters, " ").concat(config_config.aria2c_addition_parameters);
})), _map2 = main_slicedToArray(_map, 2), code = _map2[0], code_2 = _map2[1], _msg = "点击文本框即可复制下载命令!
" + '视频:
') + ("dash" === config_config.format ? '音频:
') + '全部:
") : "");
!window.bp_clip_btn && (window.bp_clip_btn = function(id) {
$("#".concat(id)).select(), document.execCommand("copy") ? Message_success("复制成功") : Message_warning("复制失败");
}), MessageBox_alert(_msg);
} else {
var url = $("#video_url").attr("href"), filename = video.base().filename() + Download.url_format(url);
Download.download(url, filename, type);
}
},
video_download_2: function video_download_2() {
var type = config_config.download_type;
if ("web" === type) $("#video_url_2")[0].click(); else if ("a" === type) $("#video_download").click(); else if ("aria" === type) $("#video_download").click(); else {
var url = $("#video_url_2").attr("href"), filename = video.base().filename() + ".m4a";
Download.download(url, filename, type);
}
}
};
window.bpd = evt, Object.entries(evt).forEach((function(_ref7) {
var _ref8 = main_slicedToArray(_ref7, 2), k = _ref8[0], v = _ref8[1];
return $("body").on("click", "#".concat(k), v);
})), $("body").on("click", "a.router-link-active", (function() {
this !== $('li[class="on"]').find("a")[0] && check.refresh();
})), $("body").on("click", "li.ep-item", (function() {
check.refresh();
})), $("body").on("click", "button.bilibili-player-iconfont-next", (function() {
check.refresh();
}));
var bili_video_tag = player.bili_video_tag();
$(bili_video_tag)[0] && ($(bili_video_tag)[0].onended = function() {
check.refresh();
}), $("body").on("click", "li.bui-select-item", (function() {
check.refresh();
})), setInterval((function() {
(check.q !== video.get_quality().q || "cheese" === video.type() && check.epid !== video.base().epid()) && check.refresh();
}), 1e3), $("body").on("click", ".rec-list", (function() {
check.refresh();
})), $("body").on("click", ".bilibili-player-ending-panel-box-videos", (function() {
check.refresh();
})), setInterval((function() {
var vb = video.base();
check.aid === vb.aid() && check.cid === vb.cid() || check.refresh();
}), 3e3);
}
} ]), Main;
}(), main = Main;
window.bp_fun_locked || (window.bp_fun_locked = !0, $(".error-text")[0] || setTimeout((function() {
(new main).run();
}), 6e3));
}();