// ==UserScript== // @name bilibili视频下载 // @namespace https://github.com/injahow // @version 1.3.0 // @description 支持flv、dash、mp4视频格式,支持下载港区番剧,支持会员下载,自动切换为高清视频源 // @author injahow // @homepage https://github.com/injahow/bilibili-parse // @copyright 2021, injahow (https://github.com/injahow) // @match *://www.bilibili.com/video/av* // @match *://www.bilibili.com/video/BV* // @match *://www.bilibili.com/bangumi/play/ep* // @match *://www.bilibili.com/bangumi/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/flv.js/dist/flv.min.js // @require https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js // @license MIT // @grant none // @downloadURL none // ==/UserScript== /* globals $, DPlayer waitForKeyElements */ (function () { 'use strict'; if (window.bp_fun_locked) return; window.bp_fun_locked = true; function request_danmaku(options, _cid) { $.ajax(`https://api.bilibili.com/x/v1/dm/list.so?oid=${_cid}`, { dataType: 'text', success: (result) => { const result_dom = $(result.replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, '')); if (!result_dom) { options.error('弹幕获取失败'); return; } if (!result_dom.find('d')[0]) { options.error('未发现弹幕'); } else { const danmaku_data = result_dom.find('d').map((i, el) => { const item = $(el); const p = item.attr('p').split(','); let type = 0; if (p[1] === '4') { type = 2; } else if (p[1] === '5') { type = 1; } return [{ author: '', time: parseFloat(p[0]), type: type, color: parseInt(p[3]), id: '', text: item.text() }]; }).get(); options.success(danmaku_data); } }, error: () => { options.error('弹幕请求异常'); } }); } let bili_player_id; function replace_player(url, url_2) { // 恢复原视频 recover_player(); // 暂停原视频 bili_video_stop(); const bili_video = $(bili_video_tag())[0]; !!bili_video && bili_video.addEventListener('play', bili_video_stop, false); if (!!$('#bilibiliPlayer')[0]) { bili_player_id = '#bilibiliPlayer'; $('#bilibiliPlayer').before('
'); $('#bilibiliPlayer').hide(); } else if (!!$('#bilibili-player')[0]) { bili_player_id = '#bilibili-player'; $('#bilibili-player').before('
'); $('#bilibili-player').hide(); } $('#danmukuBox').hide();//隐藏弹幕列表 !!$('#player_mask_module')[0] && $('#player_mask_module').hide(); window.my_dplayer = new DPlayer({ container: $('#my_dplayer')[0], mutex: false, video: { url: url, type: 'auto' }, danmaku: true, apiBackend: { read: function (options) { request_danmaku(options, video_status.base().cid()); }, send: function (options) { // ? options.error('此脚本无法将弹幕同步到云端'); } }, contextmenu: [ { text: '脚本信息', link: 'https://github.com/injahow/bilibili-parse' }, { text: '脚本作者', link: 'https://injahow.com' } ] }); if (config.format === 'dash' && url_2 && url_2 !== '#') { $('body').append(''); window.my_dplayer_2 = new DPlayer({ container: $('#my_dplayer_2')[0], mutex: false, video: { url: url_2, type: 'auto' } }); const my_dplayer = window.my_dplayer; const my_dplayer_2 = window.my_dplayer_2; my_dplayer.on('play', function () { !my_dplayer.paused && my_dplayer_2.play(); }); my_dplayer.on('playing', function () { !my_dplayer.paused && my_dplayer_2.play(); }); my_dplayer.on('timeupdate', function () { if (Math.abs(my_dplayer.video.currentTime - my_dplayer_2.video.currentTime) > 1) { my_dplayer_2.pause(); my_dplayer_2.seek(my_dplayer.video.currentTime); } !my_dplayer.paused && my_dplayer_2.play(); }); my_dplayer.on('seeking', function () { my_dplayer_2.pause(); my_dplayer_2.seek(my_dplayer.video.currentTime); }); my_dplayer.on('waiting', function () { my_dplayer_2.pause(); }); my_dplayer.on('pause', function () { my_dplayer_2.pause(); }); my_dplayer.on('suspend', function () { my_dplayer_2.speed(my_dplayer.video.playbackRate); }); my_dplayer.on('volumechange', function () { my_dplayer_2.volume(my_dplayer.video.volume); my_dplayer_2.video.muted = my_dplayer.video.muted; }); } } function bili_video_tag() { let tag; if (!!$('video[crossorigin="anonymous"]')[0]) { tag = 'video[crossorigin="anonymous"]'; } else if (!!$('bwp-video')[0]) { tag = 'bwp-video'; } return tag; } function bili_video_stop() { // listener const bili_video = $(bili_video_tag())[0]; if (!!bili_video) { bili_video.pause(); bili_video.currentTime = 0; } } function recover_player() { if (window.my_dplayer) { utils.Message.info('恢复播放器'); const bili_video = $(bili_video_tag())[0]; !!bili_video && bili_video.removeEventListener('play', bili_video_stop, false); window.my_dplayer.destroy(); window.my_dplayer = null; $('#my_dplayer').remove(); if (window.my_dplayer_2) { window.my_dplayer_2.destroy(); window.my_dplayer_2 = null; $('#my_dplayer_2').remove(); } !!bili_player_id && $(bili_player_id).show(); $('#danmukuBox').show(); /*!!$('#player_mask_module')[0] && $('#player_mask_module').show();*/ } } // video let video_status; (function () { video_status = { type, base, get_quality }; function type() { if (!!window.__INITIAL_STATE__.epInfo) { return 'bangumi'; } else if (!!window.__INITIAL_STATE__.videoData) { return 'video'; } } function base() { const _type = type(); if (_type === 'video') { return { aid: () => { return window.__INITIAL_STATE__.videoData.aid; }, p: () => { return window.__INITIAL_STATE__.p || 1; }, cid: () => { const aid = window.__INITIAL_STATE__.videoData.aid; const p = window.__INITIAL_STATE__.p || 1; return window.__INITIAL_STATE__.cidMap[aid].cids[p]; }, epid: () => { return ''; }, need_vip: () => { return false; }, vip_need_pay: () => { return false; } }; } else if (_type === 'bangumi') { return { aid: () => { return window.__INITIAL_STATE__.epInfo.aid; }, p: () => { return window.__INITIAL_STATE__.epInfo.i || 1; }, cid: () => { return window.__INITIAL_STATE__.epInfo.cid; }, epid: () => { return window.__INITIAL_STATE__.epInfo.id; }, need_vip: () => { return window.__INITIAL_STATE__.epInfo.badge === '会员'; }, vip_need_pay: () => { return window.__INITIAL_STATE__.epPayMent.vipNeedPay; } }; } } function get_quality() { let _q = 0, _q_max = 0; if (!!$('li.bui-select-item')[0] && !!(_q_max = parseInt($('li.bui-select-item')[0].dataset.value))) { _q = parseInt($('li.bui-select-item.bui-select-item-active').attr('data-value')) || (_q_max > 80 ? 80 : _q_max); } else if (!!$('li.squirtle-select-item')[0] && !!(_q_max = parseInt($('li.squirtle-select-item')[0].dataset.value))) { _q = parseInt($('li.squirtle-select-item.active').attr('data-value')) || (_q_max > 80 ? 80 : _q_max); } else { _q = _q_max = 80; } if (!user_status.is_login()) { _q = _q_max > 80 ? 80 : _q_max; } return { q: _q, q_max: _q_max }; } })(); const check = { aid: '', cid: '', q: '' }; function refresh() { //utils.Message.info('refresh...'); console.log('refresh...'); !!$('#video_download')[0] && $('#video_download').hide(); !!$('#video_download_2')[0] && $('#video_download_2').hide(); recover_player(); // 更新check const video_base = video_status.base(); check.aid = video_base.aid(); check.cid = video_base.cid(); check.q = video_status.get_quality().q; } // https://greasyfork.org/zh-CN/scripts/25718-%E8%A7%A3%E9%99%A4b%E7%AB%99%E5%8C%BA%E5%9F%9F%E9%99%90%E5%88%B6 if (location.href.match(/^https:\/\/www\.mcbbs\.net\/template\/mcbbs\/image\/special_photo_bg\.png/) != null) { if (location.href.match('access_key') != null && window.opener != null) { window.stop(); document.children[0].innerHTML = 'bilibili-parse - 授权正在跳转……'; window.opener.postMessage('bilibili-parse-login-credentials: ' + location.href, '*'); } return; } function check_login_status() { !localStorage.getItem('bp_remind_login') && localStorage.setItem('bp_remind_login', '1'); const auth_id = localStorage.getItem('bp_auth_id') || ''; const auth_sec = localStorage.getItem('bp_auth_sec') || ''; const access_key = localStorage.getItem('bp_access_key') || ''; const auth_time = localStorage.getItem('bp_auth_time') || '0'; if (access_key && !auth_time) { localStorage.setItem('bp_auth_time', Date.now()); } if (user_status.is_login()) { if (localStorage.getItem('bp_remind_login') === '1') { if (!access_key) { utils.MessageBox.confirm('当前脚本未进行账号授权,无法请求1080P以上的清晰度;如果你是大会员或承包过这部番,授权即可解锁全部清晰度;是否需要进行账号授权?', () => { window.bp_show_login(); }); } localStorage.setItem('bp_remind_login', '0'); } else if (config.base_api !== localStorage.getItem('bp_pre_base_api') || (Date.now() - parseInt(auth_time) > 24 * 60 * 60 * 1000)) { // check key if (access_key) { $.ajax(`${config.base_api}/auth/v2/?act=check&auth_id=${auth_id}&auth_sec=${auth_sec}&access_key=${access_key}`, { type: 'GET', dataType: 'json', success: (res) => { if (res.code) { utils.MessageBox.alert('授权已过期,准备重新授权', () => { localStorage.setItem('bp_access_key', ''); localStorage.setItem('bp_auth_time', ''); window.bp_show_login(); }); } else { localStorage.setItem('bp_auth_time', Date.now()); } }, error: () => { utils.Message.danger('检查key请求异常'); } }); } } } localStorage.setItem('bp_pre_base_api', config.base_api); } window.bp_show_login = function () { if (window.auth_clicked) { utils.Message.info('(^・ω・^)~喵喵喵~'); return; } window.auth_clicked = true; if (localStorage.getItem('bp_access_key')) { utils.MessageBox.confirm('发现授权记录,是否重新授权?', () => { login(); }, () => { window.auth_clicked = false; }); } else { login(); } } function login() { const auth_window = window.open('about:blank'); auth_window.document.title = 'bilbili-parse - 授权'; auth_window.document.body.innerHTML = '正在获取授权,请稍候……'; window.auth_window = auth_window; $.ajax('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: true }, type: 'GET', dataType: 'json', success: (data) => { if (data.data.has_login) { auth_window.document.body.innerHTML = '正在跳转……'; auth_window.location.href = data.data.confirm_uri; } else { auth_window.close(); utils.MessageBox.confirm('必须登录B站才能正常授权,是否登陆?', () => { location.href = 'https://passport.bilibili.com/login'; }, () => { window.auth_clicked = false; }); } }, error: () => { utils.Message.danger('授权请求异常'); window.auth_clicked = false; } }); } window.bp_show_logout = function () { const auth_id = localStorage.getItem('bp_auth_id') || ''; const auth_sec = localStorage.getItem('bp_auth_sec') || ''; if (window.auth_clicked) { utils.Message.info('(^・ω・^)~喵喵喵~'); return; } window.auth_clicked = true; if (!auth_id) { utils.MessageBox.alert('没有发现授权记录'); window.auth_clicked = false; return; } $.ajax(`${config.base_api}/auth/v2/?act=logout&auth_id=${auth_id}&auth_sec=${auth_sec}`, { type: 'GET', dataType: 'json', success: (res) => { if (!res.code) { utils.Message.success('取消成功'); localStorage.setItem('bp_auth_id', ''); localStorage.setItem('bp_auth_sec', ''); localStorage.setItem('bp_auth_time', ''); localStorage.setItem('bp_access_key', ''); $('#auth').val('0'); } else { utils.Message.warning('取消失败'); } window.auth_clicked = false; }, error: () => { utils.Message.danger('请求异常'); window.auth_clicked = false; } }); } window.bp_show_login_help = function () { utils.MessageBox.confirm('进行授权之后将能在请求地址时享有用户账号原有的权益,例如能够请求用户已经付费或承包的番剧,是否需要授权?', () => { window.bp_show_login(); }); } window.addEventListener('message', function (e) { var _a; if (typeof e.data !== 'string') return; if (e.data.split(':')[0] === 'bilibili-parse-login-credentials') { (_a = window.auth_window) === null || _a === void 0 ? void 0 : _a.close(); let url = e.data.split(': ')[1]; const auth_id = localStorage.getItem('bp_auth_id') || ''; const auth_sec = localStorage.getItem('bp_auth_sec') || ''; $.ajax(url.replace('https://www.mcbbs.net/template/mcbbs/image/special_photo_bg.png?', `${config.base_api}/auth/v2/?act=login&auth_id=${auth_id}&auth_sec=${auth_sec}&vip_status=${user_status.vip_status()}&`), { type: 'GET', dataType: 'json', success: (res) => { if (!res.code) { utils.Message.success('授权成功'); if (res.auth_id && res.auth_sec) { localStorage.setItem('bp_auth_id', res.auth_id); localStorage.setItem('bp_auth_sec', res.auth_sec); } localStorage.setItem('bp_access_key', new URL(url).searchParams.get('access_key')); localStorage.setItem('bp_auth_time', Date.now()); $('#auth').val('1'); } else { utils.Message.warning('授权失败'); } window.auth_clicked = false; }, error: () => { utils.Message.danger('请求异常'); window.auth_clicked = false; } }); } }); // config let config = { base_api: 'https://api.injahow.cn/bparse/', format: 'flv', replace_force: '0', auth: '0', download_type: 'web', rpc_domain: 'http://localhost', rpc_port: '16800', rpc_token: '', rpc_dir: 'D:/' }; // config_init let new_config_str, new_config_str_temp; (function () { const config_str = localStorage.getItem('my_config_str'); if (!config_str) { localStorage.setItem('my_config_str', JSON.stringify(config)); } else { let old_config = JSON.parse(config_str); if (Object.keys(old_config).toString() !== Object.keys(config).toString()) { for (let key in old_config) { config[key] = old_config[key]; } } else { config = old_config; } } new_config_str_temp = new_config_str = JSON.stringify(config); const _config = config; window.my_click_event = () => { config.base_api = $('#base_api').val(); config.format = $('#format option:selected').val(); config.replace_force = $('#replace_force option:selected').val(); config.auth = $('#auth option:selected').val(); config.download_type = $('#download_type option:selected').val(); config.rpc_domain = $('#rpc_domain').val(); config.rpc_port = $('#rpc_port').val(); config.rpc_token = $('#rpc_token').val(); config.rpc_dir = $('#rpc_dir').val(); new_config_str = JSON.stringify(config); localStorage.setItem('my_config_str', new_config_str); $('#my_config').hide(); $('#video_download').hide(); $('#video_download_2').hide(); }; window.onbeforeunload = () => { window.my_click_event(); }; window.bp_show_help = () => { if (window.help_clicked) { utils.Message.info('(^・ω・^)~喵喵喵~'); return; } window.help_clicked = true; $.ajax(`${config.base_api}/auth/v2/?act=help`, { dataType: 'text', success: (result) => { if (result) { utils.MessageBox.alert(result); } else { utils.Message.warning('获取失败'); } window.help_clicked = false; }, error: (e) => { utils.Message.danger('请求异常'); window.help_clicked = false; console.log('error', e); } }); }; const option = ['', 'selected']; const config_css = ''; const config_html = ''; $('body').append(config_html + config_css); })(); // components const utils = { Video: {}, Message: {}, MessageBox: {} }; // components_init (function () { utils.Message = { success: (html) => { message(html, 'success'); }, warning: (html) => { message(html, 'warning'); }, danger: (html) => { message(html, 'danger'); }, info: (html) => { message(html, 'info'); } }; utils.MessageBox = { alert: (html, affirm) => { messageBox({ html, callback: { affirm } }, 'alert'); }, confirm: (html, affirm, cancel) => { messageBox({ html, callback: { affirm, cancel } }, 'confirm'); } }; utils.Video = { download: (url, name, type) => { if (type === 'blob') { download_blob(url, name); } else if (type === 'rpc') { download_rpc(url, name); } } }; function download_rpc(url, filename) { if (window.bp_download_rpc_clicked) { utils.Message.warning('(^・ω・^)~喵喵喵~'); return; } window.bp_download_rpc_clicked = true; const rpc = { domain: config.rpc_domain, port: config.rpc_port, token: config.rpc_token, dir: config.rpc_dir, }; const rpc_url = `${rpc.domain}:${rpc.port}/jsonrpc`; const json_rpc = { id: window.btoa(`BParse_${Date.now()}_${Math.random()}`), jsonrpc: '2.0', method: 'aria2.addUri', params: [`token:${rpc.token}`, [url], { dir: rpc.dir, out: filename, header: [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36', 'Referer: https://www.bilibili.com/' ] }] }; utils.Message.info('发送RPC下载请求'); const data_str = JSON.stringify(json_rpc); $.ajax(rpc_url, { type: 'POST', dataType: 'json', data: data_str, success: (res) => { if (res.result) { utils.Message.success('RPC请求成功'); window.bp_download_rpc_clicked = false; } else { utils.Message.warning('RPC请求失败'); window.bp_download_rpc_clicked = false; } }, error: () => { utils.Message.danger('RPC请求异常,请确认RPC服务配置及软件运行状态'); window.bp_download_rpc_clicked = false; } }); } function show_progress(data) { if (window.bp_show_progress) { utils.MessageBox.alert(`文件大小:${Math.floor(data.total / (1024 * 1024))}MB(${data.total}Byte)
` + `已经下载:${Math.floor(data.loaded / (1024 * 1024))}MB(${data.loaded}Byte)
` + `当前进度:${data.percent}%
下载中请勿操作浏览器!`, () => { window.bp_show_progress = false; utils.MessageBox.alert('注意:刷新或离开页面会导致下载取消!'); }); } if (data.total === data.loaded) { utils.Message.success('下载完成'); window.bp_download_blob_clicked = false; } } function download_blob(url, name) { if (window.bp_download_blob_clicked) { utils.Message.warning('(^・ω・^)~喵喵喵~'); window.bp_show_progress = true; return; } const xhr = new XMLHttpRequest(); xhr.open('get', url); xhr.responseType = 'blob'; xhr.onload = function () { if (this.status === 200 || this.status === 304) { if ('msSaveOrOpenBlob' in navigator) { navigator.msSaveOrOpenBlob(this.response, name); return; } const blob_url = URL.createObjectURL(this.response); const a = document.createElement('a'); a.style.display = 'none'; a.href = blob_url; a.download = name; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(blob_url); } }; window.bp_show_progress = true; xhr.onprogress = function (evt) { if (this.state != 4) { const loaded = evt.loaded; const tot = evt.total; show_progress({ total: tot, loaded: loaded, percent: Math.floor(100 * loaded / tot) }); } }; xhr.send(); window.bp_download_blob_clicked = true; // locked } const components_css = ''; const components_html = '
' + ''; function messageBox(ctx, type) { if (type === 'confirm') { $('div.message_box_btn button[name="cancel"]').show(); } else if (type === 'alert') { $('div.message_box_btn button[name="cancel"]').hide(); } if (ctx.html) { $('div#message_box_context').html(`
${ctx.html}
`); } else { $('div#message_box_context').html('
╰( ̄▽ ̄)╮
'); } $('#message_box').show(); $('div#message_box').animate({ 'opacity': '1' }, 300); $('div.message_box_btn button[name="affirm"]')[0].onclick = () => { $('div#message_box').hide(); if (ctx.callback && ctx.callback.affirm) { ctx.callback.affirm(); } }; $('div.message_box_btn button[name="cancel"]')[0].onclick = () => { $('div#message_box').hide(); if (ctx.callback && ctx.callback.cancel) { ctx.callback.cancel(); } }; } let id = 0; function message(html, type) { id += 1; messageEnQueue(`

