// ==UserScript==
// @name bilibili视频下载
// @namespace https://github.com/injahow
// @version 2.0.1
// @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/medialist/play/*
// @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
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/flv.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/DPlayer.min.js
// @icon https://static.hdslb.com/images/favicon.ico
// @compatible chrome
// @compatible firefox
// @grant none
// ==/UserScript==
/* eslint-disable */ /* spell-checker: disable */
// @[ You can find all source codes in GitHub repo ]
!function(){"use strict";function e(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var t=new(function(){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.prefix="bp_"}var i,n,o;return i=t,(n=[{key:"get",value:function(e){return localStorage.getItem(this.prefix+(e||""))||""}},{key:"set",value:function(e,t){return localStorage.setItem(this.prefix+(e||""),t)}}])&&e(i.prototype,n),o&&e(i,o),Object.defineProperty(i,"prototype",{writable:!1}),t}());function i(){return location.pathname.match("/cheese/play/")?"cheese":location.pathname.match("/medialist/play/")?"medialist":window.__INITIAL_STATE__?window.__INITIAL_STATE__.epInfo?"bangumi":window.__INITIAL_STATE__.videoData?"video":void 0:"?"}var n={"1080P 高码率":112,"1080P 高清":80,"720P 高清":64,"480P 清晰":32,"360P 流畅":16,"自动":64};var o={type:i,base:function(){var e=i();if("video"===e){var t=window.__INITIAL_STATE__;return{type:"video",total:function(){return t.videoData.pages.length||1},title:function(e){var i=e||t.p||1;return(t.videoData.pages[i-1].part||"unknown").replace(/[\/\\:*?"<>|]+/g,"")},filename:function(e){var i=e||t.p||1;return((t.videoData&&t.videoData.title||"unknown")+" P".concat(i," (").concat(t.videoData.pages[i-1].part||i,")")).replace(/[\/\\:*?"<>|]+/g,"")},aid:function(e){return t.videoData.aid},p:function(){return t.p||1},cid:function(e){var i=e||t.p||1;return t.videoData.pages[i-1].cid},epid:function(e){return""},need_vip:function(){return!1},vip_need_pay:function(){return!1},is_limited:function(){return!1}}}if("medialist"===e){var n=$("div.player-auxiliary-playlist-item"),o=$("div.player-auxiliary-playlist-item.player-auxiliary-playlist-item-active").index(),a=$(".player-auxiliary-playlist-top .player-auxiliary-filter-title").html();return{type:"video",total:function(){return n.length},title:function(e){var t=e?e-1:o,i=n.eq(t).find(".player-auxiliary-playlist-item-title").attr("title")||"unknown";return i.replace(/[\/\\:*?"<>|]+/g,"")},filename:function(e){var t=e?e-1:o,i=n.eq(t).find(".player-auxiliary-playlist-item-title").attr("title")||"unknown";return"".concat(a," P").concat(t+1," (").concat(i,")").replace(/[\/\\:*?"<>|]+/g,"")},aid:function(e){var t=e?e-1:o;return n.eq(t).attr("data-aid")},p:function(){return o+1},cid:function(e){var t=e?e-1:o;return n.eq(t).attr("data-cid")},epid:function(e){return""},need_vip:function(){return!1},vip_need_pay:function(){return!1},is_limited:function(){return!1}}}if("bangumi"===e){var r=window.__INITIAL_STATE__;return{type:"bangumi",total:function(){return r.epList.length},title:function(e){var t=e?r.epList[e-1]:r.epInfo;return("".concat(t.titleFormat," ").concat(t.longTitle)||"unknown").replace(/[\/\\:*?"<>|]+/g,"")},filename:function(e){if(e){var t=r.epList[e-1];return("".concat(r.mediaInfo.season_title,":").concat(t.titleFormat," ").concat(t.longTitle)||"unknown").replace(/[\/\\:*?"<>|]+/g,"")}return(r.h1Title||"unknown").replace(/[\/\\:*?"<>|]+/g,"")},aid:function(e){return e?r.epList[e-1].aid:r.epInfo.aid},p:function(){return r.epInfo.i||1},cid:function(e){return e?r.epList[e-1].cid:r.epInfo.cid},epid:function(e){return e?r.epList[e-1].id:r.epInfo.id},need_vip:function(){return"会员"===r.epInfo.badge},vip_need_pay:function(){return r.epPayMent.vipNeedPay},is_limited:function(){return r.userState.areaLimit}}}if("cheese"===e){var l=(location.href.match(/\/cheese\/play\/ep(\d+)/i)||["",""])[1];window.bp_episodes||(window.bp_episodes=[],N.get_season(l));var c=window.bp_episodes,s=$("li.on.list-box-li").index();return{type:"cheese",total:function(){return c.length},title:function(e){return(c[e?e-1:s].title||"unknown").replace(/[\/\\:*?"<>|]+/g,"")},filename:function(e){var t=e?e-1:s;return"".concat($("div.season-info h1").html()," P").concat(t+1," (").concat(c[t].title||"unknown",")").replace(/[\/\\:*?"<>|]+/g,"")},aid:function(e){return c[e?e-1:s].aid},p:function(){return s+1},cid:function(e){return c[e?e-1:s].cid},epid:function(e){return c[e?e-1:s].id},need_vip:function(){return!1},vip_need_pay:function(){return!1},is_limited:function(){return!1}}}return{type:"?",total:function(){return 0},title:function(e){return""},filename:function(e){return""},aid:function(e){return""},p:function(){return 1},cid:function(e){return""},epid:function(e){return""},need_vip:function(){return!1},vip_need_pay:function(){return!1},is_limited:function(){return!1}}},get_quality:function(){var e=0,t=0;return $("li.bui-select-item")[0]&&(t=parseInt($("li.bui-select-item")[0].dataset.value))?e=parseInt($("li.bui-select-item.bui-select-item-active").attr("data-value"))||(t>80?80:t):$("li.squirtle-select-item")[0]&&(t=parseInt($("li.squirtle-select-item")[0].dataset.value))?e=parseInt($("li.squirtle-select-item.active").attr("data-value"))||(t>80?80:t):$("div.edu-player-quality-item")[0]?(e=n[$("div.edu-player-quality-item.active span").text()||"自动"]||80,t=n[$("div.edu-player-quality-item span").text()||"自动"]||80):e=t=80,{q:e,q_max:t}},get_quality_support:function(){var e,t=[];return"cheese"===i()?((e=$("div.edu-player-quality-item span")).each((function(){if("自动"===$(this).text())return!1;t.push(n[$(this).text()])})),t.length?t:["80","64","32","16"]):($("ul.squirtle-select-list")[0]?e=$("li.squirtle-select-item"):$("ul.bui-select-list")[0]&&(e=$("li.bui-select-item")),e&&e.length?(e.each((function(){var e="".concat($(this).attr("data-value"));if("0"===e)return!1;t.push(e)})),t):["80","64","32","16"])}};var a={show:function(){$("div#bp_config").is(":hidden")&&$("div#message_box").is(":hidden")&&$("body").css("overflow","auto")},hide:function(){$("body").css("overflow","hidden")}};function r(e,t){"confirm"===t?$('div.message_box_btn button[name="cancel"]').show():"alert"===t&&$('div.message_box_btn button[name="cancel"]').hide(),e.html?$("div#message_box_context").html('<div style="font-size:18px">'.concat(e.html,"</div>")):$("div#message_box_context").html('<div style="font-size:18px">╰( ̄▽ ̄)╮</div>'),a.hide(),$("#message_box").show(),$("div#message_box").animate({opacity:"1"},300),$('div.message_box_btn button[name="affirm"]')[0].onclick=function(){$("div#message_box").hide(),$("div#message_box").css("opacity",0),a.show(),e.callback&&e.callback.affirm&&e.callback.affirm()},$('div.message_box_btn button[name="cancel"]')[0].onclick=function(){$("div#message_box").hide(),$("div#message_box").css("opacity",0),a.show(),e.callback&&e.callback.cancel&&e.callback.cancel()}}var l=0;function c(e,t){(function(e,t){$("div.message-bg").append(e),$("div#message-".concat(t)).animate({"margin-top":"+=70px",opacity:"1"},300)})('<div id="message-'.concat(l+=1,'" class="message message-').concat(t,'"><div class="message-context"><p><strong>').concat(t,":</strong></p><p>").concat(e,"</p></div></div>"),l),function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;setTimeout((function(){var t="div#message-".concat(e);$(t).animate({"margin-top":"-=70px",opacity:"0"},300,(function(){$(t).remove()}))}),1e3*t)}(l,3)}var s=function(e){return c(e,"success")},d=function(e){return c(e,"warning")},u=function(e){return c(e,"danger")},p=function(e){return c(e,"info")},f=function(e){return c("(^・ω・^)~喵喵喵~","info")},b=function(e,t){return r({html:e,callback:{affirm:t}},"alert")},_=function(e,t,i){return r({html:e,callback:{affirm:t,cancel:i}},"confirm")};function v(e){return new Promise((function(t,i){e.success=function(e){e.code&&d("请求失败,".concat(e.message||"CODE:".concat(e.code))),t(e)},e.error=function(e){u("网络异常"),i(e)},$.ajax(e)}))}function h(e,t){t?v({url:"https://api.bilibili.com/x/v1/dm/list.so?oid=".concat(t),dataType:"text"}).then((function(t){var i=$(t.replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g,""));if(i)if(i.find("d")[0]){var n=i.find("d").map((function(e,t){var i=$(t),n=i.attr("p").split(","),o=0;return"4"===n[1]?o=2:"5"===n[1]&&(o=1),[{author:"",time:parseFloat(n[0]),type:o,color:parseInt(n[3]),id:"",text:i.text()}]})).get();e.success(n),setTimeout((function(){w()}),100)}else e.error("未发现弹幕");else e.error("弹幕获取失败")})).catch((function(t){e.error("弹幕请求异常")})):e.error("cid未知,无法获取弹幕")}function m(){return $("bwp-video")[0]?"bwp-video":$('video[class!="dplayer-video dplayer-video-current"]')[0]?'video[class!="dplayer-video dplayer-video-current"]':void 0}function y(){var e=$(m())[0];e&&(e.pause(),e.currentTime=0)}function g(){if(window.bp_dplayer){var e=$(m())[0];e&&e.removeEventListener("play",y,!1),window.bp_dplayer.destroy(),window.bp_dplayer=null,$("#bp_dplayer").remove(),window.bp_dplayer_2&&(window.bp_dplayer_2.destroy(),window.bp_dplayer_2=null,$("#bp_dplayer_2").remove()),$($("#bilibiliPlayer")[0]?"#bilibiliPlayer":$("#bilibili-player")[0]?"#bilibili-player":"cheese"===o.type()?$('div.bpx-player[data-injector="nano"]')[0]?'div.bpx-player[data-injector="nano"]':"#pay-mask":void 0).show()}}function w(){var e=""+'<style id="dplayer_danmaku_style">\n .dplayer-danmaku .dplayer-danmaku-right.dplayer-danmaku-move {\n animation-duration: '.concat(parseFloat(C.danmaku_speed),"s;\n font-size: ").concat(parseInt(C.danmaku_fontsize),"px;\n }\n </style>");$("#dplayer_danmaku_style")[0]&&$("#dplayer_danmaku_style").remove(),$("body").append(e)}var k={bili_video_tag:m,recover_player:g,replace_player:function(e,t){g();var i,n=$(m())[0];y(),n&&n.addEventListener("play",y,!1),$("#bilibiliPlayer")[0]?(i="#bilibiliPlayer",$(i).before('<div id="bp_dplayer" class="bilibili-player relative bilibili-player-no-cursor">'),$(i).hide()):$("#bilibili-player")[0]?(i="#bilibili-player",$(i).before('<div id="bp_dplayer" class="bilibili-player relative bilibili-player-no-cursor" style="width:100%;height:100%;"></div>'),$(i).hide()):"cheese"===o.type()&&($('div.bpx-player[data-injector="nano"]')[0]?($("#pay-mask").hide(),$("#bofqi").show(),i='div.bpx-player[data-injector="nano"]',$(i).before('<div id="bp_dplayer" style="width:100%;height:100%;"></div>'),$(i).hide()):(i="#pay-mask",$(i).html('<div id="bp_dplayer" style="width:100%;height:100%;"></div>'))),$("#player_mask_module").hide(),N.get_subtitle_url(0,(function(){var i=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:e,type:"auto"},subtitle:{url:i,type:"webvtt",fontSize:"35px",bottom:"5%",color:"#fff"},danmaku:!0,apiBackend:{read:function(e){h(e,o.base().cid())},send:function(e){e.error("此脚本无法将弹幕同步到云端")}},contextmenu:[{text:"脚本信息",link:"https://github.com/injahow/user.js"},{text:"脚本作者",link:"https://injahow.com"}]}),"dash"===C.format&&t&&"#"!==t){$("body").append('<div id="bp_dplayer_2" style="display:none;"></div>'),window.bp_dplayer_2=new DPlayer({container:$("#bp_dplayer_2")[0],mutex:!1,volume:1,autoplay:!0,video:{url:t,type:"auto"}});var n=[window.bp_dplayer,window.bp_dplayer_2],a=n[0],r=n[1];a.on("play",(function(){!a.paused&&r.play()})),a.on("playing",(function(){!a.paused&&r.play()})),a.on("timeupdate",(function(){Math.abs(a.video.currentTime-r.video.currentTime)>1&&(r.pause(),r.seek(a.video.currentTime)),!a.paused&&r.play()})),a.on("seeking",(function(){r.pause(),r.seek(a.video.currentTime)})),a.on("waiting",(function(){r.pause(),r.seek(a.video.currentTime)})),a.on("pause",(function(){r.pause(),r.seek(a.video.currentTime)})),a.on("suspend",(function(){r.speed(a.video.playbackRate)})),a.on("volumechange",(function(){r.volume(a.video.volume),r.video.muted=a.video.muted}))}}))},danmaku:{config:w}};function x(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var F=new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.aid="",this.cid="",this.q="",this.epid=""}var t,i,n;return t=e,(i=[{key:"refresh",value:function(){console.log("refresh..."),$("#video_download").hide(),$("#video_download_2").hide(),k.recover_player();var e=o.base();this.aid=e.aid(),this.cid=e.cid(),this.epid=e.epid(),this.q=o.get_quality().q,window.bp_episodes=null}}])&&x(t.prototype,i),n&&x(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}());function S(e,t){var i="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!i){if(Array.isArray(e)||(i=function(e,t){if(!e)return;if("string"==typeof e)return T(e,t);var i=Object.prototype.toString.call(e).slice(8,-1);"Object"===i&&e.constructor&&(i=e.constructor.name);if("Map"===i||"Set"===i)return Array.from(e);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return T(e,t)}(e))||t&&e&&"number"==typeof e.length){i&&(e=i);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}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 a,r=!0,l=!1;return{s:function(){i=i.call(e)},n:function(){var e=i.next();return r=e.done,e},e:function(e){l=!0,a=e},f:function(){try{r||null==i.return||i.return()}finally{if(l)throw a}}}}function T(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i<t;i++)n[i]=e[i];return n}function I(){return C.rpc_domain.match("https://")||C.rpc_domain.match(/localhost|127\.0\.0\.1/)?"post":"ariang"}var j=!1;function P(e){var t=e?"#!/settings/rpc/set/".concat(e.domain.replace("://","/"),"/").concat(e.port,"/jsonrpc/").concat(window.btoa(e.token)):"",i=C.ariang_host+t,n=document.createElement("a");n.setAttribute("target","_blank"),n.setAttribute("onclick","window.bp_aria2_window=window.open('".concat(i,"');")),document.body.appendChild(n),n.click(),n.remove()}var q=!1,R=!0;function L(e,t){if(q)return f(),void(R=!0);var i=new XMLHttpRequest;i.open("get",e),i.responseType="blob",i.onload=function(){if(200===this.status||304===this.status){if("msSaveOrOpenBlob"in navigator)return void navigator.msSaveOrOpenBlob(this.response,t);var e=URL.createObjectURL(this.response),i=document.createElement("a");i.style.display="none",i.href=e,i.download=t,document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(e)}},R=!0,i.onprogress=function(e){if(4!=this.state){var t=e.loaded,i=e.total;!function(e){var t=e.total,i=e.loaded,n=e.percent;R&&b("文件大小:".concat(Math.floor(t/1048576),"MB(").concat(t,"Byte)<br/>")+"已经下载:".concat(Math.floor(i/1048576),"MB(").concat(i,"Byte)<br/>")+"当前进度:".concat(n,"%<br/>下载中请勿操作浏览器!"),(function(){R=!1,b("注意:刷新或离开页面会导致下载取消!<br/>再次点击下载按钮可查看下载进度。")})),t===i&&(b("下载完成,请等待浏览器保存!"),q=!1)}({total:i,loaded:t,percent:Math.floor(100*t/i)})}},i.send(),q=!0,p("准备开始下载")}function A(e){return e.match(".flv")?".flv":e.match(".m4s")?"_video.mp4":(e.match(".mp4"),".mp4")}var O={url_format:A,download:function(e,t,i){var n=t.replace(/[\/\\:*?"<>|]+/g,"")+A(e);"blob"===i?L(e,n):"rpc"===i&&function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"post";if(j)f();else{j=!0;var n={domain:C.rpc_domain,port:C.rpc_port,token:C.rpc_token,dir:C.rpc_dir},o={id:window.btoa("BParse_".concat(Date.now(),"_").concat(Math.random())),jsonrpc:"2.0",method:"aria2.addUri",params:["token:".concat(n.token),[e],{dir:n.dir,out:t,header:["User-Agent: ".concat(window.navigator.userAgent),"Referer: ".concat(window.location.href)]}]};if(p("发送RPC下载请求"),"post"===i)v({url:"".concat(n.domain,":").concat(n.port,"/jsonrpc"),type:"POST",dataType:"json",data:JSON.stringify(o)}).then((function(e){e.result?s("RPC请求成功"):d("请检查RPC参数")})).catch((function(e){u("请检查RPC服务配置")})).finally((function(e){return j=!1}));else if("ariang"===i){var a=window.bp_aria2_window,r=100;a&&!a.closed||(P(),r=3e3),setTimeout((function(){var i=window.bp_aria2_window,n="header=User-Agent:".concat(window.navigator.userAgent,"&header=Referer:").concat(window.location.href),o="#!/new/task?url=".concat(window.btoa(e),"&out=").concat(encodeURIComponent(t),"&").concat(n);i&&!i.closed?(i.location.href=C.ariang_host+o,s("RPC请求发送成功")):d("AriaNG页面未打开"),j=!1}),r)}}}(e,n,I())},download_all:function(){var e=o.base(),t=[o.get_quality().q,e.total()],i=t[0],n=t[1];$("body").on("click",'input[name="dl_video"]',(function(){$(this).is(":checked")?$(this).parent().css("color","rgba(0,0,0,1)"):$(this).parent().css("color","rgba(0,0,0,0.5)")}));for(var a="",r=0;r<n;r++)a+=""+'<label for="option_'.concat(r,'"><div style="color:rgba(0,0,0,0.5);">\n <input type="checkbox" id="option_').concat(r,'" name="dl_video" value="').concat(r,'">\n P').concat(r+1," ").concat(e.title(r+1),"\n </div></label>");var l=!1;$("body").on("click","button#checkbox_btn",(function(){l?(l=!1,$('input[name="dl_video"]').prop("checked",l),$('input[name="dl_video"]').parent().css("color","rgba(0,0,0,0.5)")):(l=!0,$('input[name="dl_video"]').prop("checked",l),$('input[name="dl_video"]').parent().css("color","rgb(0,0,0)"))}));var c,f={120:"4K 超清",116:"1080P 60帧",112:"1080P 高码率",80:"1080P 高清",74:"720P 60帧",64:"720P 高清",48:"720P 高清(MP4)",32:"480P 清晰",16:"360P 流畅"},h="",m=S(o.get_quality_support());try{for(m.s();!(c=m.n()).done;){var y=c.value;h+='<option value="'.concat(y,'">').concat(f[y],"</option>")}}catch(e){m.e(e)}finally{m.f()}var g=""+'<div style="margin:2% 0;">\n <label>视频格式:</label>\n <select id="dl_format">\n <option value="flv" selected>FLV</option>\n <option value="mp4">MP4</option>\n </select>\n 仅video类型支持mp4\n </div>\n <div style="margin:2% 0;">\n <label>视频质量:</label>\n <select id="dl_quality">\n '.concat(h,'\n </select>\n </div>\n <div style="margin:2% 0;">\n <label>下载字幕:</label>\n <select id="dl_subtitle">\n <option value="0" selected>关闭</option>\n <option value="1">VTT</option>\n </select>\n  \n <label>下载弹幕:</label>\n <select id="dl_danmaku">\n <option value="0" selected>关闭</option>\n <option value="1">ASS</option>\n </select>\n </div>\n <b>\n <span style="color:red;">为避免请求被拦截,设置了延时且不支持下载无法播放的视频;请勿频繁下载过多视频,可能触发风控导致不可再下载!</span>\n </b><br />\n <div style="height:220px;width:100%;overflow:auto;background:rgba(0,0,0,0.1);">\n ').concat(a,"\n </div>\n <div>").concat("medialist"===o.type()?"不支持多页视频,若需要请到视频原播放页面下载":"",'</div>\n <div style="margin:2% 0;">\n <button id="checkbox_btn">全选</button>\n </div>');function w(e,t,i){if(e.length)if(t<e.length){var n=e[t];"1"===n.dl_subtitle&&O.download_subtitle_vtt(n.p,n.filename),"1"===n.dl_danmaku&&O.download_danmaku_ass(n.cid,n.filename);var o="第".concat(t+1,"(").concat(t+1,"/").concat(e.length,")个视频");b("".concat(o,":获取中...")),setTimeout((function(){N.get_urls(n.p,n.q,n.format,(function(a){if(!a.code){s("请求成功"+(a.times?"<br/>今日剩余请求次数".concat(a.times):"")),b("".concat(o,":获取成功!"));var r=[a.url,A(a.url),I()],l=r[0],c=r[1],u=r[2];"post"===u?(i.push({url:l,filename:n.filename+c}),i.length>3&&(k(i),i.length=0)):"ariang"===u&&function(e){var t=window.bp_aria2_window,i=100;t&&!t.closed||(P(),i=3e3);setTimeout((function(){var t=window.bp_aria2_window,i="header=User-Agent:".concat(window.navigator.userAgent,"&header=Referer:").concat(window.location.href);if(t&&!t.closed){var n="#!/new/task?url=".concat(window.btoa(e.url),"&out=").concat(encodeURIComponent(e.filename),"&").concat(i);t.location.href=C.ariang_host+n,s("RPC请求成功")}else d("请检查RPC参数")}),i)}({url:l,filename:n.filename+c})}setTimeout((function(){w(e,++t,i)}),3e3)}),(function(){w(e,++t,i)}))}),3e3)}else b("视频地址请求完成!"),"post"===I()&&i.length>0&&(k(i),i.length=0)}function k(e){var t,i={domain:C.rpc_domain,port:C.rpc_port,token:C.rpc_token,dir:C.rpc_dir},n=[],o=S(e);try{for(o.s();!(t=o.n()).done;){var a=t.value;n.push({id:window.btoa("BParse_".concat(Date.now(),"_").concat(Math.random())),jsonrpc:"2.0",method:"aria2.addUri",params:["token:".concat(i.token),[a.url],{dir:i.dir,out:a.filename,header:["User-Agent: ".concat(window.navigator.userAgent),"Referer: ".concat(window.location.href)]}]})}}catch(e){o.e(e)}finally{o.f()}p("发送RPC下载请求"),v({url:"".concat(i.domain,":").concat(i.port,"/jsonrpc"),type:"POST",dataType:"json",data:JSON.stringify(n)}).then((function(e){e.length===n.length?s("RPC请求成功"):d("请检查RPC参数")})).catch((function(e){u("请检查RPC服务配置")}))}_(g,(function(){for(var t=$("#dl_quality").val()||i,o=$("#dl_subtitle").val(),a=$("#dl_danmaku").val(),r=[],l=0;l<n;l++)if($("input#option_".concat(l)).is(":checked")){var c=l+1,s=[e.cid(c),e.filename(c)],d=s[0],u=s[1],p=$("#dl_format").val();r.push({dl_subtitle:o,dl_danmaku:a,cid:d,p:c,q:t,format:p,filename:u})}w(r,0,[])})),$("#dl_quality").val(i>120?80:i)},download_danmaku_ass:function(e,t){v({url:"https://api.bilibili.com/x/v1/dm/list.so?oid=".concat(e),dataType:"text"}).then((function(e){var i=$(e.replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g,""));if(i&&i.find("d")[0]){var n=i.find("d").map((function(e,t){var i=$(t),n=i.attr("p").split(","),o=0;return"4"===n[1]?o=2:"5"===n[1]&&(o=1),[{time:parseFloat(n[0]),type:o,color:parseInt(n[3]),text:i.text()}]})).get();n.sort((function(e,t){return e.time-t.time}));var o,a=function(e,t,i){var n,o,a,r,l=e.text,c=e.time,s=[0===e.type?(o=50*(1+Math.floor(15*Math.random())),a=1920+50*e.text.length/2,r=0-50*e.text.length/2,"\\move(".concat(a,",").concat(o,",").concat(r,",").concat(o,")")):function(e,t){return"\\pos(".concat(t,",").concat(e,")")}(50*(1+i%15),960),(n=e.color,16777215===n?"":function(e){return"\\c&H".concat(((255&e)<<16|(e>>8&255)<<8|e>>16&255).toString(16),"&")}(e.color))],d=function(e){var t=function(e,t){return Math.floor(e/t)},i=function(e){return e<10?"0"+e:""+e},n=Math.floor(e),o=t(n,3600),a=t(n,60)%60,r=n%60,l=Math.floor(100*(e-n));return"".concat(o,":").concat(i(a),":").concat(i(r),".").concat(l)},u=[0,d(c),d(c+(0===e.type?8:4)),"Medium","","0","0","0","","{"+s.join("")+"}"+function(e){return e.replace(/\{/g,"{").replace(/\}/g,"}").replace(/\r|\n/g,"")}(l)];return"Dialogue: "+u.join(",")},r=["[Script Info]","; Script generated by bilibili-parse","; https://github.com/injahow/bilibili-parse","Title: ".concat(t),"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"],l=0,c=S(n);try{for(c.s();!(o=c.n()).done;){var s=o.value;0===s.type?0:l++,r.push(a(s,0,l))}}catch(e){c.e(e)}finally{c.f()}var u=URL.createObjectURL(new Blob([r.join("\n")],{type:"text/ass"})),p=document.createElement("a");p.style.display="none",p.href=u,p.download=t+".ass",document.body.appendChild(p),p.click(),p.remove(),URL.revokeObjectURL(u)}else d("未发现弹幕")})).catch((function(e){d("未发现字幕")}))},download_subtitle_vtt:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1?arguments[1]:void 0,i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e){var i=document.createElement("a");i.setAttribute("target","_blank"),i.setAttribute("href",e),i.setAttribute("download",t+".vtt"),document.body.appendChild(i),i.click(),i.remove(),URL.revokeObjectURL(e)}else d("未发现字幕")};N.get_subtitle_url(e,i)},open_ariang:P},z='<div id="bp_config"> <div class="bp_config_bg"> <span style="font-size:20px"> <b>bilibili视频下载 参数设置</b> <b> <a href="javascript:;" onclick="bp_reset_config()"> [重置配置] </a> <a style="text-decoration:underline" href="javascript:;" onclick="bp_show_help()"><通知&帮助></a> </b> </span> <div style="margin:2% 0"><label>请求地址:</label> <input id="base_api" value="..." style="width:30%"> <label>请求方式:</label> <select id="request_type"> <option value="auto">自动判断</option> <option value="local">本地请求</option> <option value="online">远程请求</option> </select><br/> <small>注意:普通使用请勿修改;默认使用混合请求</small> </div> <div style="margin:2% 0"><label>视频格式:</label> <select id="format"> <option value="flv">FLV</option> <option value="dash">DASH</option> <option value="mp4">MP4</option> </select> <label>切换CDN:</label> <select id="host_key"> ${host_key_option} </select><br/> <small>注意:仅video支持MP4;建议特殊地区或网络受限时切换(自行选择合适线路)</small> </div> <div style="margin:2% 0"><label>下载方式:</label> <select id="download_type"> <option value="a">URL链接</option> <option value="web">Web浏览器</option> <option value="blob">Blob请求</option> <option value="rpc">RPC接口</option> <option value="aria">Aria命令</option> </select> <label>AriaNg地址:</label> <input id="ariang_host" value="..." style="width:30%"><br/> <small>提示:url和web方式不会设置文件名</small> </div> <div style="margin:2% 0"><label>RPC配置:[ 域名 : 端口 | 密钥 | 保存目录 ]</label><br/> <input id="rpc_domain" value="..." style="width:25%"> : <input id="rpc_port" value="..." style="width:10%"> | <input id="rpc_token" placeholder="没有密钥不用填" value="..." style="width:15%"> | <input id="rpc_dir" placeholder="留空使用默认目录" value="..." style="width:20%"><br/> <small>注意:RPC默认使用Motrix(需要安装并运行)下载,其他软件请修改参数</small> </div> <div style="margin:2% 0"> <label>强制换源:</label> <select id="replace_force"> <option value="0">关闭</option> <option value="1">开启</option> </select> <label>弹幕速度:</label> <input id="danmaku_speed" value="..." style="width:5%"> s <label>弹幕字号:</label> <input id="danmaku_fontsize" value="..." style="width:5%"> px <br/> <small>说明:使用请求到的视频地址在DPlayer进行播放;弹幕速度为弹幕滑过DPlayer的时间</small> </div> <div style="margin:2% 0"><label>自动下载:</label> <select id="auto_download"> <option value="0">关闭</option> <option value="1">开启</option> </select><br/> <small>说明:请求地址成功后将自动点击下载视频按钮</small> </div> <div style="margin:2% 0"><label>授权状态:</label> <select id="auth" disabled="disabled"> <option value="0">未授权</option> <option value="1">已授权</option> </select> <a class="setting-context" href="javascript:;" onclick="bp_show_login()">账号授权</a> <a class="setting-context" href="javascript:;" onclick="bp_show_logout()">取消授权</a> <a class="setting-context" href="javascript:;" onclick=\'bp_show_login("0")\'>手动授权</a> <a class="setting-context" href="javascript:;" onclick="bp_show_login_help()">这是什么?</a> </div> <div style="text-align:right"><br/> <button class="setting-button" onclick="bp_save_config()">确定</button> </div> </div> <style>#bp_config{opacity:0;display:none;position:fixed;inset:0px;top:0;left:0;width:100%;height:100%;z-index:10000}.bp_config_bg{position:absolute;background:#fff;border-radius:10px;padding:20px;top:50%;left:50%;transform:translate(-50%,-50%);width:600px;box-shadow:rgb(0 0 0 / 70%) 0 0 0 1000px}.setting-button{width:120px;height:40px;border-width:0;border-radius:3px;background:#1e90ff;cursor:pointer;outline:0;color:#fff;font-size:17px}.setting-button:hover{background:#59f}.setting-context{margin:0 1%;color:#00f}.setting-context:hover{color:red}</style> </div> ',C={base_api:"https://api.injahow.cn/bparse/",request_type:"auto",format:"flv",host_key:"0",replace_force:"0",auth:"0",download_type:"web",rpc_domain:"http://localhost",rpc_port:"16800",rpc_token:"",rpc_dir:"D:/",ariang_host:"http://ariang.injahow.com/",auto_download:"0",danmaku_speed:"15",danmaku_fontsize:"22"},E={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"};function U(){var e=Object.assign({},C),i=t.get("config_str")||localStorage.getItem("my_config_str");if(i){var n=JSON.parse(i);for(var o in n)Object.hasOwnProperty.call(C,o)&&(C[o]=n[o])}else t.set("config_str",JSON.stringify(C)),localStorage.setItem("my_config_str",JSON.stringify(C));window.bp_save_config=function(){for(var e in C)C[e]=$("#".concat(e)).val();var i=JSON.parse(t.get("config_str")||localStorage.getItem("my_config_str"));t.set("config_str",JSON.stringify(C)),localStorage.setItem("my_config_str",JSON.stringify(C)),$("#bp_config").hide(),$("#bp_config").css("opacity",0),a.show();for(var n=0,o=["base_api","format","auth"];n<o.length;n++){var r=o[n];if(C[r]!==i[r]){$("#video_download").hide(),$("#video_download_2").hide();break}}C.host_key!==i.host_key&&(F.refresh(),$("#video_url").attr("href","#"),$("#video_url_2").attr("href","#")),C.rpc_domain!==i.rpc_domain&&(C.rpc_domain.match("https://")||C.rpc_domain.match(/(localhost|127\.0\.0\.1)/)||b("检测到当前RPC不是localhost本地接口,即将跳转到AriaNg网页控制台页面;请查看控制台RPC接口参数是否正确,第一次加载可能较慢请耐心等待;配置好后即可使用脚本进行远程下载<br/>使用期间不用关闭控制台页面!",(function(){O.open_ariang({domain:C.rpc_domain,port:C.rpc_port,token:C.rpc_token})})));for(var l=0,c=["danmaku_speed","danmaku_fontsize"];l<c.length;l++){var s=c[l];if(C[s]!==i[s]){k.danmaku.config();break}}},window.onbeforeunload=function(){window.bp_save_config();var e=window.bp_aria2_window;e&&!e.closed&&e.close()};var r=!1;for(var l in window.bp_show_help=function(){r?f():(r=!0,v({url:"".concat(C.base_api,"/auth/v2/?act=help"),dataType:"text"}).then((function(e){e?b(e):d("获取失败")})).finally((function(e){return r=!1})))},!window.bp_reset_config&&(window.bp_reset_config=function(){for(var t in e)"auth"!==t&&$("#".concat(t)).val(e[t])}),z=z.replace("${host_key_option}",function(){for(var e=Object.keys(E),t='<option value="0">关闭</option>',i=0,n=e;i<n.length;i++){var o=n[i];t+='<option value="'.concat(o,'">').concat(E[o],"</option>")}return t}()),$("body").append(z),C)$("#".concat(l)).val(C[l])}function M(e,t){var i="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!i){if(Array.isArray(e)||(i=function(e,t){if(!e)return;if("string"==typeof e)return B(e,t);var i=Object.prototype.toString.call(e).slice(8,-1);"Object"===i&&e.constructor&&(i=e.constructor.name);if("Map"===i||"Set"===i)return Array.from(e);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return B(e,t)}(e))||t&&e&&"number"==typeof e.length){i&&(e=i);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}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 a,r=!0,l=!1;return{s:function(){i=i.call(e)},n:function(){var e=i.next();return r=e.done,e},e:function(e){l=!0,a=e},f:function(){try{r||null==i.return||i.return()}finally{if(l)throw a}}}}function B(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i<t;i++)n[i]=e[i];return n}function D(e,i,n,a,r,l){"function"!=typeof a&&(a=function(e){return console.log(e)}),"function"!=typeof r&&(r=function(e){return console.error(e)});var c=o.base(),s=[c.aid(e),c.cid(e),c.epid(e),i||o.get_quality().q,c.type],d=s[0],u=s[1],p=s[2],f=s[3],b=s[4],_=n||C.format;"mp4"===_&&"video"!==b&&(_="flv");var h,m=function(e){if("0"!==C.host_key&&"online"===l&&"mp4"!==_){var t=e.split("/");t[2]=E[C.host_key],e=t.join("/")}return e},y={type:"GET",dataType:"json"};if("auto"===l||"local"===l){var g,w;"cheese"!==b?(h="https://api.bilibili.com/x/player/playurl","dash"===_?(g=0,w=80):(g=0,w=0)):(h="https://api.bilibili.com/pugv/player/web/playurl","dash"===_?(g=0,w=80):(g=1,w=80)),h+="?avid=".concat(d,"&cid=").concat(u,"&qn=").concat(f,"&fnver=").concat(g,"&fnval=").concat(w,"&fourk=1&ep_id=").concat(p,"&type=").concat(_,"&otype=json"),h+="mp4"===_?"&platform=html5&high_quality=1":"",y.xhrFields={withCredentials:!0}}else{h=C.base_api,h+="?av=".concat(d,"&cid=").concat(u,"&q=").concat(f,"&ep=").concat(p,"&type=").concat(b,"&format=").concat(_,"&otype=json");var k=[t.get("auth_id"),t.get("auth_sec")],x=k[0],$=k[1];"1"===C.auth&&x&&$&&(h+="&auth_id=".concat(x,"&auth_sec=").concat($),e&&(h+="&s"))}y.url=h,v(y).then((function(t){var o;if(t.code||(o=t.result||t.data),!o)return"auto"===l?void D(e,i,n,a,r,"online"):(t.url&&(t.url=m(t.url)),t.video&&(t.video=m(t.video)),t.audio&&(t.audio=m(t.audio)),void a(t));if(o.dash){for(var c={code:0,quality:o.quality,accept_quality:o.accept_quality,video:"",audio:""},s=o.dash.video,d=0;d<s.length;d++){var u=s[d];if(u.id<=f){c.video=m(u.base_url),c.audio=m(o.dash.audio[0].base_url);break}}a(c)}else a({code:0,quality:o.quality,accept_quality:o.accept_quality,url:m(o.durl[0].url)})})).catch((function(e){return r(e)}))}var N={get_url:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1?arguments[1]:void 0,i=arguments.length>2?arguments[2]:void 0,n=C.request_type,o=C.format;D(0,e,o,t,i,n)},get_urls:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2?arguments[2]:void 0,n=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,a=C.request_type;D(e,t,i,n,o,a)},get_subtitle_url:function(e,t){var i=o.base(),n=[i.aid(e),i.cid(e),i.epid(e)],a=n[1],r=n[2];v({url:"https://api.bilibili.com/x/player/v2?aid=".concat(n[0],"&cid=").concat(a,"&ep_id=").concat(r),dataType:"json"}).then((function(e){!e.code&&e.data.subtitle.subtitles[0]?v({url:"".concat(e.data.subtitle.subtitles[0].subtitle_url),dataType:"json"}).then((function(e){var i,n="WEBVTT\n\n",o=M(e.body||[{from:0,to:0,content:""}]);try{for(o.s();!(i=o.n()).done;){var a=i.value,r=new Date(1e3*(parseInt(a.from)-28800)).toTimeString().split(" ")[0]+"."+(a.from.toString().split(".")[1]||"000").padEnd(3,"0"),l=new Date(1e3*(parseInt(a.to)-28800)).toTimeString().split(" ")[0]+"."+(a.to.toString().split(".")[1]||"000").padEnd(3,"0");n+="".concat(r," --\x3e ").concat(l,"\n").concat(a.content.trim(),"\n\n")}}catch(e){o.e(e)}finally{o.f()}t(URL.createObjectURL(new Blob([n],{type:"text/vtt"})))})).catch(t):t()})).catch(t)},get_season:function(e){v({url:"https://api.bilibili.com/pugv/view/web/season?ep_id=".concat(e),xhrFields:{withCredentials:!0},dataType:"json"}).then((function(e){e.code?d("获取剧集信息失败"):window.bp_episodes=e.data.episodes||null}))}};function H(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var G=new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.is_login=!1,this.vip_status=0,this.mid="",this.uname="",this.has_init=!1,this.lazyInit()}var t,i,n;return t=e,(i=[{key:"needReplace",value:function(){return!this.is_login||!this.vip_status&&o.base().need_vip()}},{key:"lazyInit",value:function(e){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=e)}}])&&H(t.prototype,i),n&&H(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}());function J(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var V=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.auth_clicked=!1}var i,n,o;return i=e,n=[{key:"reLogin",value:function(){t.set("auth_id",""),t.set("auth_sec",""),t.set("access_key",""),t.set("auth_time","0"),this.login()}},{key:"checkLoginStatus",value:function(){var e=this,i=[t.get("auth_id"),t.get("auth_sec"),t.get("access_key"),t.get("auth_time")||"0"],n=i[0],o=i[1],a=i[2],r=i[3];a&&(G.is_login&&(C.base_api!==t.get("pre_base_api")||Date.now()-parseInt(r)>864e5)&&v({url:"https://api.bilibili.com/x/space/myinfo?access_key=".concat(a),type:"GET",dataType:"json"}).then((function(i){if(!i.code)return t.set("auth_time",Date.now()),v({url:"".concat(C.base_api,"/auth/v2/?act=check&auth_id=").concat(n,"&auth_sec=").concat(o,"&access_key=").concat(a),type:"GET",dataType:"json"});b("授权已过期,准备重新授权",e.reLogin)})).then((function(t){t.code&&b("授权检查失败,准备重新授权",e.reLogin)})),t.set("pre_base_api",C.base_api))}},{key:"_login",value:function(e){var t=this;this.auth_clicked?f():(this.auth_clicked=!0,v({url:"https://passport.bilibili.com/login/app/third?appkey=27eb53fc9058f8c3&api=https%3A%2F%2Fwww.mcbbs.net%2Ftemplate%2Fmcbbs%2Fimage%2Fspecial_photo_bg.png&sign=04224646d1fea004e79606d3b038c84a",xhrFields:{withCredentials:!0},type:"GET",dataType:"json"}).then(e).finally((function(e){return t.auth_clicked=!1})))}},{key:"login",value:function(){this._login((function(e){e.data.has_login?$("body").append("<iframe id='auth_iframe' src='".concat(e.data.confirm_uri,"' style='display:none;'></iframe>")):_("必须登录B站才能正常授权,是否登陆?",(function(){location.href="https://passport.bilibili.com/login"}))}))}},{key:"loginManual",value:function(){this._login((function(e){if(e.data.has_login){var i=""+"请点击<b><a href='".concat(e.data.confirm_uri,"' target='_blank'>授权地址</a></b>\n 打开一个新窗口,正常情况新窗口应该显示一个图片,请将该窗口地址栏的URL链接复制到当前文本框中<br/>\n <input id='auth_url' style='width:100%;' type='text' autocomplete='off'><br>然后点击确定即可");b(i,(function(){var e=$("#auth_url").val(),i=t.get("auth_id")||"",n=t.get("auth_sec")||"";v({url:e.replace("https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png?","".concat(C.base_api,"/auth/v2/?act=login&auth_id=").concat(i,"&auth_sec=").concat(n,"&")),type:"GET",dataType:"json"}).then((function(i){i.code?d("授权失败"):(s("授权成功"),i.auth_id&&i.auth_sec&&(t.set("auth_id",i.auth_id),t.set("auth_sec",i.auth_sec)),t.set("access_key",new URL(e).searchParams.get("access_key")),t.set("auth_time",Date.now()),$("#auth").val("1"),C.auth="1")}))}))}else _("必须登录B站才能正常授权,是否登陆?",(function(){location.href="https://passport.bilibili.com/login"}))}))}},{key:"logout",value:function(){var e=this;if(t.get("auth_id"))if(this.auth_clicked)f();else{var i=[t.get("auth_id"),t.get("auth_sec")],n=i[0],o=i[1];v({url:"".concat(C.base_api,"/auth/v2/?act=logout&auth_id=").concat(n,"&auth_sec=").concat(o),type:"GET",dataType:"json"}).then((function(e){e.code?d("取消失败"):(s("取消成功"),t.set("auth_id",""),t.set("auth_sec",""),t.set("auth_time","0"),t.set("access_key",""),$("#auth").val("0"),C.auth="0")})).finally((function(t){return e.auth_clicked=!1}))}else b("没有发现授权记录")}},{key:"initAuth",value:function(){var e=this;window.bp_show_login=function(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"1",n=function(){"1"===i?e.login():e.loginManual()};t.get("auth_id")?_("发现授权记录,是否重新授权?",(function(){n()})):n()},window.bp_show_logout=function(){e.logout()},window.bp_show_login_help=function(){_("进行授权之后将能在远程请求时享有用户账号原有的权益,例如能够请求用户已经付费或承包的番剧,是否需要授权?",(function(){e.login()}))},window.addEventListener("message",(function(i){if("string"==typeof i.data&&"bilibili-parse-login-credentials"===i.data.split(":")[0]){$("iframe#auth_iframe").remove();var n=i.data.split(": ")[1],o=[t.get("auth_id"),t.get("auth_sec")],a=o[0],r=o[1];v({url:n.replace("https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png?","".concat(C.base_api,"/auth/v2/?act=login&auth_id=").concat(a,"&auth_sec=").concat(r,"&")),type:"GET",dataType:"json"}).then((function(e){e.code?d("授权失败"):(s("授权成功"),e.auth_id&&e.auth_sec&&(t.set("auth_id",e.auth_id),t.set("auth_sec",e.auth_sec)),t.set("access_key",new URL(n).searchParams.get("access_key")),t.set("auth_time",Date.now()),$("#auth").val("1"),C.auth="1")})).finally((function(t){return e.auth_clicked=!1}))}}))}}],n&&J(i.prototype,n),o&&J(i,o),Object.defineProperty(i,"prototype",{writable:!1}),e}(),W=new V;function X(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}var Y=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),U(),$("body").append('<div class="message-bg"></div> <div id="message_box"> <div class="message_box_bg"> <span style="font-size:20px"><b>提示:</b></span> <div id="message_box_context" style="margin:2% 0">...</div><br/><br/> <div class="message_box_btn"> <button class="setting-button" name="affirm">确定</button> <button class="setting-button" name="cancel">取消</button> </div> </div> </div> <style>.message-bg{position:fixed;float:right;right:0;top:2%;z-index:30000}.message{margin-bottom:15px;padding:2% 2%;width:300px;display:flex;margin-top:-70px;opacity:0}.message-success{background-color:#dfd;border-left:6px solid #4caf50}.message-danger{background-color:#fdd;border-left:6px solid #f44336}.message-info{background-color:#e7f3fe;border-left:6px solid #0c86de}.message-warning{background-color:#ffc;border-left:6px solid #ffeb3b}.message-context{font-size:21px;word-wrap:break-word;word-break:break-all}.message-context p{margin:0}#message_box{opacity:0;display:none;position:fixed;inset:0px;top:0;left:0;width:100%;height:100%;z-index:20000}.message_box_bg{position:absolute;background:#fff;border-radius:10px;padding:20px;top:50%;left:50%;transform:translate(-50%,-50%);width:400px;box-shadow:rgb(0 0 0 / 70%) 0 0 0 1000px}.message_box_btn{text-align:right}.message_box_btn button{margin:0 5px;width:120px;height:40px;border-width:0;border-radius:3px;background:#1e90ff;cursor:pointer;outline:0;color:#fff;font-size:17px}.message_box_btn button:hover{background:#59f}</style> '),W.initAuth()}var i,n,r;return i=e,n=[{key:"run",value:function(){var e,i;$("body").append('<a id="video_url" style="display:none;" target="_blank" referrerpolicy="origin" href="#"></a>'),$("body").append('<a id="video_url_2" style="display:none;" target="_blank" referrerpolicy="origin" href="#"></a>'),setTimeout((function(){var e;$("#arc_toolbar_report")[0]?(e='<div id="arc_toolbar_report_2" style="margin-top:16px" class="video-toolbar report-wrap-module report-scroll-module" scrollshow="true"> <div class="ops"> <span id="setting_btn"><i class="van-icon-general_addto_s"></i>脚本设置</span> <span id="bilibili_parse"><i class="van-icon-floatwindow_custome"></i>请求地址</span> <span id="video_download" style="display:none"><i class="van-icon-download"></i>下载视频</span> <span id="video_download_2" style="display:none"><i class="van-icon-download"></i>下载音频</span> <span id="video_download_all"><i class="van-icon-download"></i>批量下载</span> </div> <div class="more"> <i class="van-icon-general_moreactions"></i> <div class="more-ops-list"> <ul> <li><span id="download_danmaku">下载弹幕</span></li> <li><span id="download_subtitle">下载字幕</span></li> </ul> </div> </div> </div> ',$("#arc_toolbar_report").after(e)):$("#toolbar_module")[0]?(e='<div id="toolbar_module_2" class="tool-bar clearfix report-wrap-module report-scroll-module media-info" scrollshow="true"> <div id="setting_btn" class="like-info"> <i class="iconfont icon-add"></i><span>脚本设置</span> </div> <div id="bilibili_parse" class="like-info"> <i class="iconfont icon-customer-serv"></i><span>请求地址</span> </div> <div id="video_download" class="like-info" style="display:none"> <i class="iconfont icon-download"></i><span>下载视频</span> </div> <div id="video_download_2" class="like-info" style="display:none"> <i class="iconfont icon-download"></i><span>下载音频</span> </div> <div id="video_download_all" class="like-info"> <i class="iconfont icon-download"></i><span>批量下载</span> </div> <div class="more">更多<div class="more-ops-list"> <ul> <li><span id="download_danmaku">下载弹幕</span></li> <li><span id="download_subtitle">下载字幕</span></li> </ul> </div> </div> <style>.tool-bar .more{float:right;cursor:pointer;color:#757575;font-size:16px;display:inline-block;transition:all .3s;position:relative;text-align:center}.tool-bar .more:hover .more-ops-list{display:block}.tool-bar:after{display:block;content:"";clear:both}.more-ops-list{display:none;position:absolute;width:80px;left:-65px;z-index:30;text-align:center;padding:10px 0;background:#fff;border:1px solid #e5e9ef;box-shadow:0 2px 4px 0 rgba(0,0,0,.14);border-radius:2px;font-size:14px;color:#222}.more-ops-list li{position:relative;height:34px;line-height:34px;cursor:pointer;transition:all .3s}.more-ops-list li:hover{color:#00a1d6;background:#e7e7e7}</style> </div> ',$("#toolbar_module").after(e)):$("div.video-toolbar")[0]&&(e='<div id="arc_toolbar_report_2" style="margin-top:16px" class="video-toolbar report-wrap-module report-scroll-module" scrollshow="true"> <div class="ops"> <span id="setting_btn"><i class="van-icon-general_addto_s"></i>脚本设置</span> <span id="bilibili_parse"><i class="van-icon-floatwindow_custome"></i>请求地址</span> <span id="video_download" style="display:none"><i class="van-icon-download"></i>下载视频</span> <span id="video_download_2" style="display:none"><i class="van-icon-download"></i>下载音频</span> <span id="video_download_all"><i class="van-icon-download"></i>批量下载</span> </div> <div class="more"> <i class="van-icon-general_moreactions"></i> <div class="more-ops-list"> <ul class="more-ops-list-box"> <li class="more-ops-list-box-li"><span id="download_danmaku">下载弹幕</span></li> <li class="more-ops-list-box-li"><span id="download_subtitle">下载字幕</span></li> </ul> </div> </div> </div> ',$("div.video-toolbar").after(e)),G.lazyInit(),W.checkLoginStatus(),F.refresh()}),3e3),$("body").on("click","#setting_btn",(function(){for(var e in G.lazyInit(!0),C)$("#".concat(e)).val(C[e]);$("#bp_config").show(),$("#bp_config").animate({opacity:"1"},300),a.hide()})),$("body").on("click","#download_danmaku",(function(){var e=o.base();O.download_danmaku_ass(e.cid(),e.filename())})),$("body").on("click","#download_subtitle",(function(){O.download_subtitle_vtt(0,o.base().filename())})),$("body").on("click","#video_download_all",(function(){G.lazyInit(!0),t.get("auth_id")&&t.get("auth_sec")?"rpc"===C.download_type?O.download_all():_("仅支持使用RPC接口批量下载,请确保RPC环境正常,是否继续?",(function(){O.download_all()})):_("批量下载仅支持授权用户使用RPC接口下载,是否进行授权?",(function(){window.bp_show_login()}))})),$("body").on("click","#video_download",(function(){var e=C.download_type;if("web"===e)$("#video_url")[0].click();else if("a"===e){var t=[$("#video_url").attr("href"),$("#video_url_2").attr("href")],i=t[1],n="建议使用IDM、FDM等软件安装其浏览器插件后,鼠标右键点击链接下载~<br/><br/>"+'<a href="'.concat(t[0],'" target="_blank" style="text-decoration:underline;">>视频地址<</a><br/><br/>')+("dash"===C.format?'<a href="'.concat(i,'" target="_blank" style="text-decoration:underline;">>音频地址<</a>'):"");b(n)}else if("aria"===e){var a,r,l=[$("#video_url").attr("href"),$("#video_url_2").attr("href")],c=l[0],u=l[1],p=o.base().filename();a=p+O.url_format(c),r=p+"_audio.mp4";var f='--header "User-Agent: '.concat(window.navigator.userAgent,'" --header "Referer: ').concat(window.location.href,'"'),_='aria2c "'.concat(c,'" --out "').concat(a,'" ').concat(f),v='aria2c "'.concat(u,'" --out "').concat(r,'" ').concat(f),h="点击文本框即可复制下载命令!<br/><br/>"+'视频:<br/><input id="aria2_code" value=\''.concat(_,'\' onclick="bp_clip_btn(\'aria2_code\')" style="width:100%;"></br></br>')+("dash"===C.format?'音频:<br/><input id="aria2_code_2" value=\''.concat(v,'\' onclick="bp_clip_btn(\'aria2_code_2\')" style="width:100%;"><br/><br/>')+'全部:<br/><textarea id="aria2_code_all" onclick="bp_clip_btn(\'aria2_code_all\')" style="min-width:100%;max-width:100%;min-height:100px;max-height:100px;">'.concat(_,"\n").concat(v,"</textarea>"):"");!window.bp_clip_btn&&(window.bp_clip_btn=function(e){$("#".concat(e)).select(),document.execCommand("copy")?s("复制成功"):d("复制失败")}),b(h)}else{var m=$("#video_url").attr("href"),y=o.base().filename();O.download(m,y,e)}})),$("body").on("click","#video_download_2",(function(){var e=C.download_type;if("web"===e)$("#video_url_2")[0].click();else if("a"===e)$("#video_download").click();else if("aria"===e)$("#video_download").click();else{var t=$("#video_url_2").attr("href"),i=o.base().filename();O.download(t,i,e)}})),$("body").on("click","#bilibili_parse",(function(){G.lazyInit(!0);var n=o.base(),a=[n.type,n.aid(),n.p(),n.cid(),n.epid()],r=a[0],l=a[1],c=a[2],d=a[3],u=a[4],b=o.get_quality().q;e="".concat(C.base_api,"?av=").concat(l,"&p=").concat(c,"&cid=").concat(d,"&ep=").concat(u,"&q=").concat(b,"&type=").concat(r,"&format=").concat(C.format,"&otype=json&_host=").concat(C.host_key,"&_req=").concat(C.request_type);var _=[t.get("auth_id"),t.get("auth_sec")],v=_[0],h=_[1];if("1"===C.auth&&v&&h&&(e+="&auth_id=".concat(v,"&auth_sec=").concat(h)),e!==i||"local"===C.request_type)$("#video_url").attr("href","#"),$("#video_url_2").attr("href","#"),i=e,p("开始请求"),N.get_url(0,(function(e){if(e&&!e.code){s("请求成功"),e.times&&p("剩余请求次数:".concat(e.times));var t="dash"===C.format?e.video.replace("http://","https://"):e.url.replace("http://","https://"),i="dash"===C.format?e.audio.replace("http://","https://"):"#";$("#video_url").attr("href",t),$("#video_download").show(),"dash"===C.format&&($("#video_url_2").attr("href",i),$("#video_download_2").show()),(G.needReplace()||n.is_limited()||"1"===C.replace_force)&&k.replace_player(t,i),"1"===C.auto_download&&$("#video_download").click()}}));else{f();var m=$("#video_url").attr("href"),y=$("#video_url_2").attr("href");m&&"#"!==m&&($("#video_download").show(),"dash"===C.format&&$("#video_download_2").show(),(G.needReplace()||n.is_limited()||"1"===C.replace_force)&&!$("#bp_dplayer")[0]&&k.replace_player(m,y),"1"===C.auto_download&&$("#video_download").click())}})),$("body").on("click","a.router-link-active",(function(){this!==$('li[class="on"]').find("a")[0]&&F.refresh()})),$("body").on("click","li.ep-item",(function(){F.refresh()})),$("body").on("click","button.bilibili-player-iconfont-next",(function(){F.refresh()}));var n=k.bili_video_tag();$(n)[0]&&($(n)[0].onended=function(){F.refresh()}),$("body").on("click","li.bui-select-item",(function(){F.refresh()})),setInterval((function(){(F.q!==o.get_quality().q||"cheese"===o.type()&&F.epid!==o.base().epid())&&F.refresh()}),1e3),$("body").on("click",".rec-list",(function(){F.refresh()})),$("body").on("click",".bilibili-player-ending-panel-box-videos",(function(){F.refresh()})),setInterval((function(){var e=o.base();F.aid===e.aid()&&F.cid===e.cid()||F.refresh()}),3e3)}}],n&&X(i.prototype,n),r&&X(i,r),Object.defineProperty(i,"prototype",{writable:!1}),e}(),K=Y;window.bp_fun_locked||(window.bp_fun_locked=!0,null==location.href.match(/^https:\/\/www\.mcbbs\.net\/template\/mcbbs\/image\/special_photo_bg\.png/)?$(".error-text")[0]||(console.log("\n".concat(" %c bilibili-parse-download.user.js v","2.0.1"," ").concat("44e61a3"," %c https://github.com/injahow/user.js ","\n","\n"),"color: #fadfa3; background: #030307; padding:5px 0;","background: #fadfa3; padding:5px 0;"),(new K).run()):location.href.match("access_key")&&window!==window.parent&&(window.stop(),window.parent.postMessage("bilibili-parse-login-credentials: "+location.href,"*")))}();