${type}:

${html}

`, id); messageDeQueue(id); } function messageEnQueue(message, id) { $('div.message-bg').append(message); $(`div#message-${id}`).animate({ 'margin-top': '+=70px', 'opacity': '1', }, 300); } function messageDeQueue(id, time = 3000) { setTimeout(() => { const e = `div#message-${id}`; $(e).animate({ 'margin-top': '-=70px', 'opacity': '0', }, 300, () => { $(e).remove(); }); }, time); } $('body').append(components_html + components_css); })(); // user let user_status; // user_init (function () { user_status = { is_login, vip_status, mid, need_replace, lazy_init }; let _is_login = false, _vip_status = 0, _mid = ''; let is_init = false; function lazy_init(last_init = false) { if (!is_init) { if (window.__BILI_USER_INFO__) { _is_login = window.__BILI_USER_INFO__.isLogin; _vip_status = window.__BILI_USER_INFO__.vipStatus; _mid = window.__BILI_USER_INFO__.mid || ''; } else if (window.__BiliUser__) { _is_login = window.__BiliUser__.isLogin; if (window.__BiliUser__.cache) { _vip_status = window.__BiliUser__.cache.data.vipStatus; _mid = window.__BiliUser__.cache.data.mid || ''; } else { _vip_status = 0; _mid = ''; } } else { _is_login = false; _vip_status = 0; _mid = ''; } is_init = last_init; } } function is_login() { return _is_login; } function vip_status() { return _vip_status; } function mid() { return _mid; } function need_replace() { return (!_is_login || (_is_login && !_vip_status && video_status.base().need_vip())); } })(); $('body').append(''); $('body').append(''); // 暂且延迟处理... setTimeout(function () { let my_toolbar; if (!!$('#arc_toolbar_report')[0]) { my_toolbar = '
' + '脚本设置' + '请求地址' + '' + '' + '
'; $('#arc_toolbar_report').after(my_toolbar); } else if (!!$('#toolbar_module')[0]) { my_toolbar = '
' + '' + '' + '' + '' + '
'; $('#toolbar_module').after(my_toolbar); } user_status.lazy_init(); check_login_status(); }, 3000); $('body').on('click', '#setting_btn', function () { $('#my_config').show(); for (let key in config) { $(`#${key}`).val(config[key]); } }); $('body').on('click', '#video_download', function () { const type = config.download_type; if (type === 'web') { $('#video_url')[0].click(); } else { const url = $('#video_url').attr('href'); let file_name = window.__INITIAL_STATE__.h1Title || (window.__INITIAL_STATE__.videoData && window.__INITIAL_STATE__.videoData.title) || 'unknown'; if (url.match('.flv')) { file_name += '.flv'; } else if (url.match('.m4s')) { file_name += '_video.mp4'; } else if (url.match('.mp4')) { file_name += '.mp4'; } else { return; } utils.Video.download(url, file_name, type); } }); $('body').on('click', '#video_download_2', function () { const type = config.download_type; if (type === 'web') { $('#video_url_2')[0].click(); } else { const url = $('#video_url_2').attr('href'); let file_name = window.__INITIAL_STATE__.h1Title || (window.__INITIAL_STATE__.videoData && window.__INITIAL_STATE__.videoData.title) || 'unknown'; file_name += '_audio.mp4'; utils.Video.download(url, file_name, type); } }); let api_url, api_url_temp; $('body').on('click', '#bilibili_parse', function () { user_status.lazy_init(true); // init const video_base = video_status.base(); const aid = video_base.aid(); const p = video_base.p(); const cid = video_base.cid(); const epid = video_base.epid(); const type = video_status.type(); const q = video_status.get_quality().q; api_url = `${config.base_api}?av=${aid}&p=${p}&cid=${cid}&ep=${epid}&q=${q}&type=${type}&format=${config.format}&otype=json`; const auth_id = localStorage.getItem('bp_auth_id') || ''; const auth_sec = localStorage.getItem('bp_auth_sec') || ''; if (config.auth === '1' && auth_id && auth_sec) { api_url += `&auth_id=${auth_id}&auth_sec=${auth_sec}`; } if (api_url === api_url_temp && new_config_str === new_config_str_temp) { utils.Message.info('(^・ω・^)~喵喵喵~'); const url = $('#video_url').attr('href'); const url_2 = $('#video_url_2').attr('href'); if (url && url !== '#') { $('#video_download').show(); config.format === 'dash' && $('#video_download_2').show(); if (user_status.need_replace() || config.replace_force === '1') { !$('#my_dplayer')[0] && replace_player(url, url_2); } } return; } $('#video_url').attr('href', '#'); $('#video_url_2').attr('href', '#'); api_url_temp = api_url; new_config_str_temp = new_config_str; utils.Message.info('开始请求'); $.ajax(api_url, { dataType: 'json', success: (result) => { if (result && result.code === 0) { utils.Message.success('请求成功'); const url = config.format === 'dash' ? result.video.replace(/^https?\:\/\//i, 'https://') : result.url.replace(/^https?\:\/\//i, 'https://'); const url_2 = config.format === 'dash' ? result.audio.replace(/^https?\:\/\//i, 'https://') : '#'; $('#video_url').attr('href', url); $('#video_download').show(); if (config.format === 'dash') { $('#video_url_2').attr('href', url_2); $('#video_download_2').show(); } if (user_status.need_replace() || config.replace_force === '1') { replace_player(url, url_2); } } else { utils.Message.warning('请求失败:' + result.message); } }, error: (e) => { utils.Message.danger('请求异常'); console.log('error', e); } }); }); // 监听p $('body').on('click', 'a.router-link-active', function () { if (this !== $('li[class="on"]').find('a')[0]) { refresh(); } }); $('body').on('click', 'li.ep-item', function () { refresh(); }); $('body').on('click', 'button.bilibili-player-iconfont-next', function () { refresh(); }); !!$('video[crossorigin="anonymous"]')[0] && ($('video[crossorigin="anonymous"]')[0].onended = function () { refresh(); }); // 监听q $('body').on('click', 'li.bui-select-item', function () { refresh(); }); setInterval(function () { if (check.q !== video_status.get_quality().q) { refresh(); } }, 1000); // 监听aid $('body').on('click', '.rec-list', function () { refresh(); }); $('body').on('click', '.bilibili-player-ending-panel-box-videos', function () { refresh(); }); // 定时检查 aid 和 cid setInterval(function () { const video_base = video_status.base(); if (check.aid !== video_base.aid() || check.cid !== video_base.cid()) { refresh(); } }, 3000); })();