');
for (let [key, {text, tempargs, keystr, keycount, display, delimiter, nonuse, syskey}] of Object.entries(config.sets['keyBinding'].options)) {
if(delimiter === undefined) delimiter = '/'; // 默认是'/'
let list_row;
if(display === 'none')
list_row = ret_list_row(-1, text, key, keystr, keycount, delimiter, nonuse, syskey, -1*row_line_height);
else
list_row = ret_list_row(row_count++, text, key, keystr, keycount, delimiter, nonuse, syskey, (row_count-1)*row_line_height);
let $list_row = $(list_row);
///////////////////////////////////////////
//创建一个 args num input
// eslint-disable-next-line no-inner-declarations
function create_num_input(key, arg, arg_index){
//创建inputDOM
function create_num_input_$dom(key, arg){
let $container = $(`
`);
$container.append(`
`)
if(bb_type.indexOf(BILI_3_X_VIDEO) !== -1 && !!arg.opt)
tip_create_3_X({ target: $container, tip_target: $('#hhh_tip'), color: '#00ffff', title: arg.opt.tip[0], gap: 1 });
return $container;
}
//设置inputDOM event
function num_input_event_init($num_input_dom, arg_index){
let $input = $num_input_dom.find('input')
//---change---
$input.off('change.hhh_num_input');
$input.on ('change.hhh_num_input', function(){
let $this = $(this)
let key = $this.attr('key')
let args = config.getCheckboxSettingTempArgs(key)
args[arg_index]['value'] = $this.val()
config.setCheckboxSettingTempArgs(key, args);
config.storageCheckboxSetting();
});
//---focus---
$input.off('focus.hhh_num_input');
$input.on ('focus.hhh_num_input', function(){
//---keydown stopPropagation on---
$('body').off('keydown.hhh_num_input');
$('body').on ('keydown.hhh_num_input', function(e){ e.stopPropagation() });
$(this).css({width: "36px"}).prop('type', 'number');
})
//---dblclick---
//* 双击 number input 会透过input节点产生blur事件 */ bug?
$input.off('dblclick.hhh_num_input');
$input.on ('dblclick.hhh_num_input', function(e){
e.stopImmediatePropagation()
e.preventDefault()
})
//---blur---
$input.off('blur.hhh_num_input');
$input.on ('blur.hhh_num_input', function(){
//---keydown stopPropagation off---
$('body').off('keydown.hhh_num_input');
$(this).prop('type', 'tel');
this.style.width = "10px"; //让 scrollWidth 获取最小值,达到回缩的效果
this.style.width = (this.scrollWidth)+"px";
})
//---mouseenter、mouseleave---
$input.off('mouseenter.hhh_num_input');
$input.off('mouseleave.hhh_num_input');
$input.on ('mouseenter.hhh_num_input', function(){
let $this = $(this);
$this.css({width: "36px"}).prop('type', 'number');
let rect = this.getBoundingClientRect();
document.onmousemove = function(e){
let x = e.clientX;
let y = e.clientY;
if(x < rect.left || x > rect.right || y < rect.top || y > rect.bottom ){
$this.mouseleave();
}
}
}).on('mouseleave.hhh_num_input', function(){
document.onmousemove = null;
if(this !== document.activeElement){
$(this).prop('type', 'tel');
this.style.width = "10px"; //让 scrollWidth 获取最小值,达到回缩的效果
this.style.width = (this.scrollWidth)+"px";
}
})
}
let $num_input_dom = create_num_input_$dom(key, arg)
num_input_event_init($num_input_dom, arg_index)
return $num_input_dom
}
//插入到相应 list row
if(!!tempargs){
let $text = $(`
`)
let static_text = text.split(/\${.+?}/)
let i;
for(i = 0; i < tempargs.length; ++i){
$text[0].appendChild( document.createTextNode(static_text[i]) )
$text[0].appendChild( create_num_input(key, tempargs[i], i)[0] )
}
$text[0].appendChild( document.createTextNode(static_text[i]) )
$list_row.find(`:contains(${text}):last`).replaceWith($text)
}
$list_row.appendTo($div);
set_keybinding_key($list_row.find('.monaco-keybinding'), keystr, true);
if(display === 'none') $list_row.hide();
}
$div.find('.monaco-list-row').appendTo($('.monaco-list-rows'));
//初始化input宽度
$('.monaco-list-rows').find('.hhh-bpx-player-dm-setting-number').mouseenter().mouseleave()
//滚动条半屏空屏
if($('.monaco-list').height() < row_count*row_line_height){
//初始化滚动条
scroll_updata($scroll_element, {top: 0})
//滚轮滚动条
$scroll_element.on('mousewheel',function(e){
var wheelDelta = e.originalEvent.wheelDelta;
let delta = wheelDelta >= 0 ? row_line_height*2 : -row_line_height*2;
let newtop = parseInt($(this).find('.monaco-list-rows').css('top').split('px')[0]) + delta;
scroll_updata($(this), {top: newtop});
return false;
});
let track = 'mouseover';
//拖动滚动条
$scroll_element.find('.slider').mousedown(function(e){
let $this = $(this);
let doc = document;
$this.addClass('active');
let fixed_offsetY = e.clientY - parseInt($this.css('top').split('px')[0]); //点击时鼠标坐标Y相对滚动条top的偏移
doc.onmousemove = function(e){
scroll_updata($scroll_element, {slider: parseInt(fixed_offsetY - e.clientY)});
};
doc.onmouseup = function(){
//清除事件
doc.onmousemove = null;
doc.onmouseup = null;
$this.removeClass('active');
track === 'mouseleave' && $scroll_element.mouseleave();
return false;
}
return false;
});
//点击滚动条轨道,滑块中点移到点击位置
$scroll_element.find('.vertical').mousedown(function(e){
let newslider = $(this).find('.slider').height()/2 - e.offsetY; //计算滑块中点相对于鼠标点击位置偏移
scroll_updata($scroll_element, {slider: newslider});
return false;
});
//over & leave
$scroll_element.mouseover(function(){
track = 'mouseover';
if($(this).find('.slider').hasClass('active') !== true){
$(this).find('.vertical').removeClass('invisible')
.removeClass('fade')
.addClass('visible');
}
}).mouseleave(function(){
track = 'mouseleave';
if($(this).find('.slider').hasClass('active') !== true){
$(this).find('.vertical').removeClass('visible')
.addClass('invisible')
.addClass('fade');
}
});
}
//焦点集中在第一项
$('.monaco-list-row').removeClass('focused');
$('.monaco-list-row:first').addClass('focused');
}
//=========事件==========//
//list-row Event
function set_listrow_event(open){
//input Event
function set_input_event(open){
//===========
//input Event
function set_widget(curr_keystr){
function set_input(keystr){
let delimiter = $('.defineKeybindingWidget .monaco-keybinding').attr('key-delimiter');
delimiter = delimiter === '/' ? ' / ' : delimiter;
$('.defineKeybindingWidget input').val(keystr.replace(/\s+/g, `${delimiter}`));
}
function set_existing(keystr){
let str = keystr.split(' ').slice(-1)[0];
let keyarr = config.findKeyBinding(str);
let len = keyarr.length;
let html = '';
if(len > 0){ //有重复
let len_html = '';
let sys_html = '';
let id_text = '';
//如果是系统快捷键
let i = 0;
for (; i < keyarr.length-1; i++) {
const o = keyarr[i];
if(o.is_system_key) id_text += `"${o.id}(系统命令)" / `;
else id_text += `"${o.id}" / `;
}
if(keyarr[i].is_system_key) id_text += `"${keyarr[i].text}(系统命令)"`;
else id_text += `"${keyarr[i].text}"`;
//如果多于一个
if(len > 1) len_html = `等
${len} 个命令`;
html = `
已有命令 ${id_text} ${len_html}绑定此按键
`
}
let $existing = $main.find($('.existingText'));
$existing.text('').append(html);
}
//设置 input keybinging existing
let keycount = Math.abs(+$('.defineKeybindingWidget .monaco-keybinding').attr('key-count'));
let keystr_temp = $('.defineKeybindingWidget .monaco-keybinding').attr('key-str-temp');
let keystr = curr_keystr;
if(keystr_temp !== '' && keystr_temp.split(' ').length < keycount){
keystr = keystr_temp + ' ' + keystr;
}
set_input(keystr);
set_keybinding_key($('.defineKeybindingWidget .monaco-keybinding'), keystr, true);
set_existing(keystr);
return keystr;
}
if (open !== ON){
$main.find('input').off('keydown.hhh_widget_input');
$main.find('input').off('keyup.hhh_widget_input');
$main.find('input').add('.defineKeybindingWidget').off('mousewheel.hhh_widget_input');
$main.find('input').off('blur.hhh_widget_input');
}else{
//----------------
//keydown && keyup
$main.find('input').off('keyup.hhh_widget_input');
$main.find('input').on ('keyup.hhh_widget_input',function(){
oldkeystr = ''; oldwheelstr = '';
});
$main.find('input').off('keydown.hhh_widget_input');
$main.find('input').on ('keydown.hhh_widget_input',function(e){
let curr_keystr = kb.delSpace(kb.stringifyKeyCode(e));
if(curr_keystr === oldkeystr) return false;
if(curr_keystr === 'Enter'){ //确定keybinding
$('.overlay-container').hide();
//更新list-row
let index = $('.defineKeybindingWidget').attr('data-index');
let $keybinding = $('.monaco-list-rows .monaco-list-row').eq(index).find('.monaco-keybinding');
let keystr = $('.defineKeybindingWidget .monaco-keybinding').attr('key-str');
let keyid = $('.defineKeybindingWidget .monaco-keybinding').attr('key-id');
set_keybinding_key($keybinding, keystr, true);
//log('确认: '+keyid+' - '+keystr);
config.setKeySettingKeystr(keyid, keystr);
config.storageCheckboxSetting();
}else if(curr_keystr === 'Escape'){ //取消keybinding
$('.overlay-container').hide();
}else{ //储存keybinding
let keystr = set_widget(curr_keystr);
let curr_last_keystr = kb.getkeyCode(e.keyCode);
if(['ctrl', 'shift', 'alt'].indexOf(curr_last_keystr.toLowerCase()) === -1){ // 非控制键暂存
$('.defineKeybindingWidget .monaco-keybinding').attr('key-str-temp', keystr);
}
}
oldkeystr = curr_keystr;
return false;
});
//----------
//mousewheel
$main.find('input').add('.defineKeybindingWidget').off('mousewheel.hhh_widget_input');
$main.find('input').add('.defineKeybindingWidget').on ('mousewheel.hhh_widget_input',function(e){
e.keyCode = e.originalEvent.wheelDelta >= 0 ? '300' : '301';
let curr_keystr = kb.delSpace(kb.stringifyKeyCode(e));
//
// let id, index, key;
// //e.ctrlKey = true;
// let keybindings = config.findKeyBinding(kb.delSpace(kb.stringifyKeyCode(e)));
// if(keybindings.length){
// id = keybindings[0]['id'];
// index = keybindings[0]['index'];
// key = keybindings[0]['key'];
// };
// keybindings.forEach(element => {
// log(element)
// });
//
if(curr_keystr === oldwheelstr) return false;
let keystr = set_widget(curr_keystr);
$('.defineKeybindingWidget .monaco-keybinding').attr('key-str-temp', keystr);
oldwheelstr = curr_keystr;
return false;
});
//-----
//blur
$main.find('input').off('blur.hhh_widget_input');
$main.find('input').on ('blur.hhh_widget_input',function(){
$('.overlay-container').hide();
$main.find('input').off('keydown.hhh_widget_input');
$main.find('input').off('keyup.hhh_widget_input');
$main.find('input').add('.defineKeybindingWidget').off('mousewheel.hhh_widget_input');
})
}
}
function key_input_run(){
// log('--key_input_run--')
// log(+$('.monaco-list-row.focused .monaco-keybinding').attr('key-count'))
// log(typeof $('.monaco-list-row.focused .monaco-keybinding').attr('key-sys'), $('.monaco-list-row.focused .monaco-keybinding').attr('key-sys'), ON)
if( +$('.monaco-list-row.focused .monaco-keybinding').attr('key-count') <= 0
|| $('.monaco-list-row.focused .monaco-keybinding').attr('key-sys') === String(ON) ) //不可设置
return false;
let bindWidth = $('.keybindings-editor').width();
let bindHeight = $('.keybindings-editor').height();
let inputWidth = $('.defineKeybindingWidget').outerWidth();
let inputHeight = $('.defineKeybindingWidget').outerHeight();
let index = $('.monaco-list-row.focused').attr('data-index');
$('.defineKeybindingWidget').css({left: `${(bindWidth-inputWidth)/2}px`, top: `${(bindHeight-inputHeight)/2}px`})
.attr({'data-index': index});
let key_id = $('.monaco-list-row.focused').find('.monaco-keybinding').attr('key-id');
let key_str = $('.monaco-list-row.focused').find('.monaco-keybinding').attr('key-str');
let key_count = $('.monaco-list-row.focused').find('.monaco-keybinding').attr('key-count');
let delimiter = $('.monaco-list-row.focused').find('.monaco-keybinding').attr('key-delimiter');
$('.defineKeybindingWidget .monaco-keybinding').attr({'key-id': key_id, 'key-str': key_str, 'key-count': key_count, 'key-delimiter': delimiter, 'key-str-temp': ''});
$('.defineKeybindingWidget .existingText').text('');
let key_count_str = +key_count===1 ? '' : `(${key_count}组)`;
$('.defineKeybindingWidget .message').text(`先按所需的组合键${key_count_str},再按 Enter 键。`);
$('.defineKeybindingWidget .monaco-keybinding').empty();
$('.overlay-container').show();
$('.defineKeybindingWidget input').val('').focus();
oldkeystr = '';
oldwheelstr = '';
set_input_event(ON);
//set_widget(key_str); //可以在显示时初始化
}
if (open !== ON){
$('body').off('keydown.hhh_widget_listrow');
$main.find('.monaco-list-rows').off('click.hhh_widget_listrow');
$main.find('.monaco-list-rows').off('dblclick.hhh_widget_listrow');
}else{
//--------
//keydown
$('body').off('keydown.hhh_widget_listrow');
$('body').on ('keydown.hhh_widget_listrow',function(e){
if(config.group !== 'keyBinding') return; //选择执行 key event
let kcode = kb.getkeyCode(e.keyCode);
if(kcode === 'Enter'){
key_input_run();
e.stopImmediatePropagation()
e.preventDefault()
}else if(kcode === '↑' || kcode === '↓' ){
let $next_prev = $('.monaco-list-row.focused').next();
if(kcode === '↑'){
$next_prev = $('.monaco-list-row.focused').prev();
}
if($next_prev.length !== 0 && $next_prev.css('display') !== 'none'){
$('.monaco-list-row.focused').removeClass('focused');
$next_prev.addClass('focused');
}else{
$next_prev = $('.monaco-list-row.focused');
}
let rows_top = +Math.abs($scroll_element.find('.monaco-list-rows').css('top').split('px')[0]);
let screen_height = $('.monaco-list').height();
let focus_row_top = +$next_prev.css('top').split('px')[0];
let focus_row_bottom = focus_row_top + $next_prev.height();
let focus_row_virtual_top = focus_row_bottom - screen_height;
if(rows_top > focus_row_top) {
scroll_updata($scroll_element, {top: -focus_row_top});
}else if(rows_top < focus_row_virtual_top) {
scroll_updata($scroll_element, {top: -focus_row_virtual_top});
}
e.stopImmediatePropagation()
e.preventDefault()
//log('curr_row_top: '+focus_row_bottom+' - rows_top: '+rows_top+' - focus_row_virtual_top: '+(focus_row_bottom-screen_height))
}
});
//------------------
//click && dblclick
$main.find('.monaco-list-rows').off('click.hhh_widget_listrow');
$main.find('.monaco-list-rows').off('dblclick.hhh_widget_listrow');
$main.find('.monaco-list-rows').on ('click.hhh_widget_listrow',function(e){
let $target = $(e.target);
$('.monaco-list-row').removeClass('focused');
$target.parents(".monaco-list-row").addClass('focused');
}).on('dblclick.hhh_widget_listrow',function(){
key_input_run();
});
//------------------
//mouseenter & mouseleave
$main.find('.monaco-list-row').off('click.hhh_widget_listrow');
$main.find('.monaco-list-row').off('mouseenter.hhh_widget_listrow');
$main.find('.monaco-list-row').off('mouseleave.hhh_widget_listrow');
$main.find('.monaco-list-row').on ('mouseenter.hhh_widget_listrow',function(){
let key_id = $(this).find('.monaco-keybinding').attr('key-id') // 第三个
let keycount = config.getKeySettingKeycount(key_id)
if(keycount > 0){
$(this).find('.monaco-table-td:first>.usable-sign').hide()
$(this).find('.monaco-table-td:first>.usable-hover').show()
}
}).on('mouseleave.hhh_widget_listrow',function(){
let key_id = $(this).find('.monaco-keybinding').attr('key-id') // 第三个
let keycount = config.getKeySettingKeycount(key_id)
if(keycount > 0){
$(this).find('.monaco-table-td:first>.usable-hover').hide()
if(config.getKeySettingNonuse(key_id) === ON){
$(this).find('.monaco-table-td:first>.usable-sign').show()
}else{
$(this).find('.monaco-table-td:first>.usable-sign').hide()
}
}
}).on('click.hhh_widget_listrow',function(e){
let $target = $(e.target)
if((e.target.className === 'monaco-table-td' && $target.index() === 0) || $target.parents(".monaco-table-td").index() === 0){ // 第一个
let key_id = $(this).find('.monaco-keybinding').attr('key-id') // 第三个
let keycount = config.getKeySettingKeycount(key_id)
if(keycount > 0){
$(this).find('.monaco-table-td:first>.usable-hover').hide()
let nonuse = !config.getKeySettingNonuse(key_id)
config.setKeySettingNonuse(key_id, nonuse)
config.storageCheckboxSetting()
function showtip(title, $target){
tip_create_3_X({ target: $target, tip_target: $('#hhh_tip'), color: '#cd5c5c', title: title, delay: 1, duration: 1000, gap: 1, once: ON })
}
if(nonuse === ON){
$(this).find('.monaco-table-td:first>.usable-sign').show()
showtip('已屏蔽', $(this).find('.monaco-table-td'))
}else{
$(this).find('.monaco-table-td:first>.usable-sign').hide()
showtip('解除屏蔽', $(this).find('.monaco-table-td'))
}
$(this).toggleClass('mask')
return false
}
}
});
}
}
init_list_row();
set_listrow_event(ON);
// $('.bpx-player-dm-setting').mouseenter()
// $('#hhh_custom').click()
// $('#keyBinding').click()
// $('#hhh_item>div:first').css({'height':'max-content','width':'max-content'})
// {
// "key": "ctrl+h",
// "command": "workbench.action.tasks.runTask",
// "args": {
// "task": "VS Code - Build",
// "type": "npm"
// }
// }
}
//自定义快捷键设置
//ON - 启用热键,OFF - 关闭热键
function set_hotkey(open){
if (open !== ON){
$(document).off('keyup.hhh_lightoff')
$(document).off('keydown.hhh_lightoff')
$(document).off('mousewheel.hhh_lightoff')
$(document).off('DOMMouseScroll.hhh_lightoff')
}else{
var parent = document;
var like_shake = false;
var prev_time = 0;
var old_index = app_page_parameters.player_setting_area;
is_show_hint = config.getCheckboxSettingStatus('hotKeyHint');
let time1 = 0, time2 = 0, diff = 0;
// eslint-disable-next-line no-inner-declarations
function hot_run(e){
let id, text, index, key, status
let keybindings = config.findKeyBinding(kb.delSpace(kb.stringifyKeyCode(e)))
if(keybindings.length === 0) return
let nonuse = keybindings[0]['nonuse'] //控制执行当前热键
let is_system_key = keybindings[0]['is_system_key'] //是否是系统热键
// log('①',id,nonuse)
// e.type === 'keydown' && log('--1--',keybindings)
if(is_system_key === ON && nonuse === ON){ e.preventDefault(); e.stopPropagation(); return }
if(nonuse !== ON){
id = keybindings[0]['id']
text = e.type === 'keyup' ? keybindings[0]['text'] + e.type : keybindings[0]['text']
index = keybindings[0]['index']
key = keybindings[0]['key']
// setInterval((e) => {
// log(count)
// count = 0
// }, 1000);
//特例
if((e.type === 'mousewheel' || e.type === 'DOMMouseScroll') && text !== '非全屏音量调节${step}%'){
e.preventDefault()
e.stopPropagation()
}
// log(id)
// log(text)
// log(text+id)
// log('非全屏音量调节\${step}%'+id)
// log((text+id) === '非全屏音量调节\${step}%'+id)
if(text === '快进/快退时显示醒目进度条'){ //快进时显示醒目进度条 && 段落循环
//log( $('#hhh_loop_wrap')[0].hhh_loop_time_id );
// if(0&&$('#hhh_loop_wrap')[0].hhh_loop_time_id === true){
// return false;
// }else{
if(config.getCheckboxSettingStatus('reloadDanmuku') === ON) {
//恢复重载弹幕效果
e.stopPropagation();
h5Player.currentTime = index === 0 ? h5Player.currentTime - 5 : h5Player.currentTime + 5;
h5Player.play();
setTimeout(function(){
$(bb['danmakuSwitch']).last().find('input').click();
$(bb['danmakuSwitch']).last().find('input').click();
},0);
}
//快进/快退时显示醒目进度条
dynamicProgress(12, 2)
//按↔取消自定义播放下一P提示
if($('.bpx-player-toast-wrap .bpx-player-toast-text').text().match('秒钟后播放下一P') !== null){
$('.bpx-player-toast-wrap .bpx-player-toast-cancel').click()
return false
}
//}
} else if(text === '合理空格键') { //空格键2.X版本不合理,改成和3.X版本一样,3.X版也o了
if( config.getCheckboxSettingStatus('dynamicSpace') === ON && !is_fullscreen()){
if(g_is_in_biliplayer === false) e.stopPropagation()
}
} else if(text === '优先取消右键菜单等') { //优先取消右键菜单等 Esc
//右键菜单
if($(bb['hotkeyPanel']).length === 1 && ($(bb['hotkeyPanel']).hasClass('active') === true || $(bb['hotkeyPanel']).css('display') !== 'none')){
//$(bb['hotkeyPanel']).removeClass('active').css('display', 'none');
$(bb['hotkeyPanel']).find(bb['hotkeyPanelClose']).click(); //慢
return false;
}
//右键菜单
if($(bb['playerContextMenu']).hasClass('active') === true || $(bb['playerContextMenu']).hasClass('bpx-player-active') === true ){
let evt = new MouseEvent('contextmenu', { clientX:-9999, clientY:-9999 });
$(bb['videoWrap'])[0].dispatchEvent(evt);
return false;
}
//封面
if($('#hhh_img').length > 0 && $('#hhh_img').css('display') !== 'none'){
$('#hhh_img').css('display', 'none');
return false;
}
//关闭打开的评论区图片
if($('#hhh_show_image_wrap').length > 0){
$('.operation-btn-icon.close-container').click()
return false;
}
//自定义播放下一P提示
if($('.bpx-player-toast-wrap .bpx-player-toast-text').text().match('秒钟后播放下一P') !== null){
$('.bpx-player-toast-wrap .bpx-player-toast-cancel').click()
return false
}
} else if(text === '有投币框时回车投币') { //有投币框时回车投币 Enter
//log($(bb['coinDlgOkBtn']).length)
// if($(bb['coinDlgOkBtn']).length === 1){
// $(bb['coinDlgOkBtn']).click();
// }
} else if(text === '关灯/开灯') { //开关灯
$('#hhh_lightoff input').click();
} else if(text+id === '非全屏音量调节${step}%'+'onePerVolumeControl') { //非全屏音量调节 0~1 (b站默认"滚轮"(如果使用滚轮的话)操作某些情况会失效,一并处理全屏情况)
//两个参数指定屏幕范围(按百分比),第三个参数表示滚动一下增加的音量百分比,参数四表示暂停时是否调节
let delta = 1 //默认1%
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'step') { delta = parseInt(v.value); break }
}
let args = config.getCheckboxSettingArgs('volumeControlWhenNonFullScreen'),
isWheelVolume = config.getCheckboxSettingStatus('volumeControlWhenNonFullScreen'),
screen_left = args.screen_left,
screen_rght = args.screen_rght,
isPauseVolume = config.getCheckboxSettingStatus('volumeControlWhenPause');
if(isWheelVolume === OFF) return;
//缺省屏幕百分比参数,默认0.3~0.7
screen_left = (screen_left<0 || screen_left>1)? 0.3: screen_left;
screen_rght = (screen_rght<0 || screen_rght>1)? 0.7: screen_rght;
//缺省音量百分比,默认1
delta = (delta<1 || delta>100)? 1: delta;
//非暂停(可选) && 鼠标在屏幕指定位置时处理
let isPauseStillRun = isPauseVolume || h5Player.paused === false;
let Rect = $(bb['videoWrap'])[0].getBoundingClientRect();
let offsetX = e.originalEvent.x - Rect.x;
let inLimit = offsetX > Rect.width*screen_left && offsetX < Rect.width*screen_rght;
if(is_fullscreen() || (isPauseStillRun && (inLimit || (!e.type.includes('wheel') && e.type !== 'DOMMouseScroll') ))) {
//阻止页面滚动 && 阻止冒泡
if (e.type.includes('wheel') || e.type === 'DOMMouseScroll') {
e.preventDefault();
e.stopPropagation();
}
let v = volume();
if(index === 0 || index === 2) { //向上滚动,减少音量
volume(+(v+(delta/100)).toFixed(3)); //+ string to number
} else if(index === 1 || index === 3) { //向下滚动,增大音量
volume(+(v-(delta/100)).toFixed(3));
}
}
} else if(text+id === '非全屏音量调节${step}%'+'fivePerVolumeControl') { //音量控制,替换系统默认 let tempargs = config.getCheckboxSettingTempArgs(key);
let delta = 0.05 //默认5%
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'step') { delta = parseInt(v.value)/100; break }
}
let diff = index === 0 ? delta : -delta
window.setTimeout((function() { //长按时保持DOM更新
//volume(volume()+diff);
let vol = (volume() + diff).toFixed(2)
volume(diff > 0 ? Math.floor(vol*20)/20 : Math.ceil(vol*20)/20) // 5%的倍数
}),10);
return false;
} else if(text === '全屏') { //全屏
fullscreen();
} else if(text === '网页全屏') { //网页全屏 B站改成点赞了
web_fullscreen();
e.stopPropagation();
} else if(text === '宽屏模式') { //宽屏模式 B站改成投币了
is_fullscreen() ? web_fullscreen() : wide_screen();
e.stopPropagation();
} else if(text === '开关顶部/底部弹幕') { //开关顶部弹幕
if(index === 0){
$(bb['danmukuTopClose']).length === 0 ? showHint(parent, '#hhh_wordsHint', '关闭顶部弹幕') : showHint(parent, '#hhh_wordsHint', '打开顶部弹幕');
dm_remember(function(){$(bb['danmukuTop']).click()});
}else{
$(bb['danmukuBottomClose']).length === 0 ? showHint(parent, '#hhh_wordsHint', '关闭底部弹幕') : showHint(parent, '#hhh_wordsHint', '打开底部弹幕');
dm_remember(function(){$(bb['danmukuBottom']).click()});
}
} else if(text === '开关弹幕') { //开关弹幕 bilibili增加了关弹幕的快捷键,也是D
$(bb['danmakuSwitch']).last().find('input').click();
is_show_hint && (is_danmaku_show() === true ? showHint(parent, '#hhh_wordsHint', '开弹幕') : showHint(parent, '#hhh_wordsHint', '关弹幕'));
e.stopPropagation();
} else if(text === '洗脑循环') { //开关洗脑循环 B站改成一键三连了
$(bb['playSettingRepeatInput'])[0].checked ? showHint(parent, '#hhh_wordsHint', '关洗脑循环') : showHint(parent, '#hhh_wordsHint', '开洗脑循环');
$(bb['playSettingRepeatInput']).click();
e.stopPropagation();
} else if(text === '弹幕随屏幕缩放') { //弹幕随屏幕缩放
$(bb['settingFs'])[0].checked === false ? showHint(parent, '#hhh_wordsHint', '弹幕随屏幕缩放') : showHint(parent, '#hhh_wordsHint', '弹幕不随屏幕缩放');
dm_remember(function(){$(bb['settingFs']).click()});
} else if(text === '增减弹幕透明度${step}%' ) { //滚轮调节弹幕透明度(ctrl+滚轮),参数表示滚动一下增加的透明度百分比
if(config.getCheckboxSettingStatus('danmuOpacityControl') === OFF) return;
//阻止页面滚动 && 阻止冒泡
//e.preventDefault();
//e.stopPropagation();
//缺省透明度百分比,默认5
let delta = 5 //默认5%
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'step') { delta = parseInt(v.value); break }
}
//let delta = parseInt(config.getCheckboxSettingArgs('danmuOpacityControl').delta);
delta = (delta<0 || delta>100)? 5: delta;
var opacity;
if(index === 0) { //向上滚动,增大透明度
opacity = adjust_progress(bb['settingOpacity'], delta, 10, 100);
} else if(index === 1) { //向下滚动,减少透明度
opacity = adjust_progress(bb['settingOpacity'], -delta, 10, 100);
}
if(opacity !== undefined) showHint(document, '#hhh_opacityHint', '透 '+opacity);
} else if(text === '减增弹幕透明度${step}%') { //+ -弹幕透明度
let inc_percent = 10 //默认10%
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'step') { inc_percent = parseInt(v.value); break }
}
inc_percent = index === 0 ? -inc_percent : inc_percent;
window.setTimeout((function() { //长按时保持DOM更新
dm_remember(function(){
let opacity = adjust_progress(bb['settingOpacity'], inc_percent, 10, 100);
showHint(parent, '#hhh_opacityHint', '透 ' + opacity);
});
}),10);
} else if(text === '减增弹幕字号${step}%') { //+ -弹幕字号
let inc_percent = 10 //默认10%
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'step') { inc_percent = parseInt(v.value); break }
}
inc_percent = index === 0 ? -inc_percent : inc_percent;
//let inc_percent = index === 0 ? -10 : 10;
window.setTimeout((function() { //长按时保持DOM更新
dm_remember(function(){
let opacity = adjust_progress(bb['settingFontsize'], inc_percent, 50, 170);
showHint(parent, '#hhh_opacityHint', '字 ' + opacity);
});
}),10);
} else if(text === '弹幕显示区域 1/4屏~不限') { //弹幕显示区域
dm_remember(function(){
var area_text = {0:'1/10屏', 25:'1/4屏', 50:'半屏', 75:'3/4屏', 100:'全屏'};
var percent = index * 25; //((0~4)*25)%
//弹幕显示区域大到小切换时清空弹幕
if(old_index > index){
setTimeout(function(){
$(bb['danmakuSwitch']).last().find('input').click();
$(bb['danmakuSwitch']).last().find('input').click();
},0);
}
old_index = index;
set_progress(bb['settingArea'], percent, 0, 100);
showHint(parent, '#hhh_wordsHint', area_text[percent]);
});
} else if(text === '快进/快退${second}s') { //+ -30s ctrl+ left/right
h5Player = geth5Player()
$(bb['danmakuSwitch']).last().find('input').click().click()
let second = 30 //默认30s
for(let v of config.getCheckboxSettingTempArgs(id)){
if(v?.name === 'second') { second = parseInt(v.value); break }
}
h5Player.currentTime = index === 0 ? +h5Player.currentTime - second : +h5Player.currentTime + second;
h5Player.play();
dynamicProgress(12, 2);
} else if(text === '逐帧操作') { //逐帧 shift+ left/right
time2 = new Date().getTime(); diff += time2 - time1; time1 = time2;
if(diff > 150) { //避免连续按键时间间隔过短造成画面停止
diff = 0
h5Player.pause();
for(let move_frames = 1.01; move_frames>0.1;){
let move_frames_time = move_frames/fps;
h5Player.currentTime = index === 0 ? +(h5Player.currentTime - move_frames_time).toFixed(3) : +(h5Player.currentTime + move_frames_time).toFixed(3);
if(prev_time === h5Player.currentTime){ //如果未走帧
move_frames /= 2;
//log('2.1: h5currTime: '+h5Player.currentTime+' - prev_time: '+prev_time+' - '+move_frames_time+' - '+move_frames);
continue;
}
else{
//log('2.2: h5currTime: '+h5Player.currentTime+' - prev_time: '+prev_time+' - '+move_frames_time+' - '+move_frames);
let total_frame = +(h5Player.duration*fps).toFixed();
let current_frame = +(h5Player.currentTime*fps).toFixed();
showHint(parent, '#hhh_wordsHint', `${current_frame}/${total_frame}`);
prev_time = h5Player.currentTime;
break;
}
}
e.stopPropagation();
}
} else if(text === '调节视频播放速度') { //ctrl + ↑↓
if(config.getCheckboxSettingStatus('keyVideoSpeed') === OFF) return;
window.setTimeout((function() { //长按时保持DOM更新
index === 0 ? video_select_speed(1) : video_select_speed(-1);
}),10);
} else if(text === '0.1倍速调节视频播放速度') { //ctrl + '0'&'.'
window.setTimeout((function() { //长按时保持DOM更新
index === 0 ? video_speed_0dot1(0.1) : video_speed_0dot1(-0.1);
}),10);
} else if(text === '调节自定义倍速速度') { //shift + ↑↓
if(config.getCheckboxSettingStatus('customPlayRate') === OFF) return
const args = config.getCheckboxSettingArgs('customPlayRate')
const newrate = Math.max(0, (index === 0 ? +args.rate + 0.5 : +args.rate - 0.5))
const new_args = {rate: newrate}
//log(newrate, args.rate, config.getCheckboxSettingArgs('customPlayRate')['rate'])
config.setCheckboxSettingArgs('customPlayRate', {...args, ...new_args})
showHint(parent, '#hhh_wordsHint', `→${newrate.toFixed(1)}x`)
customPlayRate(config.getCheckboxSettingStatus('customPlayRate'), +config.getCheckboxSettingArgs('customPlayRate')['rate']);
} else if(text === '开关字幕') { //E
subtitle()
e.stopPropagation()
} else if(text === '开关稍后再看') { //H
is_watchlater_added() !== undefined && (is_watchlater_added() === false ? showHint(parent, '#hhh_wordsHint', '已加稍后再看') : showHint(parent, '#hhh_wordsHint', '已从稍后再看列表中移除')) //有延迟
watchLater()
e.stopPropagation()
} else if(text === '点赞、投币、收藏、长按一键三连') { //长按一键三连(keydown) - 对应系统快捷键 Q、R、W、E
if(index === 0 || index === 3){ //点赞、三连
$(bb['like'])[0].dispatchEvent( new MouseEvent('mousedown',{ bubbles:true }) )
$(bb['like'])[0].dispatchEvent( new MouseEvent('mouseup',{ bubbles:true }) )
if(like_shake === false) like_shake = !!$('.van-icon-videodetails_like.shake').length;
}else if(index === 1){ //投币
$(bb['coin']).click();
set_dialog('coin', 'hhh_test_coin')
}else if(index === 2){ //收藏
$(bb['collect']).click();
}
} else if(text === '点赞、投币、收藏、长按一键三连'+'keyup') { //点赞;长按一键三连(keyup)
if(index === 0 || index === 1){
$(bb['like'])[0].dispatchEvent(new MouseEvent('mouseup'));
if(index === 0 && like_shake === false) {
let like_text = $(bb['like']).text().match(/.+/)[0];
let like_num = like_text.match(/\d+$/)? (+like_text.match(/\d+$/)[0])+1: like_text;
if($(bb['likeon']).length === 1) showHint(parent, '#hhh_wordsHint', '取消点赞');
else showHint(parent, '#hhh_wordsHint', `点赞成功 ${like_num}`);
$(bb['like']).click();
}
like_shake = false;
}
} else if(text === 'list播放方式切换') { //list播放方式切换
$('#hhh_auto_list_play .handoff-item.on').next().add($('.handoff .handoff-item:first')).click()
showHint(parent, '#hhh_wordsHint', $('#hhh_auto_list_play .handoff-item.on').text())
//TEST
} else if(e.type === 'keydown' && (e.keyCode === 'X'.charCodeAt() || e.keyCode === keycode['/'])) { //TEST 显示、隐藏video-control、高能进度条
if(bb_type.indexOf(BILI_2_X) !== -1){
if($(bb['playArea']).hasClass('video-control-show') === true) $(bb['playVideoControlWrap']).mouseout();
else $(bb['playVideoControlWrap']).mousemove();
}else{
if($('.bpx-player-container').attr('data-ctrl-hidden') === "true"){
$('.bpx-player-container').attr('data-ctrl-hidden', "false");
$('.bpx-player-control-entity').attr('data-shadow-show','false');
$(bb['playPBP']).addClass('show') //高能进度条
}else{
$('.bpx-player-container').attr('data-ctrl-hidden', "true");
$('.bpx-player-control-entity').attr('data-shadow-show','true');
$(bb['playPBP']).removeClass('show')
}
}
} else if(e.type === 'keydown' && (e.keyCode === 'H'.charCodeAt())) { //TEST
//if(bb_type===BILI_3_X_MOVIE) $('.bpx-player-dm-setting-wrap').css('display','block');
$('.bilibili-player-video-danmaku-setting-wrap').mouseover();
//$('.bilibili-player-area.video-state-blackside').attr('class', 'bilibili-player-area video-state-blackside video-state-pause video-control-show');
} else{
//console.dir(e.keyCode);
}
}
// let syskey = ['Q','W','E','R','Space','→','←','↑','↓','Esc','F','[',']','Enter','D','M','Shift+1','Shift+2']
//屏蔽系统快捷键
if(e.type === 'keydown'){
// log('---syskey---', e.key, e.ctrlKey, e.shiftKey, e.altKey)
// log('keybindings',keybindings)
for(let i=0; i
= 0 ? '300' : '301'; //滚轮上滚和下滚
return hot_run(e);
})
//firefox
$(bb['videoWrap']).off('DOMMouseScroll.hhh_lightoff');
$(bb['videoWrap']).on('DOMMouseScroll.hhh_lightoff',function(e){
//处理键盘及鼠标
e.keyCode = e.detail < 0 ? '300' : '301' //滚轮上滚和下滚
return hot_run(e)
})
}
global_binding_key();
global_binding_wheel();
}
}
//初始化自定义设置 节点 事件 tip
//setting - wrap - box | wrap - move - item
function init_setting(run_default_setting_flag){
var $DSet = $(bb['dm']);
var $wrap = $DSet.find('.bui-panel-wrap');
var $move = $DSet.find('.bui-panel-move');
var $item_0 = $DSet.find('.bui-panel-item:eq(0)');
var $item_1 = $DSet.find('.bui-panel-item:eq(1)');
var $item_2;
var old_width = $item_0.width() + $item_1.width() + 5;
var item_0_height = $item_0.height() + 36;
//var item_2_width = 'auto'; // todo
//var item_2_height = 100 + 18 * 22;
//
if($DSet.length!=1 || $wrap.length!=1 || $move.length!=1) log('init_setting失败');
if($item_0.length!=1 || $item_1.length!=1) log('init_setting失败2');
/*-----------------------------------
* 初始化
*----------------------------------*/
//初始化【$item_0】高度
$item_0.css('height', item_0_height);$wrap
$item_0[0].hhh_new_height = item_0_height;
//初始化【$move】宽度
//$DSet.find('.bui-panel-move').css('width', old_width + item_2_width);
//$move.css('width', '10000px'); //留出足够空间,省事 后面值会改变
/*-----------------------------------
* 复制所需节点
*----------------------------------*/
//复制【item_0】【高级设置】To【自定义设置】
$(bb['dmLeftMore']).clone().appendTo(bb['dmLeft']).attr('id', 'hhh_custom')
.css('top', '20px')
.find(bb['dmLeftMoreText']).text('自定义设置');
//复制【item_1】 To 【item_2】
$item_2 = $item_1.clone().appendTo($move).attr('id', 'hhh_item')
.css({'width':'auto', 'height':'auto'})
.removeClass('bui-panel-item-active')
.find('div *').remove().end();
//复制【分割线】模板
var $separator = $item_1.find(`${bb['dmRightSeparator']}:first`).clone();
//复制【$title $hotkey父节点】模板
var $title_div = $item_0.find(bb['dmLeftBlock']).clone().attr('id', 'hhh_title_div')
//.css({'display': 'flex', 'flex-direction': 'column'})
.empty().css({'margin-top': 6, 'margin-bottom': 2, 'height': 32+0});
//复制【title】模板
var $title = $item_0.find(bb['dmLeftBlockTitle']).clone().css({'color': '#12b3e8'})
.css({'display': 'inline-flex', 'line-height': '32px'})
.text('bilibili关灯自定义设置');
//复制【快捷键说明】模板
var $hotkey = $item_1.find(bb['dmRightMore']).clone().attr('id', 'hhh_item_2_hotkey')
.css({'display': 'inline-flex', 'float': 'right'})
.find('span:first').remove().end()
.find(bb['dmRightMoreText']).text('快捷键说明(点击切换)').end();
//
var $div = $('');
var $middle_div = $div.clone().attr('id','hhh_middle_div').css({'display':'flex', 'justify-content':'space-between'})
//.css({'widht':'400px'})
//.css('background', 'blue')
;
//复制【封面】模板
var $cover = $item_1.find(bb['dmRightMore']).clone().attr('id', 'hhh_item_2_cover')
//.css({'display': 'inline-flex', 'float': 'right', 'flex-direction': 'row-reverse'})
//.css({'float': 'right'})
.find('span:first').remove().end()
.find(bb['dmRightMoreText']).text('显示封面(点击切换)').end();
//复制【input-checkbox父节点】模板
var $input_div = $item_0.find(bb['dmLeftBlock']).clone().attr('id', 'hhh_input_div')
.empty().css({'margin-top': 4, 'margin-bottom': 2})
.css('padding-right', '10px')
//.css('background', 'red')
//.css('width', 'auto')
;
//复制【更多其他】模板
var $group_div = $item_0.find(bb['dmLeftBlock']).clone().attr('id', 'hhh_group_div')
.empty().css({'margin-top': 4, 'margin-bottom': 2})
//.css('background', 'yellow')
.css('width', 123)
//.css('height', 100)
;
//复制【input-checkbox】模板
var $input = $item_0.find(bb['dmLeftFs']).clone().find('input').removeAttr('aria-label').prop('checked', false).end()
.find('.bui-checkbox-name').text('bilibili关灯').end()
.appendTo($div.clone()).parent().css({display: 'flex', 'margin-top': '6px'})
;
//复制【恢复默认设置】模板
var $reset = $item_1.find(bb['dmRightReset']).clone().css({'margin-top': 6, 'margin-bottom': 6, width: 'auto'})
.find('div').text('恢复默认设置(如有配置错误请尝试点击)').end()
;
//复制【返回】模板
var $reback = $item_1.find(bb['dmRightMore']).clone().attr('id', 'hhh_item_2_more')
.css({'margin-top': 2, 'margin-bottom': 5, 'margin-right': 10})
.find(bb['dmRightMoreText'])
.text('返回').end();
/*-----------------------------------
* 添加节点
*----------------------------------*/
let $item_2_div = $item_2.children(':first');
/*-----------------------------------
* 上部div
*----------------------------------*/
//添加title hotkey
$title_div.appendTo($item_2_div);
$title.clone().appendTo($title_div);
$hotkey.clone().appendTo($($title_div));
//添加分割线
$separator.clone().appendTo($item_2_div);
/*-----------------------------------
* 中部div
*----------------------------------*/
$middle_div.appendTo($item_2_div);
$input_div.appendTo($middle_div);
$group_div.appendTo($middle_div);
//添加封面
$cover.appendTo($group_div);
//test
// $input_div.css('border','1px red solid'); //红色 input
// $group_div.css('border','1px gold solid'); //黄色 group
// $middle_div.css('border','1px green solid'); //绿色
// $item_2_div.css('border','1px cyan solid'); //青色
//$input_div.css('width','500px');
//$group_div.css('width','300px');
//$middle_div.css('width','atuo'); ////
//$item_2_div.css('width','700px');
//log($input_div.width()+' '+$group_div.width()+' '+$middle_div.width()+' '+$item_2_div.width());
// $('.bpx-player-dm-setting').mouseenter()
// $('#hhh_custom').click()
// $('#keyBinding').click()
// $('#hhh_item>div:first').css({'height':'max-content','width':'max-content'})
// $('.bui-panel-wrap').css({'height': $('#hhh_item').css('height'), 'width': $('#hhh_item').css('width')});
// $move.css('transform', `translateX(-${old_width}px)`);
// $('#commonCheckbox').click()
// $('.bui-panel-wrap').width(350)
// $('.bui-panel-wrap').height(700)
//设置复选框
let input_max_width = 0;
let input_number_max_width = 0;
let all_checkbox_width = 'auto';
//更新选择框设置(二级)
function checkbox_args_update(key, status){
let $setting_input = $(`#${key} .hhh-bpx-player-dm-setting_container input`);
$setting_input.prop('disabled', !status);
if(status === ON) $setting_input.css({color: '#cccccc', border: '1px solid #00a1d699'});
else $setting_input.css({color: '#cccccc66', border: '1px solid #ffffff33'});
}
//fn run
function checkbox_fn_run(key, status, fn, args){
//执行fn等
if(key === 'volumeControlWhenNonFullScreen'){
//let pause_status = config.getCheckboxSettingStatus('volumeControlWhenPause');
//eval(`${fn}(${status}, ${args.screen_left}, ${args.screen_rght}, ${args.delta}, ${pause_status})`);
} else if(key === 'volumeControlWhenPause'){
//let non_full_status = config.getCheckboxSettingStatus('volumeControlWhenNonFullScreen');
//let fn = config.getCheckboxSettingFn('volumeControlWhenNonFullScreen');
//let args = config.getCheckboxSettingArgs('volumeControlWhenNonFullScreen');
//eval(`${fn}(${non_full_status}, ${args.screen_left}, ${args.screen_rght}, ${args.delta}, ${status})`);
} else if(key === 'danmuOpacityControl'){
//eval(`${fn}(${status}, ${args.delta})`)
} else if(key === 'hotKeyHint'){
is_show_hint = config.getCheckboxSettingStatus(key)
} else if(key === 'expandList'){
eval(`${fn}(${status}, ${args.columns})`)
} else if(key === 'expandTitle'){
let fn_name = fn.split('.')[1] || fn.split('.')[0] //执行闭包内导出的函数
let fn2 = g_fn_arr[fn_name]
fn2(status, args.width)
} else if(key === 'customPlayRate'){
eval(`${fn}(${status}, ${args.rate})`)
} else if(key === 'lightOnWhenLike'){
eval(`${fn}(${status}, ${args.screen_top})`)
} else if(key === 'memoryProgress'){
eval(`${fn}(${status}, [ ${config.getCheckboxSettingStatus('sortList')} ])`)
} else if(key === 'autoLike'){
eval(`${fn}(${status}, [ ${config.getCheckboxSettingStatus('likeFollowed')}, ${args.second} ])`)
} else if(key === 'opacityPlayerSendingArea'){
eval(`${fn}(${status}, [ ${args.opacity} ])`)
} else if(key === 'toolbarCloneToDmRoot' || key === 'isRemoveVideoInfo'){
eval(`${config.getCheckboxSettingFn('toolbarCloneToDmRoot')}(${config.getCheckboxSettingStatus('toolbarCloneToDmRoot')}, [ ${config.getCheckboxSettingStatus('isRemoveVideoInfo')} ])`)
} else if(!!fn){ // openHotKey | removeVideoTopMask 等
eval(`${fn}(${status})`)
//new Function(`${fn}(${status})`)(); //与eval相比作用域不同
}
}
//选择框设置(二级)
function checkbox_args_event(){
//---change---
$item_2.find('#hhh_input_div').off('change.hhh_checkbox_args');
$item_2.find('#hhh_input_div').on('change.hhh_checkbox_args', function(e){
let target = e.target;
if(target.name === 'checkbox_setting'){ //选择框设置(二级)
let key = $(target).attr('checkbox_id');
let arg = $(target).attr('arg');
let args = config.getCheckboxSettingArgs(key);
let new_args = {};
if(key === 'customPlayRate'){ //自定义倍速
new_args = {rate: target.value}
}else if(key === 'expandList'){ //订阅合集列表自动展开
new_args = {columns: target.value}
}else if(key === 'expandTitle'){ //订阅合集标题自动展开
new_args = {width: target.value}
}else if(key === 'danmuOpacityControl'){ //弹幕透明度控制
new_args = {delta: target.value}
}else if(key === 'volumeControlWhenNonFullScreen' && arg === 'Left'){ //指定鼠标范围 Left
new_args = {screen_left: target.value}
}else if(key === 'volumeControlWhenNonFullScreen' && arg === 'Right'){ //指定鼠标范围 Right
new_args = {screen_rght: target.value}
}else if(key === 'lightOnWhenLike'){ //下滚时自动开灯,上滚关灯
new_args = {screen_top: target.value}
}else if(key === 'autoLike'){ //XX秒后自动点赞
new_args = {second: target.value}
}else if(key === 'opacityPlayerSendingArea'){ //弹幕发送区域透明度
new_args = {opacity: target.value}
}else if(key === 'videoSpeedDefault'){ //指定视频默认播放速度
new_args = {speed: target.value}
}
config.setCheckboxSettingArgs(key, {...args, ...new_args});
/////////
//log($(target))
//log(target.name+' - '+target.attributes.checkbox_id.value+' = '+$(target).attr('checkbox_id'));
/////////
config.storageCheckboxSetting();
let fn = config.getCheckboxSettingFn(key);
let status = config.getCheckboxSettingStatus(key);
args = config.getCheckboxSettingArgs(key);
checkbox_fn_run(key, status, fn, args);
}
});
//---focus---
$('input[name=checkbox_setting]').off('focus.hhh_checkbox_args');
$('input[name=checkbox_setting]').on ('focus.hhh_checkbox_args', function(){
$(this).css({width: "40px"}).prop('type', 'number');
})
//---blur---
$('input[name=checkbox_setting]').off('blur.hhh_checkbox_args');
$('input[name=checkbox_setting]').on ('blur.hhh_checkbox_args', function(){
$(this).css({width: "25px"}).prop('type', 'tel');
})
//---mouseenter、mouseleave---
$('input[name=checkbox_setting]').off('mouseenter.hhh_checkbox_args');
$('input[name=checkbox_setting]').off('mouseleave.hhh_checkbox_args');
$('input[name=checkbox_setting]').on ('mouseenter.hhh_checkbox_args', function(){
let $this = $(this);
$this.css({width: "40px"}).prop('type', 'number');
let rect = this.getBoundingClientRect();
document.onmousemove = function(e){
let x = e.clientX;
let y = e.clientY;
if(x < rect.left || x > rect.right || y < rect.top || y > rect.bottom ){
$this.mouseleave();
}
}
}).on('mouseleave.hhh_checkbox_args', function(){
let $this = $(this);
document.onmousemove = null;
if(this !== document.activeElement) $this.css({width: "25px"}).prop('type', 'tel');
})
//---keydown---
$('body').off('keydown.hhh_checkbox_args')
$('body').on ('keydown.hhh_checkbox_args', function(e){
// if(config.group === 'commonCheckbox' || config.group === 'otherCheckbox') //选择执行 key event
if(config.group.includes('Checkbox')) //阻止快捷键
e.stopPropagation()
})
}
//初始化选择框设置(二级)
function checkbox_args_init(group){
//define css
append_style($middle_div, 'hhh_style_dm_setting_number',
`
.hhh-bpx-player-dm-setting_container {
display: flex;
}
.hhh-bpx-player-dm-setting-number {
width: 25px;
border: 1px solid #00a1d699;
border-radius: 5px;
/* appearance: none; */
color: #cccccc;
background-color: initial;
margin-left: 5px;
text-align: center;
}
`
)
//creat
for (let [key, {text, status, args}] of Object.entries(config.sets[group].options)) {
if(!args) continue
let name = 'checkbox_setting'
let $container = $(``)
if(key === 'customPlayRate'){ //自定义倍速
$container.append(``)
}else if(key === 'expandList'){ //订阅合集列表自动展开
$container.append(``)
}else if(key === 'expandTitle'){ //订阅合集标题自动展开
$container.append(``)
}else if(key === 'danmuOpacityControl'){ //弹幕透明度控制
$container.append(``)
}else if(key === 'volumeControlWhenNonFullScreen'){ //鼠标在指定屏幕范围内音量调节
$container.append(`
`)
}else if(key === 'lightOnWhenLike'){ //下滚时自动开灯,上滚关灯
$container.append(``)
}else if(key === 'autoLike'){ //自动点赞
$container.append(``)
}else if(key === 'opacityPlayerSendingArea'){ //弹幕发送栏透明度
$container.append(``)
}else if(key === 'videoSpeedDefault'){ //指定视频默认播放速度
$container.append(``)
}
if($container.find(`input[name=${name}]`).length > 0){
$(`#${key}`).append($container)
checkbox_args_update(key, status)
if(bb_type.indexOf(BILI_3_X_VIDEO) !== -1) tip_create_3_X({ target: $container, tip_target: $('#hhh_tip'), color: '#00ffff', title: args.opt.tip[0], gap: 1 })
input_number_max_width = Math.max(input_number_max_width, $(`#${key}`).find('.hhh-bpx-player-dm-setting_container').outerWidth()) //记录最大宽度
//log(input_number_max_width)
}
}
//add event
checkbox_args_event()
}
//设置【checkbox】点击 click
function checkbox_event(){
$item_2.find('#hhh_input_div').off('click.hhh_checkbox');
$item_2.find('#hhh_input_div').on('click.hhh_checkbox', function(e){
let target = e.target;
if(target.type === 'checkbox'){ //一级选择框设置
[prev_video_type, prev_video_type_unique_id] = [undefined, undefined];
let key = bb_type.indexOf(BILI_2_X) !== -1 ? target.parentNode.id : target.parentNode.parentNode.parentNode.id;
let status = target.checked;
//log('checked: '+e.target.checked)
config.setCheckboxSettingStatus(key, status);
config.storageCheckboxSetting();
let fn = config.getCheckboxSettingFn(key);
let args = config.getCheckboxSettingArgs(key);
//设定参数设置
checkbox_args_update(key, status);
checkbox_fn_run(key, status, fn, args);
}
})
}
//生成checkbox
function checkbox_init(group){
let len = 0
//按行添加
for (let [key, {text, level, status, tip, disable, show}] of Object.entries(config.sets[group].options)) {
if(show === OFF) continue
//log(text+' - '+tip)
++len
let $key = $input.clone().appendTo($input_div).attr('id', key).css('width', 'auto')
.find('input').prop('checked', status).end()
.find('.bui-checkbox-name').text(text).end()
input_max_width = Math.max(input_max_width, $key.find('label').outerWidth()) //记录最大宽度
//按级别缩进
if(!!level) {
//console.log('__level__',level)
$key.css({'margin-left': `${level*18}px`})
//$key.addClass('bpx-player-dm-setting-right-separator')
//$key.empty().css({'margin-top': '13px', 'border-top': '1px solid rgba(229,233,239,.1)' ,'height': '8px'})
//$key.css({'margin-bottom': '0px'})
}
//set tips
if(bb_type.indexOf(BILI_2_X) !== -1){
!!tip && add_tip($tip, $key.find('.bpx-player-dm-setting-left-flag-title'), {'text':tip, 'millisec':200, 'top':9, 'left':0})
}else{
!!tip && tip_create_3_X({ target: $key.find(bb['dmLeftFs']), tip_target: $('#hhh_tip'), color: '#00ffff', title: tip, gap: 6 })
}
//禁用
if(disable === ON) {
$key.css({'pointer-events': 'none', 'opacity': 0.3})
}
}
//填充空行
let one_input_height = +$input_div.children(':first').outerHeight() + (+$input_div.children(':first').css('margin-top').match(/\d+/)[0]);
for(; len<=18; len++){
$div.clone().appendTo($input_div).css({height: `${one_input_height}px`});
}
//add event
checkbox_event();
}
//初始化【group】和【checkbox】
function init(){
for(let [group, {options, btn, type}] of Object.entries(config.sets)){
let type_type = ['checkbox', 'key'] //可处理类型
if(type_type.includes(type) !== true) continue
$cover.clone().appendTo($group_div).attr('id', group) //复用封面DOM模板
.css({height: '22px' /*, border: '1px solid hsla(0,0%,100%,.2)'*/})
.find(bb['dmRightMoreText']).text(btn+'(点击)').end();
// $reset.clone().appendTo($group_div).attr('id', group) //复用封面DOM模板
// .css({height: '22px', display: 'flex'}).text(btn+'(点击)');
$(`#${group}`).click(function(){
config.group = group;
//
//if($('body')[0].hhh_body_key_event !== '快捷键设置') return;
//$('body')[0].hhh_body_key_event = group;
//取消激活
let $active = $group_div.find('.active');
let active_text = $active.find(bb['dmRightMoreText']).text();
$active.find(bb['dmRightMoreText']).text(active_text.split('***')[0]);
$active.removeClass('active');
//激活
let text = $(this).find(bb['dmRightMoreText']).text();
$(this).find(bb['dmRightMoreText']).text(text+'***');
$(this).addClass('active');
$input_div.empty();
if(type == 'checkbox') {
checkbox_init(group);
$input_div.css('width', `${all_checkbox_width}`);
$wrap.css({'height': $item_2.css('height'), 'width': $item_2.css('width')});
$move.css('transform', `translateX(-${old_width}px)`);
$('#hhh_item_2_more').parent().css({'justify-content': 'space-between'}); //设置"返回"位置
checkbox_args_init(group);
}else if(type == 'key') {
set_keybindings($input_div);
$input_div.css('width', 'auto');
$('#hhh_item>div:first').css({'height':'max-content','width':'max-content'})
$wrap.css({'height': $item_2.css('height'), 'width': $item_2.css('width')});
$move.css('transform', `translateX(-${old_width}px)`);
$('#hhh_item_2_more').parent().css({'justify-content': 'flex-end'}); //设置"返回"位置
}
})
}
}
init();
//添加恢复默认设置
$reset.appendTo($item_2_div);
//重设置【item_2 - 恢复默认设置】 click
$reset.click(function(){
config.defaultCheckboxSetting();
config.storageCheckboxSetting();
for(let [group, {options, type}] of Object.entries(config.checkboxes)){
if(type === 'checkbox'){
for (let [key, { status, fn, args }] of Object.entries(options)) {
//if(config.getCheckboxSettingStatus(key) === status) continue;
$(`#${key}`).find('input').prop('checked', status);
//设定参数设置
checkbox_args_update(key, status);
checkbox_fn_run(key, status, fn, args);
}
}
}
$(`#${config.group}`).click(); //更新
})
/*-----------------------------------
* 下部div
*----------------------------------*/
//添加分割线
$separator.clone().appendTo($item_2_div);
//添加返回
//$reback.clone().appendTo($item_2_div);
//TEST
let $bottom_div = $div.clone();
$bottom_div.appendTo($item_2_div).css({display:'flex', 'justify-content':'space-between'});
$reback.clone().appendTo($bottom_div);
//总在最上
let $always_top = $input.clone().appendTo($bottom_div).attr('id', 'hhh_always_top').css('width', 'auto')
.css({'margin':'2px 0px 5px 20px'})
.find('input').prop('checked', false).end()
.find('.bui-checkbox-name').text('总在最上').end();
let boserver
$always_top.click(function(e){
if(e.target.type === 'checkbox'){
let checkbox = e.target
if(e.target.checked === ON){
//鼠标离开时panel保持在最上
boserver?.disconnect()
boserver = new MutationObserver((mutations, observer) => {
mutations.forEach(mutation => {
const target = mutation.target
if(typeof target.className === 'string' && target.className !== ''){
//console.log(target.className +' | '+mutation.attributeName)
$(target).show()
}
})
})
boserver.observe($(bb['dmWrap'])[0], { attributes: true })
//鼠标是否在弹幕设置界面内
document.onmouseup = function(e){
let classes = $(':hover').map((i,e)=>e?.className)?.get()
let is_in_dm_setting_panel = classes.includes('bui-panel-wrap')
// log(is_in_dm_setting_panel, classes, e)
if(is_in_dm_setting_panel === false){
document.onmouseup = null
checkbox.checked = OFF
boserver?.disconnect()
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseleave'))
}
}
}else{
document.onmouseup = null
boserver?.disconnect()
}
}
})
/*-----------------------------------
* 添加事件等
*----------------------------------*/
//重设置【自定义设置按钮】
// $DSet.mouseenter(function(){
// $wrap.css('height', $DSet.find('.bui-panel-item-active').css('height'));
// })
//重设置【item_0 - 自定义设置】 click
$('#hhh_custom').click(function(){
$wrap.css({'height': $item_2.css('height'), 'width': $item_2.css('width')});
$move.css('transform', `translateX(-${old_width}px)`);
$DSet.find('.bui-panel-item-active').removeClass('bui-panel-item-active');
$item_2.addClass('bui-panel-item-active');
$(`#${Object.keys(config.sets)[0]}`).click(); //设置第一项
})
//重设置【item_1 - 更多弹幕设置】 click
$item_1.find(bb['dmRightMore']).click(function(){
$item_0.css('height', item_0_height); //会改变item_0长度
$wrap.css({'height': $item_0.css('height'), 'width': $item_0.css('width')});
})
//重设置【item_2 - 返回】 click
$item_2.find('#hhh_item_2_more').click(function(){
$wrap.css({'height': $item_0.css('height'), 'width': $item_0.css('width')});
$move.css('transform', 'translateX(0px)');
$DSet.find('.bui-panel-item-active').removeClass('bui-panel-item-active');
$item_0.addClass('bui-panel-item-active');
})
//重设置【item_2 - 封面】 click
$item_2.find('#hhh_item_2_cover').click(function(){
if($('#hhh_img').length === 1){
let $hhh_img = $('#hhh_img');
//let width = $(bb['video']).width()*0.9;
//$('#hhh_img').css('width', width);
$hhh_img.css('display') === 'none'? $hhh_img.css('display', 'flex'): $hhh_img.css('display', 'none');
} else {
let imgurl = $(bb['coverImg']).attr('content').replace('http:','https:').replace(/@.*/,'')
let $img = $(`
`);
let $d = $div.clone().attr('id', 'hhh_img')
.css({position: 'absolute', top:'50%', left:'50%', transform: 'translate(-50%,-50%)'})
.css({'z-index':`${$(bb['playTipWrap']).css('z-index')}`})
.css({'display':'flex'})
//.css('width',width)
.css({'align-items':'center','justify-content':'center'})
.appendTo($(bb['videoWrap']));
$img.css({width:'100%', height:'auto'}).appendTo($d);
//重设置【item_2 - 封面 - IMG】
$('#hhh_img').click(function(){
$(this).css('display','none');
window.open(imgurl);
})
}
})
//重设置【item_2 - 快捷键说明】 click
let set_hotkey_panel_close = false;
$item_2.find('#hhh_item_2_hotkey').click(function(){
let is_active = bb_type.indexOf(BILI_2_X) !== -1 ? $(bb['hotkeyPanel']).hasClass('active') : $(bb['hotkeyPanel']).css('display') !== 'none';
//2.X和3.X不一样?我来让你一样!
if(is_active === false){
let evt = new MouseEvent('contextmenu', { clientX:-9999, clientY:-9999 });
$(bb['videoWrap'])[0].dispatchEvent(evt);
evt = bb_type.indexOf(BILI_2_X) !== -1? new MouseEvent('click', { bubbles:true }): new MouseEvent('mousedown', { bubbles:true });
let node = bb_type.indexOf(BILI_2_X) !== -1? 'a': 'li';
$(bb['playerContextMenu']).find(`${node}:contains("快捷键说明(bilibili关灯)")`)[0].dispatchEvent(evt);
let $last_system_itme = $('#hhh_last_system_hotkey_panel_item');
$last_system_itme.prevAll().css('display','none');
$last_system_itme.css('display','none');
$last_system_itme.nextAll().css('display','block');
//$(bb['playerContextMenu']).find(`li:contains("快捷键说明(bilibili关灯)")`).mousedown();
let $hotkey = $(bb['hotkeyPanel']);
//let $hotkey = $(bb['hotkeyPanel']).css('z-index', $(bb['playVideoControlWrap']).css('z-index')-1);
//同步显示
// let wrap_left = $(bb['dmWrap']).position().left;
// let box_left = $(bb['dmBox']).position().left;
// $(bb['dmWrap']).css('left', wrap_left + $item_0.width());
// $(bb['dmBox']).css('left', box_left - $item_0.width());
// $(bb['dmWrap']).css('height', $hotkey.innerHeight());
// $(bb['dmWrap']).css('width', $hotkey.innerWidth()-50);
// $(bb['dmBox']).css('width', item_2_width);
//$(bb['dmWrap']).css('background', 'blue').css('opacity', 0.8); //test
//同步隐藏
// waitForTrue(()=> ($(bb['hotkeyPanel']).hasClass('active') === false && $(bb['hotkeyPanel']).css('display') === 'none') || $(bb['dmWrap']).css('display') === 'none', () => {
// //$(bb['hotkeyPanel']).removeClass('active').css('display', 'none');
// $(bb['hotkeyPanelClose']).click();
// });
let new_left = $item_2.offset().left + $item_2.width();
let new_top = $hotkey.offset().top + ($item_2.offset().top + $item_2.height()) - ($hotkey.offset().top + $hotkey.innerHeight());
$hotkey.offset({left:new_left, top:new_top});
//$hotkey.offset({left:new_left, top:new_top}).find(bb['hotkeyPanelClose']).css('display', 'none');
if(set_hotkey_panel_close === false){ //
set_hotkey_panel_close = true;
$(bb['hotkeyPanelClose']).click(function(){
$(bb['hotkeyPanel']).css({left: '50%', top:'50%'});
})
}
}else{
$(bb['hotkeyPanel']).css({left: '50%', top:'50%'});
$(bb['hotkeyPanelClose']).click();
// $(bb['dmWrap'])[0].style.cssText = '';
// $(bb['dmBox'])[0].style.cssText = '';
// $(bb['dmWrap']).css('display', 'block');
}
})
let id = 0;
//重设置弹幕设置触发按钮
$DSet.on('mouseenter', function(){
clearInterval(id);
if ($(bb['dmWrap']).css('display') !== 'none') return;
$item_0.css('height', $item_0[0].hhh_new_height);
$wrap.css({'height': $item_0.css('height'), 'width': $item_0.css('width')});
$move.css('transform', 'translateX(0px)');
$move.css('width', '10000px'); //留出足够空间,省事
$DSet.find('.bui-panel-item-active').removeClass('bui-panel-item-active');
$item_0.addClass('bui-panel-item-active');
$(bb['dmWrap'])[0].style.cssText = '';
$(bb['dmBox'])[0].style.cssText = '';
let dm_right = $('.bpx-player-dm-setting')[0].getBoundingClientRect().right
let dm_max_width = 724 //默认最大宽度
let dm_wrap_cssRight = parseInt($('.bpx-player-dm-setting-wrap').css('right'))
// log('dm_right: '+dm_right)
// log('dm-box_width: '+dm_max_width)
// log('dm-wrap_cssRight: '+dm_wrap_cssRight)
// log(dm_max_width-dm_right-10)
// log($('.bpx-player-dm-setting-wrap').css('right'))
if(dm_right-dm_max_width < dm_wrap_cssRight){
$('.bpx-player-dm-setting-wrap').css('right', dm_right-dm_max_width-10)
}
}).on('mouseleave', function(){ //解决mouseleave和bb['dmWrap']).css('display')不同步的问题
clearInterval(id);
id = setInterval(() => {
if ($(bb['dmWrap']).css('display') !== 'none') return;
clearInterval(id);
let $main = $('.keybindings-editor');
$main.find('.monaco-list-rows').off('click.hhh_widget_listrow');
$main.find('.monaco-list-rows').off('dblclick.hhh_widget_listrow');
$main.find('input').off('keydown.hhh_widget_input');
$main.find('input').off('keyup.hhh_widget_input');
$main.find('input').add('.defineKeybindingWidget').off('mousewheel.hhh_widget_input');
$main.find('input').off('blur.hhh_widget_input');
$('body').off('keydown.hhh_widget_listrow');
$('body').off('keydown.hhh_checkbox_args');
}, 200);
});
// $DSet.on('mouseleave', function(){
// return false;
// })
//执行所有默认设置
if(run_default_setting_flag === 'run_default_setting') $reset.click()
//初始化【checkbox】
$(bb['dmWrap']).find('.bui-panel-wrap').css('visibility', 'hidden') //避免弹幕设置框闪影
$(bb['dmWrap']).find('.bui-panel-move').css('visibility', 'hidden')
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseenter'))
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseover'))
$(bb['dmWrap']).css('visibility', 'hidden')
Object.keys(config.sets).forEach((kname)=>{ if(config.sets[kname].type === 'checkbox') $(`#${kname}`).click() }) //点击所有checkbox,得到最大宽度
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseout'))
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseleave'))
setTimeout(() => {
$(bb['dmWrap']).hide()
$(bb['dmWrap']).css('visibility', 'visible')
$(bb['dmWrap']).find('.bui-panel-wrap').css('visibility', 'visible')
$(bb['dmWrap']).find('.bui-panel-move').css('visibility', 'visible')
}, 0)
all_checkbox_width = input_max_width + input_number_max_width + 'px'
}
//记忆弹幕设置操作
function dm_remember(setting_func){
// if(bb_type.indexOf(BILI_3_X_VIDEO) !== -1) $('.squirtle-controller-wrap').css({"display":"flex"});
// $(bb['dmWrap']).css({"display":"block"});
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseenter'));
//$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseover'));
setting_func();
//$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseout'));
$(bb['dm'])[0].dispatchEvent(new MouseEvent('mouseleave'));
// $(bb['dmWrap']).css({"display":"none"});
// if(bb_type.indexOf(BILI_3_X_VIDEO) !== -1) $('.squirtle-controller-wrap').css({"display":"none"});
}
//因为遮挡弹幕,去掉全屏时鼠标悬停时产生的顶端mask
function removeVideoTopMask(is_remove){
let top_mask_class = bb['videoTopMask'].substr(1);
if(is_remove === ON) $(bb['videoTopMask']).attr('id', top_mask_class).removeClass();
else $(`#${top_mask_class}`).addClass(top_mask_class);
}
//1、播放关灯 2、暂停开灯 3、下滚时开灯 4、跳过充电
function lightOffWhenPlaying(status){
$(h5Player).off('play.hhh'); if(status === OFF) return
$(h5Player).on('play.hhh', ()=> !is_lightoff() && lightoff_hand())
}
function lightOnWhenPause(status){
$(h5Player).off('pause.hhh'); if(status === OFF) return
$(h5Player).on('pause.hhh', ()=> is_lightoff() && lightoff_hand())
}
function lightOnWhenLike(status, screen_top){
$(window).off('scroll.hhh_light_like'); if(status === OFF || biliinfo.hand_lightoff_state === OFF) return
$(window).on('scroll.hhh_light_like', function() {
let $mini = $('.bpx-player-mini-warp')
if($mini.length > 0 && $mini.css('display') !== 'none') return
const video_top = $('.bpx-player-video-area')[0].getBoundingClientRect().top - $('#biliMainHeader').height()// + $('#biliMainHeader').height()
const light_on_limit = $('.bpx-player-video-area')[0].getBoundingClientRect().height * screen_top
// log(-video_top, light_on_limit, screen_top)
// if(-video_top >= light_on_limit) is_lightoff() && lightoff_hand(LIGHTON_LIKE)
// else !is_lightoff() && lightoff_hand(LIGHTON_LIKE)
if(-video_top >= light_on_limit) is_lightoff() && lightoff_run()
else !is_lightoff() && lightoff_run()
})
}
function jumpElectric(status){
$(h5Player).off('ended.hhh'); if(status === OFF) return;
$(h5Player).on('ended.hhh', ()=> $(bb['playJumpElectric']).click())
}
//自动打开弹幕
function autoOpenDanmu(){
let ob = new MutationObserver((mutations, observer) => {
for (var mutation of mutations) {
let $target = $(mutation.target)
if($target.hasClass('bilibili-player-video-info-people-number') || bb_type.indexOf(BILI_3_X_VIDEO) !== -1) {
ob.disconnect()
let $danmaku = $(bb['danmakuSwitch']).last().find('input')
if($danmaku[0].checked === false) $danmaku.click()
let t = setInterval(() => {
if($danmaku[0].checked === false) $danmaku.click()
}, 200)
setTimeout(() => { clearInterval(t) }, 2000)
}
}
})
ob.observe($('body')[0], { childList: true, subtree: true, /*attributes: true,*/ })
}
//隐藏屏幕三连弹窗
function hideThreePopup(status){
let $popup = $('.bili-guide-all')
if($popup.length === 0) return
if(status === ON) $popup.hide()
else $popup.show()
}
//隐藏屏幕打分弹窗 **
function hideScorePopup(status){
let $popup = $('.bili-score');
if($popup.length === 0) return
if(status === ON) $popup.hide()
else $popup.show()
}
//双击或中键全屏、侧键网页全屏
function dblclickFullScreen(status){
$(bb['videoWrap']).off('mousedown.hhh'); if(status === OFF) return
$(bb['videoWrap']).on('mousedown.hhh', function(e){
if(e.button === 1 || e.button === 4 || e.button === 3) { // 1中键
if(e.button === 1) web_fullscreen()
else fullscreen()
e.preventDefault(); e.stopPropagation()
}
})
//$(bb['playTipWrap']).dblclick(function(){ fullscreen() }); //2.66自带双击全屏
}
//扩展播放倍速范围
function extend_video_speed(){
let $speedul = $(bb['videoSpeedActive']).parent();
let ratios = ['0.1x','0.5x','0.75x','1.0x','1.25x','1.5x','1.75x','2.0x','2.5x','3.0x','3.5x','4.0x','4.5x','5.0x'];
let $li = $speedul.find('li:first').clone(true, true);
$speedul.empty();
ratios.forEach(ratio => {
let $this = $li.clone().prependTo($speedul).text(ratio);
$this.attr('data-value', `${$this.text().split('x')[0]}`);
});
let speed_active = (bb_type === BILI_3_X_MOVIE)? 'bpx-state-active': (bb_type.indexOf(BILI_3_X_VIDEO) !== -1)? 'bpx-state-active': 'bilibili-player-active';
$speedul.find('li:contains("1.0x")').addClass(speed_active);
$speedul.on('click', function(e){
let $li = $(e.target);
let speed = $li.attr('data-value');
if(speed !== undefined){
h5Player.playbackRate = +speed;
setTimeout(function(){
let speed_active = (bb_type === BILI_3_X_MOVIE)? 'bpx-state-active': (bb_type.indexOf(BILI_3_X_VIDEO) !== -1)? 'bpx-state-active': 'bilibili-player-active';
$(bb['videoSpeedActive']).removeClass(speed_active);
$li.addClass(speed_active);
//$(bb['videoSpeedName']).text($li.text());
},0)
}
})
}
//区间舍入
function roundoff(rough_speed, direction, ratios){
let speed
if(direction > 0){ // ↑
speed = ratios.find(ratio => rough_speed <= parseFloat(ratio))
}else{ // ↓
speed = ratios.slice().reverse().find(ratio => rough_speed >= parseFloat(ratio))
}
return parseFloat(speed || ratios[direction > 0 ? ratios.length - 1 : 0])
}
//调节视频倍速
function video_select_speed(level) {
const $speedul = $(bb['videoSpeed']).parent()
const data_x = []
const value_x = []
$speedul.find('li').each(function() {
const value = $(this).text()
data_x.unshift(value)
value_x.unshift(parseFloat(value))
})
const v = roundoff(h5Player.playbackRate, level, data_x)
const index = value_x.indexOf(v)
const x = h5Player.playbackRate !== v ? data_x[index] : (data_x[index + level] ? data_x[index + level] : data_x[index])
//log(level, h5Player.playbackRate, v, x, data_x[index + level], data_x[index])
$(`${bb["videoSpeed"]}:contains("${x}")`).click()
showHint(parent, '#hhh_wordsHint', x)
}
//调节视频倍速(0.1x)
function video_speed_0dot1(dot) {
const rate = (h5Player.playbackRate + dot).toFixed(1)
h5Player.playbackRate = rate
showHint(parent, '#hhh_wordsHint', `${rate}x`)
}
//设置视频速度
function video_speed_set(open=OFF, speed) { //videoSpeedDefault
if(open === OFF) return
h5Player.playbackRate = (+speed).toFixed(2)
}
//计算坐标
function tip_calc_xy_3_X(t){
let crects = t.target[0].getBoundingClientRect(),
trects = t.tip_target[0].getBoundingClientRect(),
tip_height = trects.height,
tip_width = trects.width,
width = crects.width,
top = crects.top - tip_height,
left = crects.left + (width - tip_width) / 2;
return {x:left, y:top};
}
//创建tip
function tip_create_3_X(et){
function show_tip(t){
//显示及渐隐效果(抄bilibili^^)
let o = t.tip_target,
tip = t.target.data('tip'),
color = t.color || 'white',
text = (typeof tip === 'function' && tip()) || tip;
o.find('div').css({color: color}).text(text);
let xy = tip_calc_xy_3_X(t),
target = t.target[0];
clearTimeout(target.showHintTimer),
clearTimeout(target.hideHintTimer),
target.showHintTimer = window.setTimeout((function() {
o.stop();
o.css({visibility: 'visible'});
o.css({left: xy.x, top: xy.y});
o.animate({
opacity: 1,
top: xy.y - t.gap,
}, t.animate_duration);
}
), t.delay);
if(t.duration !== -1){
target.hideHintTimer = window.setTimeout((function() {
o.stop().animate({opacity: 0, top: xy.y + t.gap}, t.animate_duration, (function() { o.css({visibility: 'hidden'}) }));
}), t.duration);
}
}
let $target = et.target,
$tip = et.tip_target;
$target.data('tip', et.title);
let tip_args = {
name: 'hhh_tip',
target: $target,
tip_target: $tip,
color: et.color,
position: 2,
animate_duration: 300,
delay: et.delay || 200,
duration: et.duration || -1,
gap: et.gap,
type:'show',
};
if(et.once === ON){
clearTimeout($target[0].showHintTimer);
$tip.stop().css({visibility: 'hidden', opacity: 0});
show_tip(tip_args);
}else{
$target.mouseenter(function(){
show_tip(tip_args);
}).mouseleave(function(){
clearTimeout($target[0].showHintTimer);
$tip.stop().css({visibility: 'hidden', opacity: 0});
})
}
}
//更新tip
function tip_update_3_X(t){
if(t.title !== undefined) t.target.data('tip', t.title);
let tip = t.target.data('tip'),
text = (typeof tip === 'function' && tip()) || tip;
t.tip_target.find('div').text(text);
let xy = tip_calc_xy_3_X(t);
t.tip_target.css({left: xy.x, top: xy.y - t.gap});
}
//初始化tip
function tip_init() {
if(bb_type.indexOf(BILI_2_X) !== -1){
$('.bilibili-player-video-danmaku-setting-left-ps').mouseover();
waitForTrue(()=> $('.player-tooltips.tip.top-center.animation').length === 1, () => {
$tip = $('.player-tooltips.tip.top-center.animation').clone().removeClass('active');
$tip.find('.tooltip').css('background-color', 'rgba(0,0,0,0.9)');
$('.bilibili-player-video-danmaku-setting-left-ps').mouseout();
});
} else {
if($('#hhh_tip').length <= 0)
$(bb['playTooltipArea']).append(``);
}
}
//自定义倍速播放
function customPlayRate(open=OFF, rate=2){
if(open === !ON){
$(document).off('keydown.hhh_rate');
$(document).off('keyup.hhh_rate');
let $three_rate = $('.bpx-player-three-playrate-hint');
if($three_rate.length > 0) $three_rate.contents()[1].nodeValue = `倍速播放中`;
return false;
}else{
let go_id = null;
let keystrokes = 0;
let old_rate;
// eslint-disable-next-line no-inner-declarations
function kup(e){
if(e.keyCode === keycode['right']){ //right arrow down
$('.bpx-player-three-playrate-hint').css('display','none');
clearTimeout(go_id);
go_id = null;
keystrokes = 0;
h5Player.playbackRate = old_rate || h5Player.playbackRate;
}
}
// eslint-disable-next-line no-inner-declarations
function kdown(e){
if(e.keyCode === keycode['right']){ //right arrow down
if(e.ctrlKey || e.shiftKey || e.altKey) return;
if(++keystrokes === 1) old_rate = h5Player.playbackRate; //记录第一次按键时播放速度
let $three_rate = $('.bpx-player-three-playrate-hint');
if($three_rate.length > 0){
// eslint-disable-next-line no-inner-declarations
function go(op){
function g(op, i){
op.now[i] += op.steps[i];
if(op.now[i] > op.end || op.now[i] < op.start){
op.steps[i] = -op.steps[i];
}
let $r = $three_rate.find('g:first');
let $g = $r.children(`g:eq(${i})`);
$g.attr('opacity', op.now[i]);
}
g(op,0); g(op,1); g(op,2);
//恢复初始状态
if(1&&op.now[0] < op.start){
op.now[0] = op.now_init[0], op.now[1] = op.now_init[1], op.now[2] = op.now_init[2];
op.steps[0] = op.step, op.steps[1] = op.step, op.steps[2] = op.step;
//console.table(op)
}
}
//rate=倍速***
// eslint-disable-next-line no-inner-declarations
function loop(rate=2){ //键盘连按大约1秒30次,间隔33毫秒
let op = (function(rate){
let start = 0.15;
let now = [0.15, 0.35, 0.55];
let end = 0.75;
let millisec = 33;
let frame = 1000 / millisec;
let cycle = end - start;
let step = cycle / (frame/rate/1.33);
return {
start: start,
now_init: JSON.parse(JSON.stringify(now)),
now: JSON.parse(JSON.stringify(now)),
end: end,
millisec: millisec,
step: step,
steps: [step, step, step],
}
})(rate);
go_id = setInterval(()=>{
go(op);
}, op.millisec);
}
if(keystrokes === 2){ //第二次按键开始倍速播放
$three_rate.css('display','');
let Hanzi_digit = ['〇','一','二','三','四','五','六','七','八','九','十'][rate] || rate;
$three_rate.contents()[1].nodeValue = `${Hanzi_digit}倍速播放中`;
h5Player.play();
h5Player.playbackRate = rate;
//loop(rate); //...
}
if(keystrokes !== 1) return false; //第一次按键正常返回,执行默认操作(快进5秒)
}
}
}
$(document).off('keydown.hhh_rate').on('keydown.hhh_rate',kdown)
$(document).off('keyup.hhh_rate').on('keyup.hhh_rate',kup)
}
}
//标题抬头显示tags(视频属于哪个区)
function add_tags_to_video_title(){
let tags = [];
$('.firstchannel-tag a, .secondchannel-tag a').each(function(){
tags.push($(this).text())
})
$('.pubdate-ip.item').after(`( ${tags.join(' | ')} )`)
}
//读取cookie
function get_cookie(name) {
let c = document.cookie.split(';')
let v = c.find(e => e.match(name+'='))
return v.split(name+'=')[1]
}
//设置cookie
function set_cookie(name, value, day) {
day = void 0 !== day ? day : 365
let d = new Date
d.setTime(d.getTime() + 24 * day * 60 * 60 * 1e3)
document.cookie = name + "=" + escape(value) + ";expires=" + d.toGMTString() + "; path=/; domain=.bilibili.com"
}
//添加返回旧版按钮 暂不使用
function add_go_back(){
if(ver === BILI_3_X_VIDEO_V1){
let $sidenav = $('.fixed-sidenav-storage')
let $go_back = $sidenav.append('').children(':last')
$go_back.click(()=>{
set_cookie("go_old_video", "1") //返回旧版
location.reload()
})
}
}
//内测版首页添加返回新版按钮
function run_go_back_new_version(){
if(ver === BILI_4_X_V1){ //测试版
waitForTrue(()=> $('.palette-button-wrap .top-btn-wrap').length === 1, () => {
let $last_primary = $('.palette-button-wrap .top-btn-wrap')
let $go_back = $last_primary.after($last_primary.clone()).next()
$go_back.find('svg').remove('svg')
$go_back.find('.primary-btn').addClass('visible')
$go_back.find('.primary-btn-text').css('width','34px').text('返回新版')
$go_back.click(()=>{
set_cookie('i-wanna-go-back', '-1') //返回新版
set_cookie('i-wanna-go-feeds', '-1') //返回新版
set_cookie('buvid3', '') //返回新版
set_cookie('nostalgia_conf', '1') //返回新版
location.reload()
})
})
}
//if(ver !== BILI_3_X_VIDEO){ //旧版
// set_cookie('buvid3', '') //返回新版
// set_cookie('buvid4', '') //返回新版
// location.reload()
//}
}
//动态隐藏biliMainHeader
function dynamic_hide_mainheader(open){
function is_block(){
if ($('.center-search__bar.is-focus').length > 0) return true //是否弹出搜索历史
let is_block = false
$('.v-popover').each(function(){
// console.log($(this).css('display'))
if($(this).css('display') !== 'none'){ //是否弹出直播、漫画、消息、动态、收藏、历史等
is_block = true
return false
}
})
return is_block
}
$('body').off('mousemove.hhh_dynamic_hide_mainheader')
const $main_header = $('#biliMainHeader')
if(open === OFF) { $main_header.css('position', '').show(); return }
waitForTrue(()=>$main_header.length > 0, ()=>{
const height = $main_header[0].getBoundingClientRect().height
$main_header.css('position', 'absolute').hide()
$('body').on('mousemove.hhh_dynamic_hide_mainheader', (e)=>{
const x = e.clientX
const y = e.clientY
// log(e.clientX, e.clientY)
const rect = $('.up-panel-container')[0].getBoundingClientRect()
const up_left = rect.left
const up_right = rect.right
const up_top = rect.top
const up_bottom = rect.bottom
const is_in_up_box = x > up_left && x < up_right && y > up_top && y < up_bottom
const is_pop_dm_setting_box = $('.bpx-player-dm-setting-wrap').css('display') !== 'none' //是否弹出弹幕设置
if(y > 0 && y < height && !is_in_up_box && !is_pop_dm_setting_box) { $main_header.show() }
else if(y >= height && !is_block()) { $main_header.hide() }
})
})
}
//自动点赞
function auto_like(open, [following_status, second]){
// log('---auto_like---')
const fn = auto_like
function removeEventLists(timerun, timeend){
h5Player.removeEventListener('timeupdate', timerun)
h5Player.removeEventListener('ended', timeend)
}
removeEventLists(fn.timerun, fn.timeend)
function is_following_UP() { return $('.following').length > 0 }
function is_following_UP_by_Joint() { //联合投稿
if($('.membersinfo-upcard-wrap').length === $('.add-follow-btn').length) return false //里面没有关注的UP主
return true
}
function is_like() { return $(bb['like']).hasClass('on') } //备注:$.ajax - url: `https://api.bilibili.com/x/web-interface/archive/has/like?bvid=${bvid}`, .data
function like_click() { $(bb['like']).click() }
if(open === OFF) return
if(is_like() === true) return
if(following_status && !is_following_UP() && !is_following_UP_by_Joint()) return
if(second <= 0) { log('自动点赞,打开网页后'); like_click(); return } //进入视频页立即点赞
// h5Player = geth5Player()
let timerun = function(){
// log('---timerun---')
const fn = timerun
if(fn.time === undefined){
fn.time = Date.now()
fn.interval = 0
}
const now = Date.now()
fn.interval += now - fn.time
fn.time = now
// log('second: ', fn.interval, second)
if(fn.interval > second*1000){
removeEventLists(fn, timeend)
log(`自动点赞,播放${second}秒后`)
like_click()
}
}
let timeend = function(){
// log('---自动点赞 timeend---')
removeEventLists(timerun, timeend)
log(`自动点赞,播放完毕后`)
like_click()
}
fn.timerun = timerun
fn.timeend = timeend
h5Player.addEventListener('timeupdate', timerun)
h5Player.addEventListener('ended', timeend)
}
//弹幕发送区域透明度
function opacity_player_sending_area(open, [opacity]){
$('.bpx-player-sending-area').off('mouseenter.hhh_opacity')
$('.bpx-player-sending-area').off('mouseleave.hhh_opacity')
$('.bpx-player-sending-area').css('opacity', 1)
if(open === OFF) return false
if(is_lightoff() === OFF) return false
const t = 200
if(!$(':hover').map((i,e)=>e.className).get().includes('bpx-player-sending-area')){ // 鼠标是否在发送区域之上,不在淡化
$('.bpx-player-sending-area').stop().animate({ opacity: `${opacity/100}` }, t)
}
$('.bpx-player-sending-area').on('mouseenter.hhh_opacity',()=>{
// log('----mouseenter',e.target.className, e)
$('.bpx-player-sending-area').stop().animate({ opacity: 1 }, t)
})
$('.bpx-player-sending-area').on('mouseleave.hhh_opacity',()=>{
// log('--mouseleave',e.target.className, e)
if(!$(':hover').map((i,e)=>e.className).get().includes('bpx-player-sending-area')){ // 鼠标是否在发送区域之上,不在淡化
$('.bpx-player-sending-area').stop().animate({ opacity: `${opacity/100}` }, t)
}
})
}
//点赞等按钮上移到弹幕栏
function toolbar_cloneto_dmroot(open, [remove_info]){
let root = $('#arc_toolbar_report').add('#playlistToolbar').add('.plp-l .toolbar')[0]
if(!!root?.hhh_ob) root?.hhh_ob?.disconnect()
$('#hhh_toolbar_cloneto_dmroot').remove()
$('.bpx-player-video-info').css('display', '')
//恢复弹幕输入栏
$('.bpx-player-video-inputbar').css({'width': '', 'min-width': ''})
$('.bpx-player-video-inputbar-wrap').css({'width': ''})
$('.bpx-player-dm-input').css({'min-width': '', 'width': ''})
$('.bpx-player-dm-hint').show()
if(open === OFF) return false
if(video_type.includes('SS')) return false //电影、番剧等暂不支持
if(remove_info === ON){ $('.bpx-player-video-info').hide() }
//减短弹幕输入栏,避免弹幕栏过长
$('.bpx-player-video-inputbar').css({'width': 'auto', 'min-width': 'auto'})
$('.bpx-player-video-inputbar-wrap').css({'width': 'auto'})
$('.bpx-player-dm-input').css({'min-width': 'auto', 'width': '30px'})
$('.bpx-player-dm-hint').hide()
//复制点赞等按钮
$('.video-toolbar-left-main:first').clone().prependTo('.bpx-player-dm-root')
.css({'display': 'flex', 'width': 'max-content'})
.attr({'id': 'hhh_toolbar_cloneto_dmroot'})
.find('svg').css({'width': '20px'}).end()
.find('.toolbar-left-item-wrap').css({'margin-right': '10px'}).end()
.find('.video-toolbar-left-item').css({'width': 'auto'}).end()
.find('.video-share-info').css({'width': 'auto'}).end()
.find('.video-share-info-text').css({'position': 'relative'}).end()
.find('.video-share-popover').remove()
$('.video-watchlater').clone().appendTo('#hhh_toolbar_cloneto_dmroot')
.css({'margin-right': '25px'})
.find('.ops-watch-later').remove().end()
.find('svg').css({'width': '20px'}).end()
append_style($('#hhh_toolbar_cloneto_dmroot'), 'hhh_toolbar_cloneto_dmroot_style',
`
.video-watchlater.on {
color: var(--brand_blue);
}
`
)
//得到当前稍后再看状态
if($('.ops-watch-later').hasClass('added') === true) $('#hhh_toolbar_cloneto_dmroot .video-watchlater').addClass('on')
//video-share
;['mouseenter', 'mouseleave', 'click'].forEach((event)=>{
$('#hhh_toolbar_cloneto_dmroot .video-share').off(`${event}.hhh_video_share`).on(`${event}.hhh_video_share`, ()=>{
// log(event)
if(event === 'mouseenter'){
let aria_hidden = $('.video-share-popover').attr('aria-hidden')
if(aria_hidden === 'true'){
$('.video-share-popover').css('visibility', 'hidden')
}
$('.video-share')[1].dispatchEvent(new MouseEvent('mouseenter'))
setTimeout(()=>{
let old_share = $('.video-share:last').offset()
let new_share = $('.video-share:first').offset()
let old_pop = $('.video-share-popover').offset()
let new_top = old_pop.top - (old_share.top - new_share.top)
let new_left = old_pop.left - (old_share.left - new_share.left)
if(aria_hidden === 'true'){
$('.video-share-popover').css({'top': new_top, 'left': new_left})
}
$('.video-share-popover').css({'visibility': 'visible'})
},0)
}
else{
$('.video-share')[1].dispatchEvent(new MouseEvent(event))
}
})
})
//like、coin、fav、watchlater
let toolbar = {
'like': ['click', 'mousedown', 'mouseleave', 'mouseup'],
'coin': ['click'],
'fav': ['click'],
'watchlater': ['click'],
}
for(let [item_type, events] of Object.entries(toolbar)){
// console.log(item_type, events)
events.forEach((event)=>{
$(`#hhh_toolbar_cloneto_dmroot .video-${item_type}`).off(`${event}.hhh_video_${item_type}`).on(`${event}.hhh_video_${item_type}`, function(){
let video_item = item_type === 'watchlater' ? $('.ops-watch-later')[0] : $(`.video-${item_type}`)[1]
video_item.dispatchEvent(new MouseEvent(event))
})
})
}
//监听响应
root.hhh_ob = new MutationObserver((mutationsList) => {
for (let mutation of mutationsList) {
let class_name = mutation.target.className.toString()
// console.log(mutation)
if(class_name?.includes('video-like')) $('#hhh_toolbar_cloneto_dmroot .video-like').toggleClass('on') //console.log('点赞:', $(mutation.target).hasClass('on'))
if(class_name?.includes('video-fav')) $('#hhh_toolbar_cloneto_dmroot .video-fav').toggleClass('on')
if(class_name?.includes('ops-watch-later')) $('#hhh_toolbar_cloneto_dmroot .video-watchlater').toggleClass('on')
if(class_name?.includes('video-coin') && $(mutation.target).hasClass('on')) $('#hhh_toolbar_cloneto_dmroot .video-coin').addClass('on')
}
})
root.hhh_ob.observe(root, {
subtree: true,
attributes: true,
})
root.hhh_ob.observe($('.ops-watch-later')?.[0] ?? root, {
subtree: true,
attributes: true,
})
}
//自动(合集/选集)连播/循环
//自动连播、列表循环、单集循环、播完暂停
function list_play_control(open=ON){
// log('------list_play_control------')
// log('---', prev_video_type, prev_video_type_unique_id, video_type, video_type_unique_id)
// log(h5Player.hhh_ended_fns, open)
// log('------list_play_control2------')
if(video_type_unique_id === prev_video_type_unique_id && prev_video_type_unique_id !== undefined) return
$('#hhh_auto_list_play').remove()
if($('.auto-play:contains(自动连播)').length > 1) $('#hhh_auto_list_play_button').remove()
if(open === OFF) return
if(['视频选集', '合集', '收藏列表'].includes(video_type) === false) return
// let video_type = $('.list-box').length > 0 ? MULTI_P : //视频选集
// $('.video-section-list').length > 0 ? VIDEO_LIST : //合集
// $('.action-list-inner').length > 0 ? ACTION_LIST : //收藏列表
// NORMAL_VIDEO //常规视频
//auto_list_play && style
let $auto_list_play = $('').prependTo( $('.video-pod__header').add('.action-list-container') )
$auto_list_play.css({
'display': 'flex',
'flex-direction': 'column',
'align-items': 'flex-end',
'margin': '0 16px',
})
if(video_type === '视频选集'){
// $auto_list_play.css({'margin': '0px'})
// $('.head-con').css({'align-items': 'stretch', 'flex-direction': 'column'})
}else if(video_type === '收藏列表'){
$auto_list_play.css({'margin-top': '8px'})
}
//添加css
append_style($auto_list_play, 'hhh_handoff',
`
.handoff {
display: flex;
flex-direction: row;
}
.handoff .handoff-item {
cursor: pointer;
color: #00AEECBB;
background: #FAFAFA;
border: 1px solid #E3E5E7;
border-radius: 8px;
box-sizing: border-box;
padding: 3px;
padding-top: 4px;
padding-bottom: 4px;
margin-bottom: 6px;
line-height: 14px;
font-size: 12px;
display: flex;
flex-direction: column;
align-items: center;
width: auto;
height: auto;
}
.handoff .handoff-item:hover {
background: #E3E5E7;
}
.handoff .handoff-item.on {
background-color: #00AEECBB;
color: white;
}
.handoff .list-tool-btn[data-v-53038c4f] {
position: relative;
width: 24px;
height: 24px;
margin-right: 2px;
cursor: pointer;
}
.handoff .list-tool-btn .list-tool-btn-icon[data-v-53038c4f] {
width: 100%;
height: 100%;
color: var(--text2);
}
.handoff .list-tool-btn .list-tool-btn-icon[data-v-53038c4f]:hover {
color: var(--brand_blue)
}
`
)
let play_order = ``
let play_way = ``
//添加node
$auto_list_play.append(
`
${play_order}
${play_way}
自动连播
列表循环
单集循环
播完暂停
`
)
//下移自动连播按钮
if($('#hhh_auto_list_play_button').length <= 0){
$('接下来播放
').prependTo($('.rec-list'))
$('.rec-list>p').append($('.auto-play:contains(自动连播):first'))
}
//设置默认播放状态
let default_value = config.getCheckboxSettingKeyKey('independentListPlayControl', 'default')
$(`#hhh_auto_list_play .handoff-item:contains(${default_value})`).addClass('on')
//随机数组
let length = $('.video-pod__list .video-pod__item').add('.action-list-inner .action-list-item-wrap').length
let random = {
'curr_idx' : 0,
'random_arr': Array.from(new Array(length).keys()),
'arr_length': length
}
//数组洗牌
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
//接管列表点击事件
$('#hhh_auto_list_play').off('click.hhh_auto_list_play').on('click.hhh_auto_list_play', (e)=>{
// log(e.target.outerText)
let $target = $(e.target)
if(e.target.className === 'handoff-item'){
$('#hhh_auto_list_play .handoff-item').removeClass('on')
$target.addClass('on')
config.setCheckboxSettingKeyKey('independentListPlayControl', 'default', e.target.outerText)
config.storageCheckboxSetting()
}else if($target.parents('.list-tool-btn').length > 0){
//【顺序播放、倒序播放 | 列表循环、随机播放】
let $svg = !!$target.parent('svg')[0] === true ? $target.parent('svg') : $target
$svg.hide(); $svg.siblings('svg').removeAttr('style')
let $list_btn = $svg.parent()
let title = $list_btn.attr('title')
title = ['顺序播放', '倒序播放'].indexOf(title) !== -1 ? ('顺序播放' === title ? '倒序播放' : '顺序播放') :
['列表循环', '随机播放'].indexOf(title) !== -1 ? ('列表循环' === title ? '随机播放' : '列表循环') : undefined
$list_btn.attr('title', title)
//生成随机数组
if($target.parents('.list-tool-btn:first').attr('title') === '随机播放'){
random.curr_idx = 0
shuffleArray(random.random_arr)
}
}
})
//按排序内容进行自动连播,随机,倒序***
//视频结束时调用,【自动连播、列表循环、单集循环、播完暂停】
const fn_ended = function(e){
// log('---自动连播、列表循环、单集循环、播完暂停---')
e.preventDefault()
e.stopPropagation()
e.stopImmediatePropagation()
//弹出toast提示,5秒钟后播放下一P
function countdown_toast(runfn, second=6) {
let toast = window.player.toast
let toast_id = toast.create({
text: `${second} 秒钟后播放下一P`, //即将播放...
duration: second*1000,
fixed: !0, //立刻结束上一提示
manualMode: !0, //允许手动中断(左侧 × )
confirmText: '立即播放',
onConfirmClicked: function() {
toast.remove(toast_id)
runfn.click()
},
//onHoverChanged: function(){log('onHoverChanged'); },
onRemoved: function(e){
if(e.reason === 'delay') runfn.click() //时间到关闭toast并运行fn
// else if(e.reason === 'manual' || 1 ) clearInterval(intervalId) //手动关闭toast不运行fn
else if(e.reason === 'manual') clearInterval(intervalId) //手动关闭toast不运行fn
}
})
let counter = second;
let intervalId = setInterval(() => {
$('.bpx-player-toast-fixed .bpx-player-toast-text').text(`${--counter} 秒钟后播放下一P`)
if (counter < 0) {
clearInterval(intervalId)
}
}, 1000)
}
// ['自动连播', '列表循环', '单集循环', '播完暂停']
// ['随机播放', '列表循环', '顺序播放', '倒序播放']
let handoff = $('#hhh_auto_list_play .handoff-item.on').text()
let next_video = $('.simple-base-item.active').parent().parent().next().find('.simple-base-item').add($('.siglep-active').parent().parent().next().find('.actionlist-item-inner'))
let prev_video = $('.simple-base-item.active').parent().parent().prev().find('.simple-base-item').add($('.siglep-active').parent().parent().prev().find('.actionlist-item-inner'))
let first_video = $('.simple-base-item:first').add('.actionlist-item-inner:first')
let last_video = $('.simple-base-item:last').add('.actionlist-item-inner:last')
// log(handoff, next_video.length, first_video.length)
if(handoff === '自动连播'){
if($('.list-playway-btn').attr('title') === '随机播放'){
if(random.curr_idx < random.random_arr.length){
let next_idx = random.random_arr[random.curr_idx++]
let next_random_video = $(`.video-pod__item:eq(${next_idx}) .simple-base-item`).add(`.actionlist-item-inner:eq(${next_idx})`)
// log(next_idx,next_random_video)
countdown_toast(next_random_video)
}else{ //随机循环完成暂停
window.player.endPanel.open()
setTimeout(() => { $('.bpx-player-ending-related-item-cancel').click() }, 0)
}
}else{
let then_video = $('.list-playorder-btn').attr('title') === '顺序播放' ? next_video : prev_video
if( then_video.length > 0){
countdown_toast(then_video) //5秒钟后播放下一P
}else{ //最后1p或第1p暂停
window.player.endPanel.open()
setTimeout(() => { $('.bpx-player-ending-related-item-cancel').click() }, 0)
}
}
}else if(handoff === '列表循环'){
if($('.list-playway-btn').attr('title') === '随机播放'){
// console.log(random)
let next_idx = random.random_arr[random.curr_idx++] //随机part index
if(random.curr_idx >= random.random_arr.length){ //随机循环完成,重新随机排序开始循环
random.curr_idx = 0
random.random_arr = Array.from(new Array(random.arr_length).keys())
shuffleArray(random.random_arr)
next_idx = random.random_arr[random.curr_idx++]
}
let next_random_video = $(`.video-pod__item:eq(${next_idx}) .simple-base-item`).add(`.actionlist-item-inner:eq(${next_idx})`)
countdown_toast(next_random_video)
}else{
let then_video = $('.list-playorder-btn').attr('title') === '顺序播放' ? next_video : prev_video
let base_video = $('.list-playorder-btn').attr('title') === '顺序播放' ? first_video : last_video
countdown_toast(then_video.length <= 0 ? base_video : then_video)
}
}else if(handoff === '单集循环'){
window.player.play()
}else if(handoff === '播完暂停'){
window.player.endPanel.open()
setTimeout(() => { $('.bpx-player-ending-related-item-cancel').click() }, 0)
}
}
run_ended({'hhh_list_play_control': fn_ended})
}
//自动连播按钮下移到列表底部,合集列表展开
function expand_list(open=ON, columns=10){
// log('---合集列表展开---')
$('#hhh_expand_list').remove()
let old_max_height = '250px'
let list_class_str = '.video-pod__body'
$(list_class_str).css({'max-height': old_max_height})
if(open !== ON) return false
if(video_type !== '合集') return false //不是合集
//第一次执行
if($('#hhh_expand_list').length <= 0) {
//复制自动连播按钮
let $next_button = $('.auto-play:contains(自动连播)')
$next_button.clone().appendTo($('.header-top>.right'))
.attr({'id': 'hhh_expand_list', 'title': ''})
.css({'margin-top': '5px'})
.find('.txt').text(`展开列表`).end()
.parent().css({'display': 'flex', 'flex-direction': 'column'})
// .parent().css({'display': 'flex'})
old_max_height = $(list_class_str).css('max-height')
tip_create_3_X({ target: $('#hhh_expand_list'), tip_target: $('#hhh_tip'), gap: 6,
title: `展开列表,默认展开高度(行): ${config.getCheckboxSettingArgs('expandList', 'columns')}` })
}
//点击列表展开
let $vitem = $('.video-pod__item:first')
let vitem_height = $vitem.outerHeight() + parseInt($vitem.css('margin-top')) + parseInt($vitem.css('margin-bottom'))
let $switch_button = $('#hhh_expand_list .switch-btn')
if($switch_button.hasClass('on') === true) $switch_button.toggleClass('on') //初始不展开状况
$('#hhh_expand_list').off('click.hhh_expand_list')
$('#hhh_expand_list').on('click.hhh_expand_list', function(){
$switch_button.toggleClass('on')
if($switch_button.hasClass('on') === true){
let limit_height = vitem_height * columns //限高
$(list_class_str).css({'max-height': limit_height}) //展开columns个的高度
} else {
$(list_class_str).css({'max-height': old_max_height})
}
});
$('#hhh_expand_list').click() //默认展开
}
// 加入已填装弹幕等信息到视频顶部title ***
function add_dm_info_to_top_title(){
if(bb_type !== BILI_3_X_MOVIE){
$('.bpx-player-top-wrap').css({'-webkit-clip-path': ''})
waitForTrueFalse(()=>{
let dm_count = parseInt($('.bpx-player-video-info-dm').text().match(/\d+/)?.[0])
// log('loop:',dm_count, $('.bpx-player-top-left-title').text(), $('.bpx-player-top-left-title span').length)
return $('.bpx-player-top-left-title span').length <= 0 && dm_count > 0
}, ()=>{
if(video_type === '视频选集') $('.bpx-player-top-left-title').text($('.list-box .on .part').text())
let dm = $('.bpx-player-video-info-dm').text()
let time = $('.bpx-player-ctrl-time-duration').text()
$('.bpx-player-top-left-title').find('span').remove().end()
.append(` | ${dm} | ${time}`)
$('.bpx-player-top-wrap').css({'-webkit-clip-path': 'none'})
clearTimeout($('.bpx-player-top-wrap')[0].hhh_dm_t)
$('.bpx-player-top-wrap')[0].hhh_dm_t = setTimeout(()=>{
$('.bpx-player-top-wrap').css({'-webkit-clip-path': ''})
}, 4000)
// log('OK',$('.bpx-player-top-left-title').text())//$item_active.text()
}, 20)
}
}
function get_video_type(){
//视频选集/合集(选集是单个BV号,合集是多个BV号)
let video_type_ = $('.video-pod__list.multip').length > 0 ? MULTI_P : //视频选集
$('.video-pod__list.section').length > 0 ? VIDEO_LIST : //合集
$('.action-list-inner').length > 0 ? ACTION_LIST : //收藏列表
NORMAL_VIDEO //常规视频
// video_type_ = !!window.__NEXT_DATA__ ? ('SS_'+window.__NEXT_DATA__.props.pageProps.dehydratedState.queries[0].state.data.seasonInfo.mediaInfo.ssTypeFormat.name) : video_type_
video_type_ = $('.mediainfo_btnHome__P2fri').text()?.match(/(.+)频道/)?.[1] ? 'SS_'+$('.mediainfo_btnHome__P2fri').text()?.match(/(.+)频道/)?.[1] : video_type_
//get 唯一id
function get_video_type_unique_id(video_type_){
let vue = $('#app')[0]?.__vue__
let video_type_unique_id_ = video_type_ === MULTI_P ? vue?.aid : //视频选集
video_type_ === VIDEO_LIST ? vue?.sectionsInfo?.id : //合集
video_type_ === ACTION_LIST ? vue?.playlist?.id : //收藏列表
vue?.aid //常规视频
return video_type_unique_id_
}
let video_type_unique_id_ = get_video_type_unique_id(video_type_)
return [video_type_, video_type_unique_id_]
}
// $('#hhh_expand_list').off('mouseenter.hhh').on('mouseenter.hhh',()=>{
// window.player.tooltip.create({
// name: 'hhh_expand_list',
// title: '自动连播下面',
// target: $('#hhh_expand_list')[0],
// position: 2,
// duration: 1e3,
// delay: 300,
// })
// })
// $('#hhh_expand_list').off('mouseleave.hhh').on('mouseleave.hhh',()=>{
// window.player.tooltip.remove('hhh_expand_list')
// })
//加载视频时执行,处理不刷新页面也重新加载视频的情况
function video_loaded_run(){
// log('------加载视频时执行,处理不刷新页面也重新加载视频的情况------')
// log('---video_type---1', prev_video_type,'-', prev_video_type_unique_id,'-', video_type,'-', video_type_unique_id)
;[prev_video_type, prev_video_type_unique_id] = [video_type, video_type_unique_id]
;[video_type, video_type_unique_id] = get_video_type()
// log('---video_loaded_run-video_type---2', prev_video_type,'-', prev_video_type_unique_id,'-', video_type,'-', video_type_unique_id)
h5Player = geth5Player()
//判断是否是在同一视频集合,或不是列表类视频
if(video_type_unique_id !== prev_video_type_unique_id || ['视频选集', '合集', '收藏列表'].includes(video_type) === false){
run_ended(null) //清空ended事件
h5Player.removeEventListener('timeupdate', $(bb['video'])[0]?.hhh_fn_timeupdate) //清空timeupdate事件***
}
//记忆洗脑循环
if(config.getCheckboxSettingStatus('rememberVideoRepeat') === ON && config.getCheckboxSettingStatus('videoRepeat') !== ON) {
if(get_value('hhh-rememberVideoRepeat', $(bb['playSettingRepeatInput'])[0].checked) === true) $(bb['playSettingRepeatInput']).click() //localStorage只能保存字符串
$(bb['playSettingRepeatInput']).click(function() {
set_value('hhh-rememberVideoRepeat', !!$(bb['playSettingRepeatInput'])[0].checked)
})
}
//自动点赞
auto_like(config.getCheckboxSettingStatus('autoLike'), [config.getCheckboxSettingStatus('likeFollowed'), config.getCheckboxSettingArgs('autoLike')['second']])
//列表类视频关键字过滤
list_filter(config.getCheckboxSettingStatus('listFilter'))
//列表类视频自动连播、列表循环、单集循环、播完暂停
list_play_control(config.getCheckboxSettingStatus('independentListPlayControl'))
//列表类视频列表展开,需要在add_to_video_sections_head之前执行
expand_list(config.getCheckboxSettingStatus('expandList'), config.getCheckboxSettingArgs('expandList', 'columns'))
//列表类视频head加入总时长等信息、进度可视化、排序
set_video_list()
//新窗口打开自动连播列表视频
run_rec_list_newtab(config.getCheckboxSettingStatus('openVideoInNewTab'))
//点赞等按钮上移到弹幕栏
toolbar_cloneto_dmroot(config.getCheckboxSettingStatus('toolbarCloneToDmRoot'), [ config.getCheckboxSettingStatus('isRemoveVideoInfo') ])
//初次加载时视频顶端显示弹幕数和时长
add_dm_info_to_top_title()
//指定视频默认播放速度
video_speed_set(config.getCheckboxSettingStatus('videoSpeedDefault'), config.getCheckboxSettingArgs('videoSpeedDefault', 'speed'))
//log
log(`[${video_ver}][${ver}][${video_type}]VIDEO加载完毕`)
}
//分享按钮提示框影响体验,延迟300ms提示
function delay_share_hover_tip(open){
// let ob = new MutationObserver((mutations) => {
// for (var mutation of mutations) {
// let target = mutation.target
// log(target.className)
// }
// })
// ob.observe($('.video-toolbar-left-main')[0], { childList: true, attributes: true, subtree: true })
// return
if(video_type.includes('SS')) return false //电影、番剧等暂不支持
waitForTrue(()=> $('#share-btn-outer').length >= 1, ()=>{
//mouseenter / mouseleave
$('#share-btn-outer')[0].removeEventListener('mouseenter', $('#share-btn-outer')[0]?.hhh_share_btn_fn, true)
$('#share-btn-outer')[0].removeEventListener('mouseleave', $('#share-btn-outer')[0]?.hhh_share_btn_fn2, true)
if(open === OFF) return false
if(bb_type === BILI_3_X_MOVIE) return
//mouseenter
$('#share-btn-outer')[0].hhh_share_btn_fn = function(e){
// console.log($(e), e.target.nodeName.toString().toUpperCase(), e.target.id, e.clientX, e.clientY)
if(e.target.id === 'share-btn-outer'){
// console.log('mouseenter')
$('#share-btn-outer')[0].hhh_share_btn_t = setTimeout(()=>{
// console.log('setTimeout')
$('#share-btn-outer')[0].removeEventListener('mouseenter', $('#share-btn-outer')[0]?.hhh_share_btn_fn, true)
$('#share-btn-outer')[0].dispatchEvent(new MouseEvent('mouseenter'))
}, 300)
}
e.preventDefault()
e.stopPropagation()
e.stopImmediatePropagation()
}
$('#share-btn-outer')[0].addEventListener('mouseenter', $('#share-btn-outer')[0].hhh_share_btn_fn, true)
//mouseleave
$('#share-btn-outer')[0].hhh_share_btn_fn2 = function(e){
if(e.target.id === 'share-btn-outer'){
// console.log('mouseleave')
clearTimeout($('#share-btn-outer')[0]?.hhh_share_btn_t)
$('#share-btn-outer')[0].addEventListener('mouseenter', $('#share-btn-outer')[0].hhh_share_btn_fn, true)
}
}
$('#share-btn-outer')[0].addEventListener('mouseleave', $('#share-btn-outer')[0].hhh_share_btn_fn2, true)
})
}
//判断当前鼠标点击焦点,执行一些响应
function handle_global_click(){
$(document).mouseup(function(e){
let ids = $(':hover').map((i,e)=>e?.id)?.get()
let classes = $(':hover').map((i,e)=>e?.className)?.get()
g_is_in_biliplayer = ids.includes('bilibili-player')
//点击屏幕外时隐藏封面 2.x && 3.x
if(g_is_in_biliplayer === false || e.target.className === 'bilibili-player-dm-tip-wrap' || e.target.tagName.toLowerCase() === 'video'){
$('#hhh_img').css('display', 'none')
}
//下一P倒计时,视频范围有点击动作时取消
if(g_is_in_biliplayer === true && classes.includes('bpx-player-toast-wrap') === false){
if($('.bpx-player-toast-wrap .bpx-player-toast-text').text().match('秒钟后播放下一P') !== null){
$('.bpx-player-toast-wrap .bpx-player-toast-cancel').click()
}
}
})
}
//主程序,页面刷新完成时执行
function run_once(){
//防止重复加载
if ($('#hhh_lightoff').length === 1) { /*log('重复加载');*/ return }
//视频选集/合集(选集是单个BV号,合集是多个BV号)
// log('---video_type---1', prev_video_type,'-', prev_video_type_unique_id,'-', video_type,'-', video_type_unique_id)
// ;[prev_video_type, prev_video_type_unique_id] = [video_type, video_type_unique_id]
;[video_type] = get_video_type()
// log('---run_once-video_type---2', prev_video_type,'-', prev_video_type_unique_id,'-', video_type,'-', video_type_unique_id)
//bpx test
function bpx_info(){
return
log('----------info---------')
log('video_ver : '+video_ver)
log('ver : '+ver)
log('type : '+video_type)
log('fps : '+fps)
log('--------h5Player-------')
dir(h5Player);
log('currentTime : '+h5Player.currentTime)
log('duration : '+h5Player.duration)
log('playbackRate : '+h5Player.playbackRate)
log('volume : '+h5Player.volume)
log('paused : '+h5Player.paused)
log('pause() : '+'h5Player.pause()')
log('videoHeight : '+h5Player.videoHeight)
log('videoWidth : '+h5Player.videoWidth)
log('-----------------------')
}
/*-----------------------------------
*初始化等
*----------------------------------*/
//取得h5 video & window.player
h5Player = geth5Player()
//保存一些视频参数初始值
app_page_parameters.player_setting_area = $(`.bpx-player-dm-setting-left-area ${bb['progressBar']}`).width()/25
//初始化tip
tip_init();
//初始化关灯按钮
lightoff_init();
//激活系统弹幕设置,以此调用系统网页全屏等
$(bb['dm']).mouseenter().mouseleave();
//激活系统播放设置,以此调用系统关灯等
//去掉mouseleave(),否则如果太快执行mouseleave()无法激活关灯class,应该是mouseenter()未执行完就被mouseleave打断了
$(`${bb['playVideo']}${bb['playSetting']}`).mouseenter();
//避免显示设置页面
// waitForNode(() => document.querySelector(bb['playSettingWrap']), (node) => {;
// $(node).css({"visibility":"hidden"}); //visible
// })
//解决因为激活关灯class,导致全屏时滚轮操作(系统自带)无法调节音量的问题
// waitForTrue(()=> $(bb['playSettingWrap']).css('display') === 'block', () => {
// $(bb['playSettingWrap']).css('display', 'none').css('visibility', 'visible');
// });
//取得视频fps
get_video_fps_ver_biliinfo();
//取得版本号
//get_ver();
//激活系统提示添加音量等自定义提示DOM
pick_volume_hint();
//添加自定义快捷键说明到右键菜单
//add_custom_hotkey_menu(config.hotKeyMenu);
add_custom_hotkey_menu(config.sets.keyBinding.options);
//初始化自定义设置
init_setting();
/*-----------------------------------
*事件等
*----------------------------------*/
//点击关灯
$(`#hhh_lightoff ${bb['switchInput']}:first`).click(function(){ lightoff_hand() });
//判断当前鼠标点击焦点,执行一些响应
handle_global_click()
//扩展播放倍速范围
extend_video_speed()
//修复选择历史弹幕时弹幕填装信息丢失问题
fix_danmaku_info()
//自动运行
if( config.getCheckboxSettingStatus('autoPlay') === ON && $(bb['playSettingAutoplay'])[0].checked === false) $(bb['playSettingAutoplay'] ).click();//开启自动播放
if( config.getCheckboxSettingStatus('autoLightOff') === ON ) lightoff_hand(); //自动关灯
if( config.getCheckboxSettingStatus('autoFullScreen') === ON ) fullscreen(); //自动全屏
if( config.getCheckboxSettingStatus('autoWebFullScreen') === ON ) web_fullscreen(); //自动网页全屏
if( config.getCheckboxSettingStatus('autoWideScreen') === ON ) wide_screen(); //自动宽屏
if( config.getCheckboxSettingStatus('videoRepeat') === ON ) $(bb['playSettingRepeatInput']).click(); //开启洗脑循环(系统默认关闭)
if( config.getCheckboxSettingStatus('autoOpenDanmu') === ON ) autoOpenDanmu(); //自动显示弹幕
if( config.getCheckboxSettingStatus('autoSubtitle') === ON && $(bb['playCtrlSubtitle']).find('defs+g>g').length > 1 ) subtitle() //自动开启字幕,判断是否开启字幕,'defs+g>g'.length,关闭字幕:= 2,开启字幕:= 1
if( config.getCheckboxSettingStatus('autoOffListPlay') === ON && $(bb['playListAutoPlay']).find('.switch-btn').hasClass('on')) autooff_listplay() //自动关闭自动连播
//双击或中键全屏
dblclickFullScreen(config.getCheckboxSettingStatus('dblclickFullScreen'))
//非全屏滚轮音量调节
//两个参数指定屏幕范围(按百分比),第三个参数表示滚动一下增加的音量百分比,参数四表示暂停时是否调节
//let args = config.getCheckboxSettingArgs('volumeControlWhenNonFullScreen')
//wheel_volumeHint(config.getCheckboxSettingStatus('volumeControlWhenNonFullScreen'), args.screen_left,args.screen_rght,args.delta, config.getCheckboxSettingStatus('volumeControlWhenPause'));
//滚轮调节弹幕透明度(ctrl),参数表示滚动一下增加的透明度百分比,默认5
//wheel_opacity(config.getCheckboxSettingStatus('danmuOpacityControl'), 5)
//因为遮挡弹幕,去掉全屏时鼠标悬停时产生的顶端mask
removeVideoTopMask(config.getCheckboxSettingStatus('removeVideoTopMask'))
//播放关灯,暂停开灯,跳过充电鸣谢,自动选择最高质量视频
lightOffWhenPlaying(config.getCheckboxSettingStatus('lightOffWhenPlaying'))
lightOnWhenPause(config.getCheckboxSettingStatus('lightOnWhenPause'))
jumpElectric(config.getCheckboxSettingStatus('jumpElectric'))
auto_top_quality_video(config.getCheckboxSettingStatus('autoTopQualityVideo'))
/*-----------------------------------
*键盘控制
*----------------------------------*/
set_hotkey(config.getCheckboxSettingStatus('openHotKey'))
/*设置界面
//viewBox="10 8.5 10 12"
$('.bilibili-player-video-danmaku-setting').clone(false,false).insertBefore($('#hhh_lightoff')).attr('id', 'hhh_setting')
$('#hhh_setting>span>svg')[0].attributes[1].value = '10 8.5 10 12'
$('#hhh_setting>span>svg>path:first').remove()
*/
//段落循环
loopPlayback(config.getCheckboxSettingStatus('loopPlayback'))
//自定义倍速播放
customPlayRate(config.getCheckboxSettingStatus('customPlayRate'), config.getCheckboxSettingArgs('customPlayRate')['rate'])
//抬头显示tags(视频属于哪个区)
add_tags_to_video_title()
//返回旧版
//add_go_back()
//动态隐藏biliMainHeader
dynamic_hide_mainheader(config.getCheckboxSettingStatus('dynamicMainheader'))
//延迟分享悬浮提示
delay_share_hover_tip()
//TEST INFO
bpx_info()
//log
log(`[${video_ver}][${ver}][${video_type}]INIT加载完毕`)
}
//干净链接
function clear_url(){
const [path, query] = location.href.split('?')
if(path.match(/BV\w+/)?.length === 1){
const new_query = query?.match(/p=\d+/)?.[0]
const href = new_query === undefined ? path : `${path}?${new_query}`
history.replaceState(null,null, href)
}
return location.href
}
//段落循环
function loopPlayback(open){
/*
bpx-player-progress-wrap
hhh_loop_wrap
bpx-player-progress
bpx-player-progress-schedule-wrap //进度条
bpx-player-progress-schedule
bpx-player-progress-schedule-buffer
bpx-player-progress-schedule-current
bpx-player-progress-point-wrap
bpx-player-progress-thumb
bpx-player-progress-move-indicator //移动指示器
bpx-player-progress-popup //预览
bpx-player-progress-preview
bpx-player-progress-preview-image
bpx-player-progress-preview-time //进度时间框
bpx-player-progress-pull-indicator
bpx-player-progress-cursor
bpx-player-progress-scaleplate
hhh_loop_arrow_1
hhh_loop_arrow_2
hhh_loop_time_1
hhh_loop_time_2
*/
let $progress_area = $('.bpx-player-progress-area');
let $progress_wrap = $('.bpx-player-progress-wrap');
let $progress = $('.bpx-player-progress');
let $indeicator = $('.bpx-player-progress-move-indicator');
let $popup = $('.bpx-player-progress-popup');
let $down = $('.bpx-player-progress-move-indicator-down');
let $up = $('.bpx-player-progress-move-indicator-up');
let $ctrl_time_current = $('.bpx-player-ctrl-time-current');
//监听视频窗口大小变化
let ro = new ResizeObserver( entries => {
for (let entry of entries) {
//更新loop位置
resize_updata();
}
});
if(open !== ON) {
$('#hhh_loop_wrap').off('mousedown.hhh_loop_wrap');
$('#hhh_loop_wrap').off('mouseup.hhh_loop_wrap');
$(document).off('keydown.hhh_document');
$(document).off('keyup.hhh_document');
$(document).off('mouseup.hhh_document');
$('#hhh_loop_time_1, #hhh_loop_time_2').off('mouseenter.hhh_loop_time');
$('#hhh_loop_time_1, #hhh_loop_time_2').off('mousedown.hhh_loop_time');
ro.unobserve($(bb['video'])[0]);
if($('#hhh_loop_wrap').length > 0) {
loop_state_switch(0);
ctrl_play_time();
$('#hhh_loop_wrap')[0].hhh_loop_state_switch = false;
$('#hhh_loop_time_1')[0].hhh_seconds = undefined;
$('#hhh_loop_time_2')[0].hhh_seconds = undefined;
}
return false;
}
//if($('#hhh_loop_wrap').length > 0) return true;
if(bb_type.indexOf(BILI_3_X_VIDEO) === -1) return false;
//保存arrow原color
if(!$progress_area.attr('old_arrow_color')) $progress_area.attr('old_arrow_color', $down.css('border-top-color'));
let old_arrow_color = $progress_area.attr('old_arrow_color');
let new_arrow_color = '#FFA500';
let is_begin = true;
// Observe one or multiple elements
//squirtle-video-time-now 2.X bilibili-player-video-time-now 3.X
ro.unobserve($(bb['video'])[0]);
ro.observe($(bb['video'])[0]);
//css
$('#hhh_head_style').remove(); //test
if($('#hhh_head_style').length<1){
$progress_area.append(``);
}
//更新位置
function resize_updata(){
let $p1 = $('#hhh_loop_time_1');
let $p2 = $('#hhh_loop_time_2');
let $bar = $('#hhh_loop_bar');
if($p1.length !== 1 || $p2.length !== 1 && $bar.length !== 1) return;
let t1 = $p1[0].hhh_seconds;
let t2 = $p2[0].hhh_seconds;
let id1 = $p1.attr('hhh_loop_arrow_id');
let id2 = $p2.attr('hhh_loop_arrow_id');
let rect = $progress[0].getBoundingClientRect();
//let rect = $('.bilibili-player-video-progress')[0].getBoundingClientRect();
let newleft = t1/h5Player.duration*rect.width;
$p1.add($('#'+id1)).css('left', newleft);
newleft = t2/h5Player.duration*rect.width;
$p2.add($('#'+id2)).css('left', newleft);
//log($p1.css('left'),$p2.css('left'));
//log('------'+newleft);
t1 = $p1.css('left').slice(0,-2);
t2 = $p2.css('left').slice(0,-2);
let begin = Math.min(t1,t2);
let end = Math.max(t1,t2);
$bar.css({left:begin, width:end-begin});
}
function show_loop_time(){
//$popup.find('.bpx-player-progress-preview-image').hide();
}
function hide_loop_time(){
//$popup.find('.bpx-player-progress-preview-image').show();
}
//更新
function loop_update($hhh_loop_time, o){
//function PrefixZero(num, n) { return (Array(n).join(0) + num).slice(-n) }
//time = PrefixZero(Math.floor(time/60),2) + ':' + PrefixZero(time%60,2);
let left = 0,
seconds = 0,
rect = $progress[0].getBoundingClientRect();
//rect2 = $progress_wrap[0].getBoundingClientRect();
//log(`rect_width: ${rect.width} - $progress.width(): ${$progress.width()}`);
//log(`rect2_width: ${rect2.width} - $progress_wrap.width(): ${$progress_wrap.width()}`);
//get second
if(o.left !== undefined){
left = o.left - rect.x;
if(left < 0 || left > rect.width) return $hhh_loop_time[0].hhh_seconds;
//Position To Time
seconds = Math.floor(left/rect.width*h5Player.duration);
}else if(o.seconds !== undefined){
//Time To Position
left = o.seconds/h5Player.duration*rect.width;
if(left < 0 || left > rect.width) return $hhh_loop_time[0].hhh_seconds;
seconds = o.seconds;
}else{ log('参数错误',o); return;}
//updata left
$hhh_loop_time.css({left:left, display:'block'});
$("#"+$hhh_loop_time.attr('hhh_loop_arrow_id')).css({left:left, display:'block'});
//updata time
$hhh_loop_time[0].hhh_seconds = seconds;
let time = sec2str(seconds);
$hhh_loop_time.find('.hhh-bpx-player-progress-preview-time').text(time);
//updata (width + margin-left)
//log($('.bpx-player-progress-preview-time')[0].getBoundingClientRect())
let width = $hhh_loop_time.find('.hhh-bpx-player-progress-preview-time')[0].getBoundingClientRect().width;
$hhh_loop_time.find('.hhh-bpx-player-progress-preview').width(width);
$hhh_loop_time.css('margin-left', `${-width/2}px`);
//updata bar
let s1 = $('#hhh_loop_time_1')[0].hhh_seconds;
let s2 = $('#hhh_loop_time_2')[0].hhh_seconds;
if(s1!==undefined && s2!==undefined){
let t1 = $('#hhh_loop_time_1').css('left').slice(0,-2);
let t2 = $('#hhh_loop_time_2').css('left').slice(0,-2);
let begin = Math.min(t1,t2);
let end = Math.max(t1,t2);
$('#hhh_loop_bar').css({display:'block', left:`${begin}px`, width:`${end-begin}px`});
}
return seconds;
}
function ctrl_play_time(){
//time now
function set_time() {
//log('time-current')
if($('#hhh_loop_wrap')[0].hhh_loop_state_switch && $('#hhh_loop_wrap')[0].hhh_loop_state_switch !== 0){
let t1 = $('#hhh_loop_time_1')[0].hhh_seconds;
let t2 = $('#hhh_loop_time_2')[0].hhh_seconds;
let begin = Math.min(t1,t2);
let end = Math.max(t1,t2);
//log(t1+' - '+t2);
if(h5Player.currentTime > end){
//log(t1+' - '+t2);
h5Player.currentTime = begin;
}
}
}
let s1 = $('#hhh_loop_time_1')[0].hhh_seconds;
let s2 = $('#hhh_loop_time_2')[0].hhh_seconds;
let is_bar = $('#hhh_loop_bar').css('display') !== 'none';
//log(s1+' - '+s2+' - '+is_bar)
if(s1!==undefined && s2!==undefined && is_bar){
$ctrl_time_current[0].removeEventListener('DOMNodeInserted', set_time);
$ctrl_time_current[0].addEventListener('DOMNodeInserted', set_time);
}else{
$ctrl_time_current[0].removeEventListener('DOMNodeInserted', set_time);
}
}
//loop显示状态切换
function loop_state_switch(state){
$('#hhh_loop_wrap')[0].hhh_loop_state_switch = state;
let $p1 = $('#hhh_loop_time_1').add($('#hhh_loop_arrow_1')), $p2 = $('#hhh_loop_time_2').add($('#hhh_loop_arrow_2')), $bar = $('#hhh_loop_bar');
if(state === 0){ //no loop
$p1.hide(), $p2.hide(), $bar.hide();
}else if(state === 1){ //loop 1
if($p1[0].hhh_seconds) $p1.show();
if($p2[0].hhh_seconds) $p2.show();
if($p1[0].hhh_seconds && $p2[0].hhh_seconds) $bar.show();
}else{ //loop 2
$p1.hide(), $p2.hide();
if($p1[0].hhh_seconds && $p2[0].hhh_seconds) $bar.show();
}
}
/*---------------------------
* 插入节点
*--------------------------*/
if($('#hhh_loop_wrap').length === 0){
let progwrapclass = $progress_wrap.attr('class');
//wrap append
let $hhh_loop_wrap = $progress.wrap(``).parent();
//arrow append * 2
$indeicator.clone(true,true).prependTo($progress).attr('id','hhh_loop_arrow_1').hide()
.css({visibility:'visible', opacity:1})
.find('.bpx-player-progress-move-indicator-up').remove().end()
.find('.bpx-player-progress-move-indicator-down').css({'border-top-color':new_arrow_color}).end();
$('#hhh_loop_arrow_1').clone(true,true).prependTo($progress).attr('id','hhh_loop_arrow_2');
//preview-time append * 2
$popup.clone(true,true).prependTo($progress_area).attr({'id':'hhh_loop_time_1', 'hhh_loop_arrow_id':'hhh_loop_arrow_1'})
.addClass('hhh-bpx-player-progress-popup').removeClass('bpx-player-progress-popup').hide()
.find('.bpx-player-progress-preview-image').remove().end()
.find('.bpx-player-progress-hotspot').remove().end()
.find('.bpx-player-progress-preview').addClass('hhh-bpx-player-progress-preview').removeClass('bpx-player-progress-preview').end()
.find('.bpx-player-progress-preview-time').addClass('hhh-bpx-player-progress-preview-time').removeClass('bpx-player-progress-preview-time').end();
$('#hhh_loop_time_1').clone(true,true).prependTo($progress_area).attr({'id':'hhh_loop_time_2', 'hhh_loop_arrow_id':'hhh_loop_arrow_2'});
//schedule append
$('.bpx-player-control-top').find('.bpx-player-progress-schedule-buffer:first').clone(true,true).appendTo($progress).css({transform:'scaleX(0.999999)'}) //配合其他transform,否则height不同,scaleX会改变height,bug?
.css({background:'rgba(255,165,0,0.5)', display:'none'})
.attr('id','hhh_loop_bar');
}
/*---------------------------
* 事件
*--------------------------*/
//设置起点和终点
$('#hhh_loop_wrap')[0].hhh_loop_time_id = false;
$('#hhh_loop_wrap').off('mousedown.hhh_loop_wrap');
$('#hhh_loop_wrap').off('mouseup.hhh_loop_wrap');
$('#hhh_loop_wrap').on('mousedown.hhh_loop_wrap', function(e){
if(e.ctrlKey === true){
return false
}
}).on('mouseup.hhh_loop_wrap', function(e){
if(e.ctrlKey === true){
let $hhh_loop_time = is_begin? $('#hhh_loop_time_1'): $('#hhh_loop_time_2');
is_begin = !is_begin;
loop_update($hhh_loop_time, {left:e.pageX});
//$('.bilibili-player-video-toast-wrp').css('z-index', 0);
this.hhh_loop_time_id = $hhh_loop_time[0].id;
loop_state_switch(1);
ctrl_play_time();
return false;
}else{
this.hhh_loop_time_id = false;
}
});
//键盘 down
$(document).off('keydown.hhh_document');
$(document).on('keydown.hhh_document',function(e){
if(e.keyCode === keycode['Ctrl']) { //Ctrl
if($progress_wrap.hasClass('bpx-state-active') === true){ //隐藏(img + up)
$down.css('border-top-color', new_arrow_color);
$up.hide();
show_loop_time();
}
$('#hhh_loop_time_1, #hhh_loop_time_2').css({cursor: 'pointer'}) //代表可以点击time标签
}else if(e.keyCode === keycode['left'] || e.keyCode === keycode['right']){ //键盘调整开始结束时间
if($('#hhh_loop_wrap')[0].hhh_loop_time_id !== false && $('#hhh_loop_time_1').css('display') !== 'none'){
toggle_control_top('show');
let $hhh_loop_time = $('#'+$('#hhh_loop_wrap')[0].hhh_loop_time_id);
let seconds = $hhh_loop_time[0].hhh_seconds;
e.keyCode === keycode['right'] ? ++seconds : --seconds;
loop_update($hhh_loop_time, {seconds:seconds});
return false;
}
}else if(e.keyCode === 'L'.charCodeAt()){ //切换
if($('#hhh_loop_time_1')[0].hhh_seconds !== undefined){
toggle_control_top('show');
$('#hhh_loop_wrap')[0].hhh_loop_state_switch = ++$('#hhh_loop_wrap')[0].hhh_loop_state_switch % 3;
loop_state_switch($('#hhh_loop_wrap')[0].hhh_loop_state_switch);
ctrl_play_time();
}
}
});
//键盘 up
$(document).off('keyup.hhh_document');
$(document).on('keyup.hhh_document',function(e){
if(e.keyCode === 17) { //Ctrl
$down.css('border-top-color', old_arrow_color);
$up.show();
hide_loop_time();
$('#hhh_loop_time_1, #hhh_loop_time_2').css({cursor: 'w-resize'})
} else if(e.keyCode === keycode['left'] || e.keyCode === keycode['right']){ //段落循环
if($('#hhh_loop_wrap')[0].hhh_loop_time_id !== false){
//hide_loop_time();
return false;
}
}
});
//判断当前鼠标点击焦点
$(document).off('mouseup.hhh_document');
$(document).on('mouseup.hhh_document', function(e){
if(!e.ctrlKey && $('#hhh_loop_wrap').length > 0 && $('#hhh_loop_wrap')[0].hhh_loop_time_id) $('#hhh_loop_wrap')[0].hhh_loop_time_id = false;
});
//拖动确定范围
$('#hhh_loop_time_1, #hhh_loop_time_2').off('mouseenter.hhh_loop_time');
$('#hhh_loop_time_1, #hhh_loop_time_2').off('mousedown.hhh_loop_time');
$('#hhh_loop_time_1, #hhh_loop_time_2').on('mouseenter.hhh_loop_time', function(){
$(this).attr('in_dom', true);
}).on('mouseleave.hhh_loop_time', function(){
$(this).attr('in_dom', false);
}).on('mousedown.hhh_loop_time', function(e){
var $this = $(this);
var doc = document;
$this.css('z-index', 10000); //当前的在上面
if(e.ctrlKey){
loop_state_switch(0);
ctrl_play_time();
}else{
loop_update($this, {left:e.clientX});
doc.onmousemove = function(e){
//log(e.clientX)
loop_update($this, {left:e.clientX});
return false;
};
doc.onmouseup = function(){
//清除事件
doc.onmousemove = null;
doc.onmouseup = null;
//hide_loop_time();
//$this.find('.bilibili-player-video-progress-detail-container').show();
$this.css('z-index', 'auto');
$('#hhh_loop_wrap')[0].hhh_loop_time_id = $this[0].id;
return false;
}
}
});
}
//增加当前在线视频预览
function run_online_preview(open=ON){
if(open !== ON) return false;
if($('#hhh_online_list_style').length === 1) return true;
function hide(parent, selector){
var o = $();
if($.isArray(selector) === true){
$.each(selector, function(i,v){
o = o.add(v);
})
}else{
o = $(selector);
}
//显示及渐隐效果(抄bilibili^^)
clearTimeout(parent.showHintTimer),
o.stop().show(),
parent.showHintTimer = window.setTimeout((function() {
o.animate({
opacity: 0
}, 600, (function() {
$(this).hide()
}))
}
), 0)
}
function show(parent, selector){
var o = $();
if($.isArray(selector) === true){
$.each(selector, function(i,v){
o = o.add(v);
})
}else{
o = $(selector);
}
//显示及渐隐效果(抄bilibili^^)
clearTimeout(parent.showHintTimer),
parent.showHintTimer = window.setTimeout((function() {
o.stop().show(),
o.animate({
opacity: 1
}, 600, (function() {
$(this).show()
}))
}
), 300)
}
if($('#hhh_online_list_style').length<1){
$('.online-list').append(``);
}
var bvs = {},
box_width = 0,
bg_img_row = 0,
bg_y_block_len = 0,
bg_img_totle = 0;
$('.online-list>.ebox>a>div').mouseenter(function(){
this.state = 'enter';
let $lazy_img = $(this);
let bvid = $lazy_img.parent().attr('href').match(/BV\w+$/);
bvid = bvid && bvid[0];
this.bvid = bvid;
if(bvs[bvid] === undefined){
bvs[bvid] = $lazy_img.parent().attr('title');
$.getJSON("https://api.bilibili.com/x/player/videoshot", { bvid: bvid, index: "1" },
function(json){
let bg_img = json.data.image[0];
box_width = $lazy_img.width();
bg_img_totle = json.data.index.length > (json.data.img_x_len*json.data.img_x_len)? (json.data.img_x_len*json.data.img_x_len): json.data.index.length;
bg_img_row = bg_img_totle < json.data.img_x_len? bg_img_totle: json.data.img_x_len;
bg_y_block_len = json.data.img_y_size/json.data.img_x_size*box_width;
bvs[bvid] = {box_width:box_width, bg_img_totle:bg_img_totle, bg_img_row:bg_img_row, bg_y_block_len:bg_y_block_len};
//log(bg_img_row+' - '+bg_img_totle+' - '+bg_y_block_len);
//log(bvs[bvid]);
$lazy_img.css({'overflow':'hidden', 'position':'relative'});
$lazy_img.append(`
`); /*硬编码,随时调整*/
if($lazy_img[0].state === 'enter') show($lazy_img[0], [$lazy_img.find('.hhh-preview-bg'), $lazy_img.find('.hhh-preview-wrapper')], 'show');
});
}else{
show($lazy_img[0], [$lazy_img.find('.hhh-preview-bg'), $lazy_img.find('.hhh-preview-wrapper')], 'show');
}
}).mouseleave(function(){
this.state = 'leave';
hide(this, [$(this).find('.hhh-preview-bg'), $(this).find('.hhh-preview-wrapper')], 'hide');
}).mousemove(function(e){
//log(this.bvid);
let obv = bvs[this.bvid];
let amounts = Math.floor(e.offsetX/(obv.box_width/obv.bg_img_totle));
let x = Math.floor(amounts % obv.bg_img_row) * -obv.box_width;
x = Math.min(Math.max(x,-obv.box_width*(obv.bg_img_totle-1)),0);
let y = Math.floor(amounts/obv.bg_img_row) * -obv.bg_y_block_len;
//log('---'+box_width+' - '+bg_img_totle);
//log(e.offsetX+' - '+amounts+' - '+x+' - '+y+' - '+bg_y_block_len+' - '+Math.floor(amounts/bg_img_row));
$(this).find('.hhh-preview-bg').css({'background-position':`${x}px ${y}px`});
let w = Math.round(e.offsetX/obv.box_width*100);
$(this).find('.hhh-preview-progress-bar').css({'width':`${w}%`});
})
}
//动态首页直接显示隐藏content
function run_content(open=ON){
if(open !== ON){
return false;
//Test
// eslint-disable-next-line no-unreachable
if($('[hhh_has_content]').length){
let $major = $('.bili-dyn-content__orig__major');
let $content = $major.find('.bili-dyn-card-video__desc');
let $expand = $major.find('.bili-dyn-card-video_expand___hhh');
$content.removeClass('bili-dyn-card-video__desc___new_expand')
.removeClass('bili-dyn-card-video__desc___new_collapse');
$expand.add($content).off('click.hhh_content');
$expand.remove('.bili-dyn-card-video_expand___hhh');
$major.find('.bili-dyn-card-video').removeClass('bili-dyn-card-video___new');
$major.find('.bili-dyn-card-video__header').removeClass('bili-dyn-card-video__header___new');
$major.find('.bili-dyn-card-video__body').removeClass('bili-dyn-card-video__body___new');
$('[hhh_has_content]').removeAttr('hhh_has_content');
}
return false;
}
if($('[hhh_has_content]').length < $('.bili-dyn-content__orig__major').length){
$('.bili-dyn-content__orig__major').each(function(){
let $major = $(this);
let $hhh_has_content = $major.find('[hhh_has_content]');
if($hhh_has_content.length >= 1) return true;
//$major.attr('hhh_has_content', true);
//log($hhh_has_content.length)
//隐藏弹幕,弹幕意义不大还遮挡窗口视频
$major.find($('.dyn-video-preview__danmaku')).hide()
//隐藏"投稿视频",同样意义不大还遮挡窗口视频
if($major.find($('.bili-dyn-card-video__badge:contains(投稿视频)')).length === 1){
// log($major.text())
$major.find($('.bili-dyn-card-video__badge:contains(投稿视频)')).hide()
}
//新版“bili-dyn-card-video__stat”去掉position: absolute,使用默认值
$major.find('.bili-dyn-card-video__stat').css({'position': 'static'})
//显示隐藏标题
let $title = $major.find('.bili-dyn-card-video__title');
let padding_bottom = '24px'; //根据标题行数确定 .bili-dyn-card-video__stat 位置
if($title.length >= 1){
let font_size = $title.css('font-size');
let line_height = +font_size.match(/\d+/)[0] + 5; //估算
let h = $title.removeClass('bili-dyn-card-video__title').css({'font-size':font_size}).height();
$title[0].style = "";
//log($title.text()+': '+line_height+' - '+h)
$title.addClass('bili-dyn-card-video__title');
if(h > line_height*2){
$title.attr('title', $title.text())
}
if(h > line_height){
padding_bottom = '10px';
}
}
//显示隐藏content
let $content = $major.find('.bili-dyn-card-video__desc');
if($content.length >= 1){
//console.log($content.text().slice(0,10)+ ' : ' +$content.height());
let line_height = $content.css('line-height');
//log($content.height());
let font_size = $content.css('font-size');
let h = $content.removeClass('bili-dyn-card-video__desc').css({'line-height':line_height, 'font-size':font_size}).height();
$content[0].style = "";
line_height = line_height.match(/\d+/)[0];
//log('---line_h:'+line_height+' h: '+h+' title: '+$major.find('.title').text());
$content.addClass('bili-dyn-card-video__desc');
$content.attr('hhh_has_content', true);
if(h > line_height*2){
// $major.find('.bili-dyn-card-video').height('auto');
// $major.find('.bili-dyn-card-video__body').css('display', 'block');
// $major.find('.bili-dyn-card-video__header').height(127);
if($('#hhh_content_style').length<1){
$major.append(``);
}
$major.find('.bili-dyn-card-video').addClass('bili-dyn-card-video___new');
$major.find('.bili-dyn-card-video__header').addClass('bili-dyn-card-video__header___new');
$major.find('.bili-dyn-card-video__body').addClass('bili-dyn-card-video__body___new');
$content.addClass('bili-dyn-card-video__desc___new_collapse');
// $content.css({'padding-top':'8px'});
// console.log(line_height);
// $content.css({'height': `${line_height}px`});
//let $expand = $(`展开
`).insertAfter($content);
let $expand = $(`展开
`).insertAfter($content);
$expand.add($content).off('click.hhh_content');
$expand.add($content).on('click.hhh_content', function(){
//$expand.add($content).click(function(){
if($expand.text() === '展开'){
//console.log('=='+$content.height()+'==='+$content.css('line-height').match(/\d+/)[0]);
//$content.css({height:'auto', '-webkit-box-orient':'inline-axis'});
$content.removeClass('bili-dyn-card-video__desc___new_collapse').addClass('bili-dyn-card-video__desc___new_expand');
$expand.css({'padding-bottom': '0px'});
$expand.text('收起');
}else{
//$content.height(line_height);
//$content.css({'-webkit-box-orient':'vertical'});
$content.removeClass('bili-dyn-card-video__desc___new_expand').addClass('bili-dyn-card-video__desc___new_collapse');
$expand.css({'padding-bottom': $expand.attr('padding-bottom')});
$expand.text('展开');
}
return false
});
}
}
})
}
}
//添加首页轮播 prev next slide (抄网易)
function run_add_carousel_slide(){
if(bb_type !== BILI_3_X_VIDEO) return false
waitForTrue(()=> $('.rcmd-box-wrap').length === 1, () => {
if($('.focus-carousel_hhh').length > 0) return false;
let style = ``;
let $carousel = $('.focus-carousel');
$carousel.append(style);
$carousel.addClass('focus-carousel_hhh');
let $prev = $(``).appendTo($carousel);
let $next = $(``).appendTo($carousel);
//轮播效果
$prev.on('click', function(){
if($carousel.find('.trigger span.on').index() === $carousel.find('.trigger span:first').index())
$carousel.find('.trigger span:last').click();
else
$carousel.find('.trigger span.on').prev().click();
});
$next.on('click', function(){
if($carousel.find('.trigger span.on').index() === $carousel.find('.trigger span:last').index())
$carousel.find('.trigger span:first').click();
else
$carousel.find('.trigger span.on').next().click();
});
});
}
//去掉首页插件提示
function run_adblock_remove(){
if(ver === BILI_3_X_VIDEO_V1 || ver === BILI_4_X_V1){
$('.adblock-tips').remove()
}
}
//首页添加观看列表
function run_add_online(){
let $box = $('.recommend-container__2-line');
if($box.length !== 1) return;
let $last_card = $box.children('.bili-video-card:visible:last');
let left = $last_card.position().left;
let width = $last_card.outerWidth();
let $online_wrap = $('.bili-grid.short-margin.grid-anchor:last');
$online_wrap.append(``);
$('#hhh_online').append($('#hhh_btn_num>button').clone().empty().css({width:`${width}px`, 'border-radius':'4px', background:'#f4f4f4', display:'flex', border:'1px solid #e7e7e7'})
.append(`观看列表`));
$('#hhh_online a').hover(function(){$(this).css('color','#00a1d6')}, function(){$(this).css('color','#212121')});
}
//BILI_4_X_V1首页设置
function run_homepage(){
async function save_recommend_list_feed4(){
if(ver !== BILI_4_X_V1) return false
let $box_wrap = $('.recommended-container_floor-aside')
let $box = $('.recommended-container_floor-aside>.container')
let card_classname = '.feed-card'
let box_data = [$box.clone()]
let $rbtn = $('.feed-roll-btn:first');
let $empty_rbtn = $rbtn.clone().empty();
let h = $rbtn.outerHeight();
let w = $rbtn.outerWidth();
let $left = $('.carousel-arrows').add($('.buttons.not-gray')).find('button:first')
let $right = $('.carousel-arrows').add($('.buttons.not-gray')).find('button:last')
let is_change_break = null;
let curr_box_num = 0;
//num
$box_wrap.append($rbtn.clone().attr('id','hhh_btn_num').css({top:`${h+2}px`})
.find('svg').remove().end()
.find('span').remove().end()
.find('button').css({cursor:'default', background:'#e2e2e2', 'align-items':'center', 'border-radius':'8px'}).removeClass('primary-btn').append('1/1').end());
//left
let cbtn_h = $('#hhh_btn_num').outerHeight() + 3;
$box_wrap.append($empty_rbtn.clone().attr('id','hhh_btn_zuo').css({top:`${h+1+cbtn_h}px`}).append($left.clone())
.find('button').addClass('primary-btn roll-btn').css({'border-bottom':'0px', 'border-bottom-left-radius':'0px', 'border-bottom-right-radius':'0px'}).end()
.find('svg').css({'margin-bottom':'1px'}).end());
//right
cbtn_h += $('#hhh_btn_zuo').outerHeight() - 1;
$box_wrap.append($empty_rbtn.clone().attr('id','hhh_btn_you').css({top:`${h+1+cbtn_h}px`}).append($right.clone())
.find('button').addClass('primary-btn roll-btn').css({'border-top':'0px', 'border-top-left-radius':'0px', 'border-top-right-radius':'0px'}).end()
.find('svg').css({'margin-bottom':'1px'}).end());
//left right - event
function rbtn_event($lrtn){
$lrtn.click(function(){
//恢复前一个list
curr_box_num = this.id === 'hhh_btn_zuo'? Math.max(curr_box_num-1, 0): Math.min(curr_box_num+1, box_data.length-1);
$('#hhh_btn_num>button').text(`${curr_box_num+1}/${box_data.length}`);
$box.children(card_classname).each(function(i){
//log($(box_data[curr_box_num]).children(`.bili-video-card:eq(${i})`).attr('data-report'));
$(this).empty().append($(box_data[curr_box_num]).children(`${card_classname}:eq(${i})`).clone());
})
})
}
rbtn_event($('#hhh_btn_zuo')); //left
rbtn_event($('#hhh_btn_you')); //right
//refresh - event
$rbtn.click(()=>{
let ob = new MutationObserver((mutations, observer) => {
for (var mutation of mutations) {
let target = mutation.target
if(typeof target.className === 'string' && target.className === 'bili-video-card__image--wrap'){
clearTimeout(is_change_break)
ob.disconnect()
is_change_break = setTimeout(function() {
//log("推荐页面刷新完毕")
box_data.push($box.clone())
// box_data.push($box.children(card_classname))
// log(box_data)
curr_box_num = box_data.length - 1
$('#hhh_btn_num>button').text(`${box_data.length}/${box_data.length}`)
//log(box_data.length)
}, 50)
break
}
}
})
ob.observe($box_wrap[0], { childList: true, subtree: true, /*attributes: true,*/ })
})
}
function set_homepage_layout(){
let column = +config.getCheckboxSettingKeyKey('homepageSetting', 'default')
//layout
let $box_wrap = $('.recommended-container_floor-aside')
let cbtn_h = +$('#hhh_btn_you').position().top + $('#hhh_btn_you').outerHeight()
// log(cbtn_h,typeof cbtn_h)
let $hhh_btn_layout = $('.feed-roll-btn:first').clone().empty().attr('id', 'hhh_btn_layout')
.css({'white-space': 'nowrap', 'top': `${cbtn_h+10}px`, 'padding': '3px', 'border-radius': '4px', 'background': '#f4f4f4', 'border': '1px solid #e7e7e7'})
$hhh_btn_layout.append(
`
每行个
`
)
$box_wrap.append($hhh_btn_layout)
function change_layout(column){
let one_lines = column + 2,
first_column_card = (column + 1) * 2, //12
next_column_card = first_column_card + one_lines //19
// log(column,one_lines,first_column_card, next_column_card)
$('#hhh_homepage_layout').remove()
append_style($('.recommended-container_floor-aside'), 'hhh_homepage_layout',
`
.recommended-container_floor-aside .container {
grid-template-columns: repeat(${one_lines},1fr) !important
}
.recommended-container_floor-aside .container>*:nth-of-type(n + 0) {
margin-top: 0px !important
}
.recommended-container_floor-aside .container>*:nth-of-type(n + ${first_column_card}) {
margin-top: 40px !important
}
// .recommended-container_floor-aside .container>*:nth-of-type(n + ${next_column_card-1}) {
// margin-top: 70px !important
// }
.recommended-container_floor-aside .container>*:nth-of-type(n + ${next_column_card}) {
margin-top: 24px !important
}
.recommended-container_floor-aside .container .feed-card {
display: block !important
}
`
)
}
function num_input_event_init($num_input_dom){
let $input = $num_input_dom.find('input')
let $div = $num_input_dom.children('div')
//---change---
$input.off('change.hhh_num_input');
$input.on ('change.hhh_num_input', function(){
let column = +$(this).val()
config.setCheckboxSettingKeyKey('homepageSetting', 'default', column)
config.storageCheckboxSetting()
change_layout(column)
});
//---focus---
$input.off('focus.hhh_num_input')
$input.on ('focus.hhh_num_input', function(){
//---keydown stopPropagation on---
$('body').off('keydown.hhh_num_input');
$('body').on ('keydown.hhh_num_input', function(e){ e.stopPropagation() })
$(this).css({width: "36px"}).prop('type', 'number')
})
//---blur---
$input.off('blur.hhh_num_input')
$input.on ('blur.hhh_num_input', function(){
//---keydown stopPropagation off---
$('body').off('keydown.hhh_num_input')
$(this).prop('type', 'tel')
this.style.width = "12px" //让 scrollWidth 获取最小值,达到回缩的效果
})
//---mouseenter、mouseleave---
$input.off('mouseenter.hhh_num_input')
$input.off('mouseleave.hhh_num_input')
$input.on ('mouseenter.hhh_num_input', function(){
let $this = $(this)
$this.css({width: "36px"}).prop('type', 'number')
let rect = this.getBoundingClientRect()
document.onmousemove = function(e){
let x = e.clientX
let y = e.clientY
if(x < rect.left || x > rect.right || y < rect.top || y > rect.bottom ){
$this.mouseleave()
}
}
}).on('mouseleave.hhh_num_input', function(){
document.onmousemove = null
if(this !== document.activeElement){
$(this).prop('type', 'tel')
this.style.width = "12px" //让 scrollWidth 获取最小值,达到回缩的效果
}
})
}
change_layout(column)
num_input_event_init($('#hhh_btn_layout'))
}
//新版首页添加观看列表
function run_add_online_4X_V1(){
let $box_wrap = $('.recommended-container_floor-aside')
let cbtn_h = +$('.feed-roll-btn:last').position().top + $('.feed-roll-btn:last').outerHeight()
let $online_wrap = $('.feed-roll-btn:first').clone().empty().attr('id', 'hhh_online')
$box_wrap.append($online_wrap)
$('#hhh_online').css({'white-space': 'nowrap', top: `${cbtn_h+10}px`, 'text-align': 'center', padding: '3px', 'border-radius':'4px', background:'#f4f4f4', border:'1px solid #e7e7e7'})
.append(`观看列表`)
$('#hhh_online a').hover(function(){$(this).css('color','#00a1d6')}, function(){$(this).css('color','#212121')})
}
if(ver === BILI_4_X_V1){
waitForTrue(()=>$('.recommended-swipe-body .carousel-arrows path').length > 0, ()=>{
save_recommend_list_feed4()
set_homepage_layout()
run_add_online_4X_V1()
})
}
}
//记忆首页推荐列表
function run_save_recommend_list(open=ON){
if(open !== ON) return false;
if ($('.rcmd-box-wrap').length === 1) save_recommend_list_old();
else if($('.bili-grid.short-margin.grid-anchor:first').length === 1) save_recommend_list_new();
//else err('记忆首页推荐列表错误 - 找不到dom');
}
function save_recommend_list_old(){
if($('#hhh_btn_num').length !== 0) return true;
let $box_wrap = $('.rcmd-box-wrap');
let $box = $('.rcmd-box');
let box_data = [];
let $cbtn = $('.change-btn');
let h = $cbtn.outerHeight();
let w = $cbtn.outerWidth();
let curr_box_num = 0;
//取得过滤器
let filter = get_value('hhh_rcmd_filter', {})
let filter_list = []
let fresh_rcmd_list = [];
load_card_box();
//list-box left
$('#elevator').css({left:`calc(50% + ${w+3+20}px)`}); //calc(50% + 3px);
let $empty_cbtn = $cbtn.clone().empty();
//num
$box_wrap.append($empty_cbtn.clone().attr('id','hhh_btn_num').css({cursor:'default'})
.css({height:'21px', 'line-height':'21px', top:`${h+2}px`})
.css({padding:'0px', background:'#e2e2e2'}).append('1/1'))
//left
let cbtn_h = $('#hhh_btn_num').outerHeight() + 3;
$box_wrap.append($empty_cbtn.clone().attr('id','hhh_btn_zuo').css({height:'auto', top:`${h+1+cbtn_h}px`})
.css({'border-bottom':'0px', 'border-bottom-left-radius':'0px', 'border-bottom-right-radius':'0px'})
.append(''))
//right
cbtn_h += $('#hhh_btn_zuo').outerHeight() - 1;
$box_wrap.append($empty_cbtn.clone().attr('id','hhh_btn_you').css({height:'auto', top:`${h+1+cbtn_h}px`})
.css({'border-top':'0px', 'border-top-left-radius':'0px', 'border-top-right-radius':'0px'})
.append(''))
//button
cbtn_h += $('#hhh_btn_you').outerHeight() + 10;
$box_wrap.append($empty_cbtn.clone().attr('id','hhh_btn_remove_filter').css({height:'auto', top:`${h+1+cbtn_h}px`})
.css({padding: '0px', border: '0px'})
.append(''))
.find('button').css({padding: '2px'})
function card_filter($card, filter){
let BV = $card.find('a')[0].href.match(/BV\w+/)[0] //取得BV号
const [对钩, 叉叉] = ['bili-icon_caozuo_yitianjia', 'bili-icon_sousuo_yichu']
let filter_value = filter[BV] === ON ? 对钩 : 叉叉
//add filter
$card.find('.hhh_filter').remove().end()
.prepend(
$card.find('.watch-later-video:first').clone()
.addClass('hhh_filter').css({top:'8px', 'background-image':'none'})
.find('.wl-tips').css({left:'-4px', display:'none'}).end()
.prepend($(``).clone())
)
if(filter_value === 对钩){
$card.find('.info-box').css({'background-image':'none', 'background-color':'black'})
$card.find('.info-box img').css({'opacity':0.2})
}else{
$card.find('.info-box').css({'background-image':'', 'background-color':''})
$card.find('.info-box img').css({'opacity':''})
}
//event
$card.find('.hhh_filter').off('mouseover.hhh_filter').on('mouseover.hhh_filter', function(){
let $bilifont = $(this).find('i')
let $wl_tips = $(this).find('.wl-tips')
if($bilifont.hasClass(`bilifont ${叉叉}`)){
$wl_tips.text('点击屏蔽')
$wl_tips.css({left:`${($bilifont.width() - $wl_tips.width())/2}px`})
}else if($bilifont.hasClass(`bilifont ${对钩}`)){
$wl_tips.text('点击恢复')
$wl_tips.css({left:`${($bilifont.width() - $wl_tips.width())/2}px`})
}
$wl_tips.removeClass('van-watchlater-move-enter-active').addClass('van-watchlater-move-enter-active').show()
}).off('mouseout.hhh_filter').on('mouseout.hhh_filter', function(){
$(this).find('.wl-tips').removeClass('van-watchlater-move-enter-active').hide()
}).off('click.hhh_filter').on('click.hhh_filter', function(){
let $bilifont = $(this).find('i')
let $wl_tips = $(this).find('.wl-tips')
let $info_box = $(this).parent().find('.info-box')
let BV = $info_box.find('a')[0].href.match(/BV\w+/)[0] //取得BV号
if($bilifont.hasClass(`bilifont ${叉叉}`)){
filter[BV] = ON
set_value('hhh_rcmd_filter', filter)
//log(get_value('hhh_rcmd_filter'))
$wl_tips.text('已屏蔽')
$wl_tips.css({left:`${($bilifont.width() - $wl_tips.width())/2}px`})
$bilifont.removeClass(`bilifont ${叉叉}`).addClass(`bilifont ${对钩}`)
$info_box.css({'background-image':'none', 'background-color':'black'})
$info_box.find('img').css({'opacity':0.2})
}else if($bilifont.hasClass(`bilifont ${对钩}`)){
delete filter[BV]
set_value('hhh_rcmd_filter', filter)
//log(get_value('hhh_rcmd_filter'))
$wl_tips.text('已恢复')
$wl_tips.css({left:`${($bilifont.width() - $wl_tips.width())/2}px`})
$bilifont.removeClass(`bilifont ${对钩}`).addClass(`bilifont ${叉叉}`)
$info_box.css({'background-image':'', 'background-color':''})
$info_box.find('img').css({'opacity':''})
}
})
}
function cbtn_event($cbtn){
$cbtn.click(function(){
//激活动画
let $i = $(this).find('i');
$i.addClass('active');
setTimeout(function(){ $i.removeClass('active') },500);
//恢复前一个list
curr_box_num = this.id === 'hhh_btn_zuo'? Math.max(curr_box_num-1, 0): Math.min(curr_box_num+1, box_data.length-1);
$('#hhh_btn_num').text(`${curr_box_num+1}/${box_data.length}`);
$box.find('.video-card-reco').each(function(i){
$(this).empty().append($(box_data[curr_box_num]).find('.video-card-reco:eq('+i+')>div').clone());
card_filter($(this), filter)
})
})
}
cbtn_event($('#hhh_btn_zuo')); //left
cbtn_event($('#hhh_btn_you')); //right
//refresh
$cbtn.click(()=>{
$box_wrap[0].addEventListener('DOMSubtreeModified', function fn_(e) {
let eve_this = this;
if(typeof e.target.className === 'string' && e.target.className === $box.attr('class')){
//最后一个class
if($box.find('.video-card-reco').length === 10){
eve_this.removeEventListener('DOMSubtreeModified', fn_);
load_card_box()
}
}
})
})
//重置
$box_wrap.find('#hhh_btn_remove_filter').click(()=>{
let box = new hhh_box()
box.create({target: $('#hhh_btn_remove_filter button'), color: '#00b5e5', text: '是否清空屏蔽列表', gap: 8,
enter_fn: ()=>{
const json_filter = JSON.parse(localStorage.getItem('hhh_rcmd_filter'))
log(Object.keys(json_filter).length)
log(json_filter)
localStorage.removeItem('hhh_rcmd_filter')
filter = {}
$box.find('.video-card-reco').each(function(){
card_filter($(this), filter)
})
}
})
}).mouseenter(function(){
const json_filter = JSON.parse(localStorage.getItem('hhh_rcmd_filter'))
$(this).attr('title', `已屏蔽${Object.keys(json_filter).length}个`)
})
function load_card_box(){
//hhh_rcmd_filter = {BVxxx: ON, BVxxx2: ON}
//使用过滤器(BV号判断)过滤card数据,过滤后的数据
$box.find('.video-card-reco').each(function(i){
let BV = $(this).find('a')[0].href.match(/BV\w+/)[0] //取得BV号
if(filter[BV] === ON){ //对比BV号过滤
//log(BV)
filter_list.push(i)
}
//filter[BV] = ON
})
//set_value('hhh_rcmd_filter', filter)
// filter_list = []
// filter_list.push(Math.floor(Math.random() * (9 - 0 + 1) ) + 0)
// filter_list.push(Math.floor(Math.random() * (9 - 0 + 1) ) + 0)
//log('filter_list', filter_list)
function get_fresh_rcmd(){
let items
$.ajax({
url: "https://api.bilibili.com/x/web-interface/index/top/rcmd?fresh_type=0&fresh_idx=0&fresh_idx_1h=0&homepage_ver=0",
type: "GET",
xhrFields: {
withCredentials: true
},
crossDomain: true,
async: false,
timeout: 1,
success: function (data) {
items = data.data.item
//log(data.data);
}
});
return items
}
function set_card($card, item){
$card.find('.info-box a')[0].href = item.uri
$card.find('.info-box a img')[0].src = item.pic.split(/https*:/)?.[1] + '@412w_232h_1c.webp'
$card.find('.info-box a img')[0].alt = item.title
$card.find('.info-box a .info .title')[0].title = item.title
$card.find('.info-box a .info .title').text(item.title)
$card.find('.info-box a .info .up').contents()[1].nodeValue = item.owner.name
$card.find('.info-box a .info .play').text(item.stat.view >= 10000 ? (item.stat.view/10000).toFixed(1)+'万播放' : item.stat.view+'播放')
}
//如果发现需过滤BV,读取新rcmd填充
if(filter_list.length !== 0){
//ajax读取rcmd填充
while(filter_list.length > fresh_rcmd_list.length){
let new_rcmd_list = get_fresh_rcmd()
new_rcmd_list = new_rcmd_list.filter((v)=>{ return filter[v.bvid] !== ON })
fresh_rcmd_list.push(...new_rcmd_list)
}
let $card_clone = $box.find('.video-card-reco:eq(0)').clone()
for(let i of filter_list){
let $card = $('.rcmd-box .video-card-reco').eq(i)
$card.empty().append( $card_clone.find('>*').clone() ) // 去掉watch-later-video van-watchlater black [click],由于稍后再看保存旧card内容,不去掉的话会错乱
let item = fresh_rcmd_list.shift()
set_card($card, item)
}
}
box_data.push($box.clone());
curr_box_num = box_data.length - 1;
$('#hhh_btn_num').text(`${box_data.length}/${box_data.length}`);
if(box_data.length >= 10){ $('#hhh_btn_num').css({width:'37px', right:'-41px'}) }
$box.find('.video-card-reco').each(function(){
card_filter($(this), filter)
})
}
}
function save_recommend_list_new(){
if($('#hhh_btn_num').length !== 0) return true;
let $box_wrap = $('.bili-grid.short-margin.grid-anchor:first');
let $box = $('.recommend-container__2-line');
let box_data = [$box.clone()];
let $rbtn = $('.roll-btn-wrap');
let $empty_rbtn = $rbtn.clone().empty();
let h = $rbtn.outerHeight();
let w = $rbtn.outerWidth();
let $left = $('.buttons.not-gray').find('button:first');
let $right = $('.buttons.not-gray').find('button:last');
let is_change_break = null;
let curr_box_num = 0;
//palette-button left
waitForTrue(()=> $('.palette-button-wrap').length === 1, () => {
$('.palette-button-wrap').css({left:`calc(100% + ${w+10}px)`}); //calc(100% + 0px);
});
//num
$box_wrap.append($rbtn.clone().attr('id','hhh_btn_num').css({top:`${h+2}px`})
.find('svg').remove().end()
.find('span').remove().end()
.find('button').css({cursor:'default', background:'#e2e2e2', 'align-items':'center', 'border-radius':'8px'}).removeClass('primary-btn').append('1/1').end());
//left
let cbtn_h = $('#hhh_btn_num').outerHeight() + 3;
$box_wrap.append($empty_rbtn.clone().attr('id','hhh_btn_zuo').css({top:`${h+1+cbtn_h}px`}).append($left)
.find('button').addClass('primary-btn roll-btn').css({'border-bottom':'0px', 'border-bottom-left-radius':'0px', 'border-bottom-right-radius':'0px'}).end()
.find('svg').css({'margin-bottom':'1px'}).end());
//right
cbtn_h += $('#hhh_btn_zuo').outerHeight() - 1;
$box_wrap.append($empty_rbtn.clone().attr('id','hhh_btn_you').css({top:`${h+1+cbtn_h}px`}).append($right)
.find('button').addClass('primary-btn roll-btn').css({'border-top':'0px', 'border-top-left-radius':'0px', 'border-top-right-radius':'0px'}).end()
.find('svg').css({'margin-bottom':'1px'}).end());
//left right - event
function rbtn_event($rbtn){
$rbtn.click(function(){
//恢复前一个list
curr_box_num = this.id === 'hhh_btn_zuo'? Math.max(curr_box_num-1, 0): Math.min(curr_box_num+1, box_data.length-1);
$('#hhh_btn_num>button').text(`${curr_box_num+1}/${box_data.length}`);
$box.children('.bili-video-card').each(function(i){
//log($(box_data[curr_box_num]).children(`.bili-video-card:eq(${i})`).attr('data-report'));
$(this).empty().append($(box_data[curr_box_num]).children(`.bili-video-card:eq(${i})`).clone());
})
})
}
rbtn_event($('#hhh_btn_zuo')); //left
rbtn_event($('#hhh_btn_you')); //right
//refresh - event
$rbtn.click(()=>{
$box_wrap[0].addEventListener('DOMSubtreeModified', function fn_(e) {
let eve_this = this;
if(typeof e.target.className === 'string' && e.target.className === 'bili-video-card__image--wrap'){
clearTimeout(is_change_break);
is_change_break = setTimeout(function() {
//log("推荐页面刷新完毕");
eve_this.removeEventListener('DOMSubtreeModified', fn_);
//eve_this.removeEventListener('DOMSubtreeModified', arguments.callee);
box_data.push($box.clone());
curr_box_num = box_data.length - 1;
$('#hhh_btn_num>button').text(`${box_data.length}/${box_data.length}`);
//log(box_data.length)
}, 50);
}
})
});
}
//新窗口打开自动连播列表视频
function run_rec_list_newtab(open){
$('.rec-list .video-page-card').each(function(){
if(open === ON){
let $a = $(this).find('.info a:first').attr('target',"_blank");
let $span = $(this).find('.info span');
$span.clone().prependTo($a).attr('hhh_new', true);
$span.hide();
}else{
$(this).find('.info span[hhh_new]').remove();
$(this).find('.info span').show();
}
})
}
//全屏时显示投币、收藏对话框等
function set_dialog(type, classname) {
//log('set_dialog:'+classname)
if(type === 'coin'){ //投币对话框
//log('coin')
let is_Dlg_exist = classname.includes('teleport') === true
//harmony-font header-v2 win webscreen-fix
//let is_coin_over = classname.includes('header-v2 win webscreen-fix') === true
if(is_Dlg_exist === true){
if($('.coin-operated-m-exp').length <= 0){
//log('off')
$(document).off('keydown.hhh_coin')
return false
}
//log('--set_dialog 1--')
// TODO: 全屏时显示
// $('.bili-dialog-m').appendTo('.bpx-player-container');
// $('.bili-dialog-m').find('.coin-bottom').css('line-height', 1.5);
if($(bb['biliDlgM']).length === 1){
//网页全屏时显示
let z_index = +$('#bilibili-player').css('z-index');
!isNaN(z_index) && $(bb['biliDlgM']).css('z-index', z_index+1);
!isNaN(z_index) && $('.bili-msg').css('z-index', z_index+1); //硬币不足 提示
//键盘事件
$(document).off('keydown.hhh_coin')
$(document).on('keydown.hhh_coin', function(e){
if(e.keyCode === keycode['left']){
$('.left-con').click();
}else if(e.keyCode === keycode['right']){
$('.right-con').click();
}else if(e.keyCode === keycode['Enter']){
let c_num = $('.mc-box.on').text()
$(bb['coinDlgOkBtn']).click()
//$(bb['coinDlgCloseBtn']).click()
showHint(document, '#hhh_wordsHint', `投币成功 ${$('.video-coin-info:first').text()}+${c_num}`, 2e3)
}else if(e.keyCode === keycode['Esc']){
$(bb['coinDlgCloseBtn']).click()
}
return false
})
}
}else if(classname === 'hhh_test_coin'){
//log('--set_dialog 2--');
if($(bb['coin']).filter('[title="对本稿件的投币枚数已用完"]').length > 0 && $('.van-message').length > 0){
showHint(document, '#hhh_wordsHint', '对本稿件的投币枚数已用完');
}
}
}
}
//合集列表关键字过滤
function list_filter(open = ON){
// log('---list_filter---')
$('#hhh_list_input').remove()
let $list_card = $('.video-pod__list>div').add('.action-list-inner .action-list-item-wrap')
$list_card.show()
if($list_card.length < 1) return
if(['视频选集', '合集', '收藏列表'].includes(video_type) === false) return
if(open === OFF) return
let list_input_div = ``;
if($('#hhh_list_input').length === 0){
//插入Node
$('.rcmd-tab, .action-list-container').before($(list_input_div))
//提示
tip_create_3_X({ target: $('#hhh_list_input'), tip_target: $('#hhh_tip'), gap: 6,
title: `可使用前缀字符开启功能——#正则表达式、@标题字数,例子:#第.+集,@12` })
//插入CSS
append_style($('#hhh_list_input'), 'hhh_list_input_style',
`
#hhh_list_input {
display: flex;
align-items: center;
background: #fafafa;
height: auto;
line-height: 2px;
border: 1px solid #00a1d6;
border-radius: 4px;
top: 20%;
margin-top: 3px;
margin-bottom: 2px;
margin-left: 1px;
margin-right: 1px;
pointer-events: all
}
#hhh_list_input:hover {
background: var(--bg1)
}
#hhh_list_input .nav-search-input {
flex: 1;
overflow: hidden;
background-color: transparent;
padding-right: 5px;
border: none;
box-shadow: none;
color: var(--text2);
font-size: 12px;
outline: none;
height: 28px
}
#hhh_list_input .nav-search-clean {
width: 16px;
height: 16px;
right: 10px;
visibility: hidden
}
#hhh_list_input .nav-search-clean svg {
position: absolute;
color: var(--graph_weak)
}
#hhh_list_input .nav-search-clean:hover svg path {
fill: var(--graph_icon)
}
#hhh_list_input .nav-search-clean.has-keyword {
cursor: pointer;
visibility: inherit
}
`
)
$('#hhh_list_input input').off('input.hhh_list')
$('#hhh_list_input input').on('input.hhh_list',function(e, is_backfill=false){
let input_text_all = $(this).val()
$('.video-pod__list').add('.action-list-inner')[0].hhh_list_filter_val = input_text_all
let $list_card = $('.video-pod__list>div').add('.action-list-inner .action-list-item-wrap')
$list_card.each(function(){
let $this = $(this)
if(!input_text_all) { $this.show(); return }
let first = '=' //默认纯文本
let input_text = input_text_all
if(input_text.length > 1 && '#@='.includes(input_text[0])){ //第一个字符是#、@、=
// log('input_text.lengt:',input_text.length)
first = input_text[0]
input_text = input_text.slice(1)
}
let is_show = false
let list_text = $this.text().trim()
if(first === '#'){ //正则表达式
const regex = new RegExp(input_text, 'i')
// log('###',input_text,list_text.match(regex),list_text)
is_show = regex.test(list_text)
}else if(first === '@'){ //字数相同
let title = $this.find('.title').attr('title')
// log('@@@', title, title.length, input_text)
is_show = title.length === +input_text
}else if(first === '='){ //纯文本
is_show = list_text.toUpperCase().indexOf(input_text.toUpperCase()) !== -1
}
if(is_show === true) {
$this.show()
}else{
$this.hide()
}
})
//回到首行位置
if(is_backfill === false) $('.video-pod__body, #playlist-video-action-list').scrollTop(0)
//更新过滤计数
if(!!input_text_all){
$('#hhh_list_input .nav-search-clean').addClass('has-keyword')
$('#hhh_list_input').find('span:first').
text(`过滤${$('.video-pod__list>div:visible').add('.action-list-inner .action-list-item-wrap:visible').length}个`)
}else{
$('#hhh_list_input .nav-search-clean').removeClass('has-keyword')
$('#hhh_list_input').find('span:first').text('')
}
})
// 清空输入框
$('#hhh_list_input .nav-search-clean').off('click.hhh_list')
$('#hhh_list_input .nav-search-clean').on('click.hhh_list',function(){
$('#hhh_list_input input').val('')
$('#hhh_list_input input').trigger('input')
})
//过滤值回填
if($('.video-pod__list').add('.action-list-inner')[0].hhh_list_filter_val !== ''){
$('#hhh_list_input input').val($('.video-pod__list').add('.action-list-inner')[0].hhh_list_filter_val)
$('#hhh_list_input input').trigger('input', [true])
}
}
}
//添加到收藏夹关键字过滤(video wrap) collection-m-exp coin-operated-m-exp
function collection_filter(open=ON){
if($('.collection-m-exp').length <= 0) return false
$(document).off('keydown.hhh_coin')
if(open !== ON){
$('.bili-dialog-m .title')[0].style['padding-left'] = '';
$('#hhh_collection_input').off('input.hhh_collection');
$('#hhh_collection_input').parent().remove();
return false;
}
let collection_div = `
`;
if($('#hhh_collection_input').length === 0){
$(collection_div).prependTo($('.bili-dialog-m .title').css('padding-left', '150px'))
// log('collection_filter')
// $('#hhh_collection_input')[0].dispatchEvent( new MouseEvent('mousedown') )
// $('.bpx-player-video-wrap')[0].dispatchEvent( new MouseEvent('click') )
setTimeout(() => {
//$('.group-list').find(':contains(排行榜)').parent()[0].dispatchEvent( new MouseEvent('click') )
$('#hhh_collection_input').focus()
//$('.group-list').find(':contains(排行榜)').parent().click()
}, 0);
$('#hhh_collection_input').off('input.hhh_collection')
$('#hhh_collection_input').on('input.hhh_collection',function(){
let val = $(this).val();
$('.content li').each(function(){
if(!val) {
$(this).css('display','block');
return;
}
if($(this).find('.fav-title').text().toUpperCase().indexOf(val.toUpperCase()) !== -1) {
$(this).css('display','block');
}else{
$(this).css('display','none');
}
})
})
if(is_fullscreen() === true){
let z_index = +$('#bilibili-player').css('z-index')
$(bb['biliDlgM']).css('z-index', z_index+1)
}
}
}
//添加到收藏夹关键字过滤 collection-m-exp coin-operated-m-exp
function collection_filter2(open=ON){
if(open !== ON){
$('#hhh_collection_input').off('input.hhh_collection')
$('#hhh_collection_input').parent().remove()
return false
}
let collection_div = `
`;
if($('#hhh_collection_input').length === 0){
let $fav_list = $('#fav-createdList-container .fav-list')
let $fav_item = $('#fav-createdList-container .fav-item.cur')
$fav_list.before($(collection_div))
setTimeout(() => {
//$('.group-list').find(':contains(排行榜)').parent()[0].dispatchEvent( new MouseEvent('click') )
$('#hhh_collection_input').focus()
//$('.group-list').find(':contains(排行榜)').parent().click()
}, 0);
$('#hhh_collection_input').off('input.hhh_collection')
$('#hhh_collection_input').on('input.hhh_collection',function(){
let val = $(this).val()
$fav_list.find($('.fav-item')).each(function(i){
if(!val) {
$(this).css('display','block');
return;
}
if($(this).find('.text').text().toUpperCase().indexOf(val.toUpperCase()) !== -1) {
$(this).css('display','block');
}else{
$(this).css('display','none');
}
})
})
}
return true
}
//调整收藏夹长度/行高 & 添加收藏夹关键字过滤
function run_fav(open){
if(open === ON){
append_style($('#page-fav .fav-sidenav'), 'hhh_fav_sidenav_style',
`
#page-fav .fav-sidenav .text {
line-height: initial!important
}
.be-dropdown-menu {
margin-top: -10px
}
`
)
let $fav_list_li = $('#fav-createdList-container .fav-list li:first')
let length = $fav_list_li.height()
$('#fav-createdList-container').css('max-height', `${length*30}px`)
collection_filter2()
}else{
//let max_height = parseInt($('#fav-createdList-container').css('max-height'));
//$('#fav-createdList-container').css('max-height', `${max_height/2}px`);
}
}
//未使用
function run_history(){
$.get("https://api.bilibili.com/x/web-goblin/history/search", { pn:"1", keyword: "12", business: "all" },
function(json){
console.log(json)
});
}
function run_ended(fn_obj){
// log('---hhh_ended_runfn---', fn_obj)
// let h5Player = geth5Player()
h5Player.removeEventListener('ended', h5Player.hhh_ended_runfn, true)
if(fn_obj === null){
h5Player.hhh_ended_runfn = null
h5Player.hhh_ended_fns = {}
return false
}
let o = Object.entries(fn_obj)[0]
let name = o[0]
let fn = o[1]
h5Player.hhh_ended_fns ??= {}
if(h5Player.hhh_ended_fns[name] === undefined){
h5Player.hhh_ended_fns[name] = fn
}else if(fn.toString() !== h5Player.hhh_ended_fns[name].toString()){
err('hhh_ended_fns 重复:', name, fn)
}
function ended_runfn(e){
for(let [name, fn] of Object.entries(h5Player.hhh_ended_fns)){
fn(e)
}
}
h5Player.hhh_ended_runfn = ended_runfn
h5Player.addEventListener('ended', ended_runfn, true)
}
//简单的对话框
class hhh_box{
$box_container = null
option = {
id: 'hhh_box',
target: null,
tip_target: null,
enter_fn: ()=>{},
cancel_fn: ()=>{},
color: 'white',
gap: 2,
z_index: 1,
}
//计算坐标
calc_xy(t){
let crects = t.target[0].getBoundingClientRect(),
trects = t.box_target[0].getBoundingClientRect(),
box_height = trects.height,
box_width = trects.width,
width = crects.width,
top = crects.top - box_height,
left = crects.left + (width - box_width) / 2;
//log(crects, trects)
// + document.scrollingElement.scrollTop
return {x:left, y:top};
}
create(option_) {
if(this.$box_container !== null) { console.error('已创建对话框'); return 0 }
//add box
let box = ``
let o = {...this.option, ...option_}
this.$box_container = $(box).appendTo($('body'))
let $box = this.$box_container.find('#hhh_box')
o.box_target = $box
//add css
let rules = `
.hhh-button-area {
display: flex;
min-width: 40px;
transform: scale(0.8);
color: #fff;
border: 1px solid hsla(0,0%,100%,.2);
justify-content: center;
width: 100%;
height: 100%;
border-radius: 2px;
box-sizing: border-box;
transition: all .2s
}
.hhh-button-area:hover {
--bpx-fn-color: #00a1d6;
color: var(--bpx-fn-color,#00a1d6);
border-color: var(--bpx-fn-color,#00a1d6)
}
.hhh-button {
width: 40px;
height: 22px;
line-height: 22px;
margin-top: 9px;
display: inline-flex;
vertical-align: middle;
cursor: pointer
}
`
let style_id = 'hhh_box_style'
$(`#${style_id}`).remove();
if($(`#${style_id}`).length <= 0){
this.$box_container.prepend(``);
}
$box.find('#hhh_content').css({color: o.color}).text(o.text)
let xy = this.calc_xy(o)
$box.css({left: xy.x, top: xy.y - o.gap, 'z-index': o.z_index})
//event
$box.find('#hhh_enter').click(()=>{ o.enter_fn(); this.destroy() })
$box.find('#hhh_cancel').click(()=>{ o.cancel_fn(); this.destroy() })
}
destroy() {
this.$box_container.empty()
this.$box_container.remove()
this.$box_container = null
}
}
//时间to秒
function timestr_to_second(d){
d = d?.trim()?.split(/:/)?.reverse()
return d?.reduce((t,v,i)=>t+parseInt(v)*(60**i),0)
}
//格式化数字(播放量等),感谢ChatGPT
function formatPlayCount(playCount) {
if (playCount >= 10000 && playCount < 100000000) {
// 如果播放量在一万以上,但不到一亿,以万为单位显示,保留一位小数
return (playCount / 10000).toFixed(1) + '万';
} else if (playCount >= 100000000) {
// 如果播放量在一亿以上,以亿为单位显示,保留一位小数
return (playCount / 100000000).toFixed(1) + '亿';
} else {
// 如果播放量在一万以下,直接显示整数
return Math.round(playCount).toString();
}
}
//合集、视频选集等设置
function set_video_list(){
// log('======set_video_list======', video_type, video_type_unique_id)
if(['合集','视频选集'].includes(video_type) === false) return
let myid = []
/////////////////////////////
//给列表添加总时长 & 标注进度等
/////////////////////////////
function add_to_video_sections_head(){
function add_total_time(){
function init(){
let $left = $('.header-bottom .left') //合集
let $pod_slide = $('.video-pod .video-pod__slide')
let $items = $('.video-pod__body .stat-item.duration')
if($left.length <= 0) {
$left = $('.header-top .left') //选集
}
const id = 'hhh_mysections_head'
if($items.length > 0){
if($(`#${id}`).length <= 0){
$left.wrap(``).parent()
}
}
return [$(`#${id}`), $pod_slide, $items]
}
let [$wrap, $pod_slide, $items] = init()
//统计list秒数
function get_list_second($items, index){
//all
let second = 0
let begin = index === undefined ? 0 : index
let end = index === undefined ? $items.length - 1 : index
//log(index, begin, end)
for(; begin <= end; ++begin){
second += timestr_to_second($items.eq(`${begin}`).text()?.match(/([\d:]+)/)?.[1])
}
return second
}
let second = get_list_second($items)
if(!$wrap) return false
const id = 'hhh_total_time'
$(`#${id}`).remove()
$(`
`).appendTo($wrap)
let hour = ((second / (60*60/2)).toFixed(0)/2).toFixed(1) //0.5的倍数
$(`#${id}`).text(`总时长: ${sec2str(second)}(${hour}小时)`).attr('total-second', second)
}
add_total_time()
//多合集刷新时更新单个合集总时间
if($('.video-pod__slide').length > 0) {
let is_change_break = null
$('.video-pod__list')[0]?.hhh_ob?.disconnect()
let ob = new MutationObserver((mutations, observer) => {
for (var mutation of mutations) {
let target = mutation.target
if(typeof target.className === 'string' && !!$(target).text()){
// log($(target).find('.title-txt:first').text())
clearTimeout(is_change_break)
is_change_break = setTimeout(function() {
// log("合集刷新完毕")
add_total_time()
}, 50)
}
}
})
ob.observe($('.video-pod__list')[0], { childList: true })
$('.video-pod__list')[0].hhh_ob = ob
}
return ['hhh_mysections_head', 'hhh_total_time']
}
myid = [ ...myid, ...add_to_video_sections_head()]
/////////////////////////////
//
/////////////////////////////
//支持视频选集/合集(选集是单个BV号,合集是多个BV号)
async function memory_multipart_progress(open, [status]){
const LIST_TYPE = video_type
// log('=====memory_multipart_progress=====', LIST_TYPE)
/*(function(){
if(!window.localStorage) {
console.log('浏览器不支持localStorage');
}
var size = 0;
for(item in window.localStorage) {
if(window.localStorage.hasOwnProperty(item)) {
if(item === 'hhh_checkboxes'){
console.log(item)
console.log(window.localStorage.getItem(item))
}
size += window.localStorage.getItem(item).length;
}
}
console.log('当前localStorage使用容量为' + (size / 1024).toFixed(2) + 'KB');
})()
删除所有 hhh_BV
(function(){
if(!window.localStorage) {
console.log('浏览器不支持localStorage');
}
var size = 0;
for(item in window.localStorage) {
if(window.localStorage.hasOwnProperty(item)) {
if(item.match(/hhh_BV/)){
localStorage.removeItem(item)
console.log(item)
}
//size += window.localStorage.getItem(item).length;
}
}
console.log('当前localStorage使用容量为' + (size / 1024).toFixed(2) + 'KB');
})()
`{
option:{
total_part:'0',
counter:'0',
currentTime:'0',
last_part:'0',
watch_date:'0',
watch_time:'0',
},
progress_list:{
bvid:...
}
}`*/
function get_total() { return +$('.video-pod__header .amt')?.text()?.match(/(\d+)\/(\d+)/)?.[2] }
// function get_draw_part(){ return +$('.simple-base-item').index($('.simple-base-item.active')) + 1 }
function get_part() { return +$('.video-pod')[0].__vue__.p }
function get_curr_part() { return $('.video-pod__list .video-pod__item[data-scrolled]').index()+1 }
function get_curr_part_duration() { return $('.video-pod__list .video-pod__item[data-scrolled] .duration').text().trim() }
function remove_all_duration_pass(){ $('.stat-item.duration .hhh_pass').remove() }
// function get_curr_cid() { return $('.video-pod')[0].__vue__.cid }
function get_curr_data_key() { return $('.video-pod__list .video-pod__item[data-scrolled]').attr('data-key') }
function get_curr_$item() { return $(`.video-pod__list .video-pod__item[data-key=${get_curr_data_key()}`) }
function get_$item(data_key) { return $(`.video-pod__list .video-pod__item[data-key=${data_key}]`) }
function get_bv() { return $('meta[itemprop=url]').attr('content')?.match(/BV\w+/)?.[0] }
function get_sid() { return $('.video-pod__header a').attr('href')?.match(/sid=\w+/)?.[0] } //合集ID
function get_progress_id() { return 'hhh_' + (LIST_TYPE === '合集' ? get_sid() : get_bv())}
function get_slide_id(){ return $('.video-pod')[0]?.__vue__?.podCurSlide?.id }
function get_vids(){
let vids = []
if(LIST_TYPE === VIDEO_LIST) $('.video-pod')[0]?.__vue__.videoData.ugc_season.sections.forEach((e)=>{ e.episodes.forEach((e1)=>{ vids.push(e1.bvid) }) })
else vids = Array.from({ length: get_total() }, (v, i) => i.toString())
return vids
}
function vid_to_part(bvid) { return vids.indexOf(bvid) + 1 }
function part_to_vid(part) { return vids[part-1] }
function vid_to_part2(bvid) { log(vids, bvid, vids.indexOf(bvid)); return vids.indexOf(bvid) + 1 }
function part_to_vid2(part) { if(1||!(vids[part-1] && vids[part-1].match('BV'))) log('part_to_bv:', part, vids[part-1]); return vids[part-1] }
function get_obj(){
const progress_id = get_progress_id()
const obj = get_value(progress_id)
return obj
}
function save_obj(obj){
set_value(get_progress_id(), obj)
}
//版本转换
function old_obj_convert_new(){
// log('---old_obj_convert_new 1---')
// log(get_obj())
const old_obj = get_obj()
if(old_obj === undefined || old_obj.progress_list === undefined){
return save_obj({option: {}, progress_list: {}})
}
//重置
if(old_obj.option !== undefined && old_obj.progress_list !== undefined) return
//转换
let new_obj = {option: {}, progress_list: {}}
new_obj.option.counter = old_obj.counter
new_obj.option.currentTime = old_obj.currentTime
new_obj.option.last_part = old_obj.last_part
new_obj.option.watch_date = old_obj.watch_date
new_obj.option.watch_time = old_obj.watch_time
new_obj.option.total_part = get_total()
let old_list = old_obj.progress_list
for(let [part, value] of Object.entries(old_list)){
// log(part, value, part_to_vid(part))
new_obj.progress_list[part_to_vid(part)] = value
}
// log(old_obj)
// log(new_obj)
// log(Object.keys(old_list).length)
// log(Object.keys(new_obj.progress_list).length)
// log('---old_obj_convert_new 2---')
save_obj(new_obj)
return new_obj
}
function update_obj(ended_value){
// log('---------update_obj----------')
const vid = get_curr_data_key()
if(vid === undefined) { err('当前视频不在item内'); return }
const date = new Date()
const currentTime = h5Player.currentTime
const obj = get_obj() || { option: {}, progress_list: {}}
// log(obj)
obj.option.last_part = get_curr_part() + 'p'
obj.option.last_data_key = get_curr_data_key()
obj.option.currentTime = currentTime
obj.option.watch_date = date.Format("MM-dd")
obj.option.watch_time = date.Format("hh:mm")
obj.progress_list[vid] = ended_value || currentTime //看完的视频赋值 -1
// log(vid, get_progress_id())
save_obj(obj)
return obj
}
function counter_obj(){
const obj = get_obj() || { option: {}, progress_list: {}}
obj.option.counter = obj.option.counter === undefined ? 1 : obj.option.counter + 1
save_obj(obj)
}
//hhh_episode_view
function bulid_real_to_draw(){
let real_to_draw = Array.from(new Array(1+get_total()).keys()) //默认real to real
let curr_section_begin_idx = 0
$('.video-section-list').add('.cur-list').each((i,v)=>{
// console.log(`-----${i}-----`)
$(v).find('.hhh_episode_view').each((i,v)=>{
// console.log(curr_section_begin_idx + +$(v).attr('real_idx'), curr_section_begin_idx+i+1)
real_to_draw[curr_section_begin_idx + +$(v).attr('real_idx')] = curr_section_begin_idx + i + 1
})
curr_section_begin_idx += $(v).find('.hhh_episode_view').length
})
return real_to_draw
}
//等待__vue__,超时退出
if(await isTimeout(()=> $('.video-pod')[0]?.__vue__ !== undefined)) { err('get_vids timeout'); return }
let run_count = 0,
vids = get_vids()
// reals_to_draws = bulid_real_to_draw();
// log(reals_to_draws)
//////////////////////////////
//
//////////////////////////////
// log('-----memory_multipart_progress run-----')
// const [MULTI_P, VIDEO_LIST] = [1,2]
// const LIST_TYPE = $('.list-box').length > 0 ? MULTI_P : //视频选集
// $('.video-section-list').length > 0 ? VIDEO_LIST : undefined //合集
//hhh_memory_multipart_progress
//hhh_pass
//hhh_fn_timeupdate **
function init(open){
// log('---------init----------', open)
//$('.hhh-multi-page-progress').width(0)
h5Player = geth5Player()
$('#hhh_memory_multipart_progress').remove()
$('.hhh-multi-page-progress').remove()
$('.hhh-multi-page-progress-border-right').remove()
$('.hhh-viewed').remove()
$('.stat-item.duration .hhh_pass').remove() //去掉所有 √
$('.video-pod__slide .slide-inner .slide-item').map((i, item)=>{ item.style.cssText = ''; $(item).find('div').remove() }) //删除slide节点
h5Player.removeEventListener('timeupdate', $(bb['video'])[0]?.hhh_fn_timeupdate)
if(open === OFF) return false
//添加到mysections && 更新hhh_total_time已看时长百分比
function add_passed_second_time(){
// log('---add_passed_second_time---')
let $head_wrap = $('#hhh_mysections_head')
const id = 'hhh_memory_multipart_progress'
$(`
`).appendTo($head_wrap)
//已看时长占百分比
if(get_obj()?.progress_list !== undefined){
// log('---hhh_total_time已看时长百分比---',get_obj())
//计算已看百分比
let list = get_obj().progress_list
let passed_second = 0
for(let [id, currentTime] of Object.entries(list)){ //累计已看秒数
if(currentTime === -1){ //看完,currentTime=视频时长
currentTime = timestr_to_second(get_$item(id).find('.duration').text()?.match(/([\d:]+)/)?.[1]) ?? 0
}
passed_second += currentTime
}
let percent = (passed_second/$('#hhh_total_time').attr('total-second')*100).toFixed(0)
let new_text = `${$('#hhh_total_time').text().split('|')?.[0]}|(已看${percent}%)`
$('#hhh_total_time').text(new_text)
}
}
/* video-pod__list section - LIST
*/
//鼠标悬浮显示百分比
function add_per_to_title(){
$('.video-pod__list').off('mouseover.hhh_title').on('mouseover.hhh_title',function(e){
if(e.originalEvent === undefined) return
let path = $(':hover').map((i,e)=>e)
log(path)
//判断是否为title
for (let i = 0; i < path.length; i++) {
const element = path[i]
if(element.className === 'single-p'){
//读width确定百分比
const width = $(element).find('.hhh-multi-page-progress')[0]?.style.width
log(width)
const centstr = width !== undefined ? ' ('+parseInt($(element).find('.hhh-multi-page-progress')[0]?.style.width)+'%)' : ''
const $title = $(element).find('.title')
$title[0].title = $title.text().trim() + centstr
}
}
})
}
//多video-sections-item small-mode,每个sections-item添加视频数量
function add_section_item(){
if($('.video-pod .video-pod__slide').length > 0){
$('.video-pod__slide .slide-inner .slide-item').each((i, item)=>{
let $item = $(item)
$item.css({display: 'flex', 'flex-direction': 'column', 'justify-content': 'center', 'height': '42px', 'line-height': 'normal'})
let n = $('.video-pod')[0]?.__vue__.podSectionList[i].list.length
$item.append(`
(共${(n)}个)
`)
})
}
}
add_passed_second_time()
// add_per_to_title()
add_section_item()
//timeupdate
h5Player.removeEventListener('timeupdate', $(bb['video'])[0]?.hhh_fn_timeupdate)
const fn_timeupdate = function(){
// log('---------fn_timeupdate----------')
let fn = fn_timeupdate
const LIMIT = 1000 //ms
const DELAY_LIMIT = 60000
if(fn.interval === undefined) {
fn.interval = 0
fn.interval_update = 0
fn.time = Date.now()
}
const now = Date.now()
fn.interval += now - fn.time
fn.interval_update += now - fn.time
fn.time = now
if((fn.interval === 0 || fn.interval > LIMIT) && h5Player.currentTime !== 0 ){ //默认每秒调用一次
//新进度 < 记忆进度 60s更新
const obj = get_obj()
const vid = get_curr_data_key()
if(vid === undefined) { err('当前视频不在item内'); fn.interval = 0; return }
let time = obj?.progress_list?.[vid]
if(time === undefined || (time !== -1 && time < h5Player.currentTime)){ fn.limit_update = LIMIT } //1s
else{ fn.limit_update = DELAY_LIMIT } //60s
fn.interval = 0
// log('currentTime:',h5Player.currentTime, 'time:',time, 'interval:',fn.interval, 'interval_update:',fn.interval_update, 'limit_update:',fn.limit_update)
if(fn.interval_update >= fn.limit_update){
update_obj()
update_progress(vid)
update_title()
fn.interval_update = 0
}
draw_progress_red(vid)
}
}
h5Player.addEventListener('timeupdate', fn_timeupdate)
$(bb['video'])[0].hhh_fn_timeupdate = fn_timeupdate
//end
const fn_ended = function(){
// log('---------fn_ended----------')
update_obj(-1)
update_progress()
update_title()
}
run_ended({'hhh_update_progress': fn_ended})
//点击跳转最后观看
//$multipart_progress.find('a').off('click.hhh_progress').on('click.hhh_progress', function(){ jump_last_video(this) })
//自动跳转最后观看 - 可能存在问题
//if(run_count <= 0 && $(bb['video'])[0].hhh_last_bv === get_bv() && config.getCheckboxSettingStatus('autoJumpMemoryProgress') === ON){
if($(bb['video'])[0].hhh_last_bv !== get_bv() && config.getCheckboxSettingStatus('autoJumpMemoryProgress') === ON){
log('自动跳转最后观看:',run_count,$(bb['video'])[0].hhh_last_bv,get_bv())
$(bb['video'])[0].hhh_last_bv = get_bv()
waitForTrue( ()=> $('.hhh-video-seek').length >= 1, ()=> $('.hhh-video-seek').click() )
}
//换P自动跳转最后观看时间
if(config.getCheckboxSettingStatus('autoJumpMemoryProgress') === ON){
log('换P自动跳转最后观看时间: ',run_count)
const obj = get_obj()
const part = get_part()
if(!!obj?.progress_list?.[part_to_vid(part)]){
let currentTime = obj?.progress_list?.[part_to_vid(part)]
currentTime = currentTime < 0 ? 0 : currentTime
$(`.list-box li:eq(${reals_to_draws[part]-1}) .clickitem`).click()
h5Player.currentTime = currentTime
}
}
}
//根据进度画右侧红线
function draw_progress_red(data_key){
// log('---------draw_progress_red----------', data_key)
let $item = get_$item(data_key)
let height = '31px'
if(LIST_TYPE === VIDEO_LIST){ $item = $item.find('.simple-base-item') }
if($item.find('.hhh-multi-page-progress-border-right').length <= 0){
$item.find('.hhh-multi-page-progress').clone().appendTo($item).removeClass('hhh-multi-page-progress')
.addClass('hhh-multi-page-progress-border-right')
}
// const duration = timestr_to_second($item.find('.stat-item.duration').text()?.match(/([\d:]+)/)?.[1])
const duration = timestr_to_second($item.find('.stat-item.duration').text())
const cent = (h5Player.currentTime/duration)*100
$item.find('.hhh-multi-page-progress-border-right').width(`${cent}%`).height(`${height}`) //右侧红线
}
//title
/*
option:{
total_part:'0'
counter:'0'
currentTime:'0'
last_part:'0'
watch_date:'0'
watch_time:'0'
},
progress_list:{
[(bvid|cid):currentTime]
[(bvid|cid):currentTime]
...
}
*/
function update_title(){
// log('---------update_title----------')
const obj = get_obj()
let op = obj?.option
if(!obj || !op || !op.watch_date || !op.watch_time || !op.last_part || !op.currentTime || op.currentTime === 0) return
const format_date = op.watch_date === new Date().Format("MM-dd") ? '今天' : op.watch_date
// const duration = LIST_TYPE === MULTI_P ? $(`.list-box .duration:eq(${parseInt(op.last_part)-1})`).text().split(/√/)?.[0]
// : $(`.video-episode-card__info-duration:eq(${reals_to_draws[parseInt(op.last_part)]-1})`).text().split(/√/)?.[0]
const duration = get_curr_part_duration()
const cent = parseInt(op.currentTime / timestr_to_second(duration) * 100)
const html = `
看到${op.last_part} ${sec2str(parseInt(op.currentTime))} (${cent}%)
`
let $multipart_progress = $('#hhh_memory_multipart_progress')
if($multipart_progress.html() === '') {
// log('--------1--------')
$multipart_progress.html(`${html}`)
// add tip * 3
tip_create_3_X({ target: $('.hhh-video-seek'), tip_target: $('#hhh_tip'), gap: 6,
title: ()=>{ return `${format_date} ${op.watch_time}观看` }
})
tip_create_3_X({ target: $multipart_progress.find('button'), tip_target: $('#hhh_tip'), gap: 6,
title: '清空所有进度,重置为初始状态'
})
tip_create_3_X({ target: $('.hhh-viewed'), tip_target: $('#hhh_tip'), gap: 6,
title: '已观看数量,点击循环定位(右键向后)'
})
//get last part
// eslint-disable-next-line no-inner-declarations
function get_last_part(){
return parseInt($('.hhh-video-seek').attr('part'))-1
}
//part click
// eslint-disable-next-line no-inner-declarations
function part_click(part){
part = reals_to_draws[part]
if(LIST_TYPE === MULTI_P){ //多P
$(`.list-box li:eq(${part}) .clickitem`).click()
}else if(LIST_TYPE === VIDEO_LIST){ //合集
$(`.video-section-list .video-episode-card:eq(${part})`).click()
}
}
//重置
function set_reset_button(){
$('#hhh_memory_multipart_progress button').off('click.hhh_progress_button').on('click.hhh_progress_button', ()=>{
let box = new hhh_box()
box.create({target: $('#hhh_memory_multipart_progress button'), color: '#00b5e5', text: '是否重置', gap: 8,
enter_fn: ()=>{
localStorage.removeItem(get_progress_id())
$('.hhh-multi-page-progress').remove()
$('.hhh-multi-page-progress-border-right').remove()
$('.hhh-viewed').remove()
$('#hhh_total_time').text($('#hhh_total_time').text().split('|')[0])
remove_all_duration_pass()
// const $list = $('.list-box .duration').add($('.video-section-list .video-episode-card__info-duration'))
// $list.each(function(){
// const $duration = $(this)
// if($duration.text().match(/√/)) $duration.text($duration.text().match(/([\d:]+)/)?.[1]) //去掉 √
// })
}
})
})
}
set_reset_button()
// get one_height
// eslint-disable-next-line no-inner-declarations
function get_one_height(){
let $first_list = $('.video-pod__list>.video-pod__item:first')
const margin_top = parseInt($first_list.css('margin-top'))
const margin_bottom = parseInt($first_list.css('margin-bottom'))
const one_height = $first_list.outerHeight() + Math.min(margin_top, margin_bottom)
return one_height
}
//循环定位
function cycle_locate(){
$('.hhh-viewed').off('contextmenu').on('contextmenu', (e)=>{ e.stopImmediatePropagation(); e.preventDefault() })
$('.hhh-viewed').off('mouseup.hhh_progress_viewed').on('mouseup.hhh_progress_viewed', function(e){
const index = e.button === 2 ? -1 : 1 //前进或后退
const one_height = get_one_height()
//const total_view = $('.list-box .hhh-multi-page-progress').length // 8
const total_view = LIST_TYPE === MULTI_P ? $('.list-box .hhh-multi-page-progress').length // 8
: $('.video-section-list .hhh-multi-page-progress').length
const curr_view = parseInt($('.hhh-viewed').text()?.match(/\d+/)?.[0]) // 1 - 8
const is_single_num = !parseInt($('.hhh-viewed').text()?.match(/\d+.(\d+)/)?.[1]) // 判断显示类型
let next_view = (curr_view + index) || total_view // 0 -> length, length+1 -> 1
next_view = next_view > total_view ? 1 : next_view
if(is_single_num && index === -1) next_view = total_view // (num)的形式,循环定位第一或最后
const curr_view_index = LIST_TYPE === MULTI_P ? $('.list-box li:has(.hhh-multi-page-progress)').eq(next_view - 1).index()
: $('.video-section-list .video-episode-card:has(.hhh-multi-page-progress)').eq(next_view - 1).index()
//log(one_height,total_view,curr_view,curr_view_index)
$('.cur-list, .video-sections-content-list').scrollTop(4 + one_height * curr_view_index)
$('.hhh-viewed').text(`(${next_view}/${total_view})`) //已观看数量
})
}
cycle_locate()
//初始化已观看数量
function set_viewed_count(){
const total_view = $('.video-pod__list .hhh-multi-page-progress').length
if($('.hhh-viewed').attr('count') !== total_view){
$('.hhh-viewed').attr('count', total_view)
$('.hhh-viewed').text(`(${total_view})`) //已观看数量
}
}
set_viewed_count()
//双击跳转到观看进度
function Jump_to_viewing_progress(){
return
$('.list-box, .video-sections-content-list').off('dblclick.hhh_video_list').on('dblclick.hhh_video_list', function(){
const obj = get_obj()
let part = get_part()
//console.log('双击跳转观看进度', part)
if(!!obj?.progress_list?.[part_to_vid(part)]){
let currentTime = obj?.progress_list?.[part_to_vid(part)]
currentTime = currentTime < 0 ? 0 : currentTime
LIST_TYPE === MULTI_P ? $(`.list-box li:eq(${bulid_real_to_draw()[part]-1}) .clickitem`).click()
: $(`.video-section-list .video-episode-card:eq(${part-1})`).click()
h5Player.currentTime = currentTime
}
})
}
Jump_to_viewing_progress()
// //跳转最后1P 不使用
// // eslint-disable-next-line no-inner-declarations
// function jump_last_video(selector){
// //log($(selector).attr('part'), $(selector).attr('currentTime'))
// if(!$(selector).attr('part') || !$(selector).attr('currentTime')) return false //无数据
// part_click(get_last_part())
// //$(`.list-box li:eq(${parseInt($(selector).attr('part'))-1}) .clickitem`).click()
// h5Player.currentTime = $(selector).attr('currentTime')
// h5Player.play()
// const margin_top = parseInt($('.list-box li:first').css('margin-top'))
// const margin_bottom = parseInt($('.list-box li:first').css('margin-bottom'))
// const one_height = $('.list-box li:first').outerHeight() + Math.max(margin_top, margin_bottom)
// $('.list-box').scrollTop(one_height * (parseInt($(selector).attr('part'))-4))
// }
//跳转last_part
$('.hhh-video-seek').off('click.hhh_progress_seek').on('click.hhh_progress_seek', function(){
const data_key = $('.hhh-video-seek').attr('data_key')
// log(data_key, get_$item(data_key).index(), get_one_height())
$('.video-pod__body').scrollTop(4 + get_one_height() * (get_$item(data_key).index()))
//log('---jump_last_video click---')
//jump_last_video(this)
})
}else{
// log('--------2--------')
// const html = `
看到${obj.last_part} ${sec2str(parseInt(obj.currentTime))} (${cent}%)
//
//
`
let $video_seek = $multipart_progress.find('.hhh-video-seek')
$video_seek.attr('part', op.last_part)
$video_seek.attr('data_key', op.last_data_key)
$video_seek.attr('currentTime', op.currentTime)
$video_seek.text(`看到${op.last_part} ${sec2str(parseInt(op.currentTime))} (${cent}%) `)
//初始化已观看数量
function set_viewed_count(){
const total_view = $('.video-pod__list .hhh-multi-page-progress').length
if($('.hhh-viewed').attr('count') !== total_view){
$('.hhh-viewed').attr('count', total_view)
$('.hhh-viewed').text(`(${total_view})`) //已观看数量
}
}
set_viewed_count()
}
}
//progress
function update_progress(data_key){
// log('---------update_progress----------', data_key)
if($('#hhh_style_progress').length <= 0){
append_style($('.video-pod__body'), 'hhh_style_progress',
`
.hhh-video-seek, .hhh-viewed {
color: inherit;
}
.hhh-multi-page-li {
position: relative;
}
.hhh-multi-page-progress {
position: absolute;
pointer-events:none;
left: 0px;
/*top: 0px;*/
background-color: rgb(0 255 255 / 0.12);
border-right: none;
/*height: 36|30px;*/
}
.hhh-multi-page-progress-border-right {
position: absolute;
pointer-events:none;
left: 0px;
/*top: 0px;*/
background-color: #00000000;
border-right: #ffbbbb 1px solid;
/*height: 36|30px;*/
}
`
)
}
//用颜色标明进度百分比
const obj = get_obj()
if(obj?.progress_list !== undefined){
// log(obj.progress_list)
//画进度条和百分比
function draw_progress(data_key, currentTime){
let $item = get_$item(data_key)
let height = '31px'
if(LIST_TYPE === VIDEO_LIST){ $item = $item.find('.simple-base-item') }
//创建
if($item.find('.hhh-multi-page-progress').length <= 0){
$item.append(`
`)
}
//刷新
let $progress = $item.find('.hhh-multi-page-progress')
let $duration = $item.find('.stat-item.duration')
let $check_mark = $item.find('.hhh_check_mark')
if(currentTime === -1){ //-1代表已看完,加 √
$progress.width(`100%`)
if($check_mark.length <= 0) $duration.append('
√')
}else{
const cent = (currentTime / timestr_to_second($duration.text())) * 100
$progress.width(`${cent}%`)
$check_mark.remove() //去掉 √ 如果有
}
}
let slice = data_key === undefined ? obj.progress_list : {[data_key]: obj.progress_list[data_key]}
for(let [data_key, currentTime] of Object.entries(slice)){
draw_progress(data_key, currentTime)
}
}
}
//inti sort
let right_container = 'right-container'
async function init_sort(open, change_width = OFF){
// log('-----init__sort-----')
//判断是否是同一个item,如是则不改变宽度
// log('判断是否是同一个item2', $('.video-pod')[0].hhh_sort_slide_id, get_slide_id())
if($('.video-pod')[0].hhh_sort_slide_id === get_slide_id() && change_width === OFF) return
$('.video-pod')[0].hhh_sort_slide_id = get_slide_id()
$('#hhh_listsort').off('click.hhh_listsort')
$('#hhh_listsort').remove()
$('#hhh_style_listsort').remove()
$('.hhh_episode_view').remove()
if(open === OFF) { return }
if(['合集', '视频选集'].includes(video_type) === false) return // '视频选集', '合集', '收藏列表'
if($('.hhh_episode_view').length > 0) return
//取得【views, dms, durations, show_views, show_dms】
async function get_infos(){
function get_合集_视频选集_$cur_list() { return $('.video-pod')[0].__vue__.podCurArcList }
function get_合集_视频选集_counts() { return $('.video-pod')[0].__vue__.podCurArcList.length }
function get_合集_infos(){
function get_合集_episodes() { return $('.video-pod')[0].__vue__.sectionsInfo.sections[
$('.video-pod__slide').length > 0 ? $('.slide-item.active').index() : 0
].episodes }
let podCurArcList = get_合集_视频选集_$cur_list()
let episodes = get_合集_episodes()
let views = {}, dms = {}, durations = {}, show_views = {}, show_dms = {}, data_keys = {}
podCurArcList.forEach((v,i) => {
views[i] = episodes[i].arc.stat.view
dms[i] = episodes[i].arc.stat.danmaku
durations[i] = episodes[i].arc.duration
show_views[i] = v.view
show_dms[i] = v.danmaku
data_keys[i] = v.bvid
})
// log(views, dms, durations, show_views, show_dms)
return [views, dms, durations, show_views, show_dms, data_keys]
}
async function get_视频选集_infos(){
function load_视频选集_dms(){
function get_a_dm(cid, p){
var xhr = new XMLHttpRequest()
let url = `https://api.bilibili.com/x/v2/dm/web/view?type=1&oid=${cid}`
// if(page.page == 2) { cid = 'xxx'; log('cid err'); url = `https://api.bilibili.com/x/v2/dm/web/view?type=1&oid=${cid}` }
// if(page.page == 3) { log('url err'); url = `https://api.bilibili.com/x/v2/dm/web/viewxxxx?type=1&oid=${cid}` }
xhr.open('GET', url, true)
xhr.responseType = 'arraybuffer'; // 设置响应类型为 'arraybuffer' 以接收二进制数据
xhr.onload = function() {
if (xhr.status === 200) {
dms[p] = 'status 200 err'
let Root = window.protobuf.Root.fromJSON(jsonDescriptor)
let message = Root.lookupType("bilibili.community.service.dm.v1.DmWebViewReply")
let o = message.toObject(message.decode(new Uint8Array(xhr.response)))
// console.log(cid, p, o.count)
test_dms.push([p, o.count, cid])
dms[p] = o.count ?? 0
} else { dms[p] = 'status other err'; console.error('请求失败,状态码:', xhr.status) }
}
xhr.onerror = function(err){ dms[p] = 'onerror'; console.error('请求出错', err) }
xhr.send()
}
let jsonDescriptor = JSON.parse('{"nested":{"bilibili":{"nested":{"community":{"nested":{"service":{"nested":{"dm":{"nested":{"v1":{"nested":{"DmWebViewReply":{"fields":{"count":{"type":"int64","id":8}}}}}}}}}}}}}}}')
let test_dms = []
let len = cids.length > 30000 ? 30000 : cids.length
// len = 2
for(let i=0; i
v.cid)
let dms = {}
cids.forEach((v,i)=> dms[i] = undefined)
// log(cids, dms)
load_视频选集_dms()
//加载
log('数据共:', list_counts)
if(await isTimeout(()=>{
function ready_data_count() { return Object.values(dms).filter(v => typeof v === 'number' && v >= 0).length }
// function insert_data_count() { return Object.values(infos.dms).filter(v => typeof v === 'number' && v < 0).length }
function unxhr_data_count() { return Object.values(dms).filter(v => v === undefined).length }
function xhr_err_data_count() { return Object.values(dms).filter(v => typeof v === 'string').length }
let ready_count = ready_data_count()
log('已读取:', ready_count)
//加载完成
if(ready_count === list_counts) { log('OK 加载完成:', ready_count); timeEnd('main'); console.time('main2'); return true }
//如果还有未加载数据,继续等待读取
let unxhr_count = unxhr_data_count()
if(unxhr_count > 0) { log('还有未加载数据:', unxhr_count, ',继续'); return false }
//上一轮加载循环完成,重新加载错误数据
let xhr_err_count = xhr_err_data_count()
if(xhr_err_count > 0) { log('上一轮加载循环完成,重新加载错误数据:', 'xhr_err_count'); load_视频选集_dms(); return false }
return false
})) { err('load_视频选集_dms timeout'); return }
//durations, show_dms
let durations = {}, show_dms = {}, data_keys = {}
let pages = get_视频选集_pages()
pages.forEach((v,i)=>{
durations[i] = pages[i].duration
show_dms[i] = formatPlayCount(dms[i])
data_keys[i] = pages[i].cid
})
// log('dms:', dms, show_dms, durations)
return [dms, durations, show_dms, data_keys]
}
let infos = {}
if(video_type === '合集') { [infos.views, infos.dms, infos.durations, infos.show_views, infos.show_dms, infos.data_keys] = get_合集_infos() }
else if(video_type === '视频选集') { [infos.dms, infos.durations, infos.show_dms, infos.data_keys] = await get_视频选集_infos() }
// log(infos.views, infos.dms, infos.durations, infos.show_views, infos.show_dms)
return infos
}
//
function set_episode(){
// log('---set_episode---')
if($('.hhh_episode_view').length > 0) return //已插入
//返回一个episode节点
function return_episode_dom(types){
//定义&克隆 view dm等
let $view = $('.video-info-detail-list .view.item:first').clone()
let $dm = $('.video-info-detail-list .dm.item:first').clone()
// $view.add($dm).css({'border': '1px solid'})
$view.add($dm).css({'margin-right': '4px', 'display': 'inline-flex', 'align-items': 'baseline', 'justify-content': 'center'})
.find('svg').css({'width': '12px', 'height': '12px', 'margin-right': '2px'})
$view.css({'margin-right': '3px'})
$view.find('svg')[0].setAttribute('viewBox', '-2 -2 20 20')
$dm.find('svg')[0].setAttribute('viewBox' , '-2 -2 20 20')
//定义episode
let $episode = $('')
$episode.css({'color': 'var(--text3)', 'font-size': '12px', 'display': 'flex', 'justify-content': 'space-between', 'margin-right': '5px' })
types.includes(VIEW) && $episode.append($view.clone())
types.includes(DM ) && $episode.append($dm.clone())
return $episode
}
const [VIEW, DM] = ['VIEW', 'DM']
let $episode = return_episode_dom(video_type === '合集' ? [VIEW, DM] : [DM])
function insert_episode(i, [view, dm, duration, show_view, show_dm, data_key]){
// log(view, dm, duration, show_view, show_dm)
if($episode.find('.view')[0]) $episode.find('.view')[0].lastChild.textContent = show_view
if($episode.find('.dm' )[0]) $episode.find('.dm' )[0].lastChild.textContent = show_dm
$episode.attr('view', view)
$episode.attr('dm', dm)
$episode.attr('TM', duration)
$episode.attr('real_idx', i)
//let $insert_position = video_type === '合集' ? $(`.video-section-list .video-episode-card__info-title:eq(${i})`1) : $(`.list-box .link-content:eq(${i})`)
let index = get_$item(data_key).index()
// log(index, i)
$(`.video-pod__item:eq(${index}) .stats`).prepend($episode.clone())
}
$('.hhh_episode_view').remove()
// console.time('episode')
//插入$episode(view / dm)
for( let[i,v] of Object.entries(infos.show_dms)){
if(video_type === '合集') insert_episode(i, [infos.views[i], infos.dms[i], infos.durations[i], infos.show_views[i], infos.show_dms[i], infos.data_keys[i]])
else if(video_type === '视频选集') insert_episode(i, [null, infos.dms[i], infos.durations[i], null, infos.show_dms[i], infos.data_keys[i]])
$(`.video-pod__item:eq(${i}) .stats`).css({'display': 'flex', 'justify-content': 'space-between'})
$(`.video-pod__item:eq(${i}) .duration`).css({'text-align': 'right'})
// $(`.video-pod__item:eq(${k}) .duration`).css({'border': '1px solid'})
}
// console.timeEnd('episode')
//设置为统一宽度
$('.video-pod__list .duration').width('')
let w1 = -1, w2 = -1, w3 = -1
$('.video-pod__list .stats').each((i,v)=>{
w1 = w1 < $(v).find('.view').width() ? $(v).find('.view').width() : w1
w2 = w2 < $(v).find('.dm').width() ? $(v).find('.dm').width() : w2
w3 = w3 < $(v).find('.duration').width() ? $(v).find('.duration').width() : w3
// console.log('设置为统一宽度:',w1,w2,w3)
})
// console.log(++w1,++w2,w3)
$('.video-pod__list .stats').each((i,v)=>{
$(v).find('.view').width(w1+2)
$(v).find('.dm').width(w2+2)
$(v).find('.duration').width(w3+15)
})
}
// Test
let log = ()=>{}
let timeEnd = console.timeEnd
timeEnd = ()=>{}
console.time('main')
requestAnimationFrame(()=>true)
// log('------start------')
let infos = await get_infos()
// log('infos:',infos)
set_episode()
// return
////////////////////////////
let header_column_names = video_type === '合集' ? ['重置', 'Title', 'View', 'DM', 'TM'] : ['重置', 'Title', 'DM', 'TM']
////////////////////////////////
////////////////////////////////
// let w = get_title_max_width()
// let rw = $('.right-container').width()
// log('container:',rw, title_max_width - w)
// $('.right-container').width(rw+(title_max_width - w))
//加入排序HEAD
function add_listsort(){
if($('.hhh_episode_view').length <= 0) return
//Sort Head CSS
$('#hhh_style_listsort').remove()
if($('#hhh_style_listsort').length <= 0){
append_style($('.video-pod'), 'hhh_style_listsort',
`
.hhh-listsort-head {
background-repeat: no-repeat;
background-position: center right;
padding: 4px 0px 4px 0px;
white-space: normal;
cursor: pointer;
border: 1px solid #cdcdcd;
border-right-width: 0px;
background-color: #99bfe6; /*#99bfe6*/
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
font-weight: bold;
text-shadow: 0 1px 0 rgb(204 204 204 / 70%);
opacity: 0.7;
user-select: none;
white-space: pre;
/*background-color: #9fbfdf;*/
/*background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); ascending*/
/*background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); descending*/
}
.hhh-listsort-head-asc {
/*opacity: 0.91;*/
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
}
.hhh-listsort-head-desc {
/*opacity: 0.91;*/
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
}
`
)
}
function get_header_item_width(video_type){
let reset = 32
let view = $('.video-pod__item:first .view').width()+3
let dm = ($('.video-pod__item:first .dm').width() < 35 ? 35 : $('.video-pod__item:first .dm').width()) +5
let duration = $('.video-pod__item:first .duration').width()+16
let title = $('.video-pod__list').width()-reset-view-dm-duration
if(video_type === '合集') return [reset, title, view, dm, duration]
else if(video_type === '视频选集') return [reset, title, dm, duration]
}
let total_w = $('.video-pod__list').width()
// log($('.video-pod__body').css('margin-left').match(/[-\d]+/)?.[0], $('.video-pod__list').css('margin-left').match(/[-\d]+/)?.[0])
let margin_left = +$('.video-pod__body').css('margin-left').match(/[-\d]+/)?.[0] + (+$('.video-pod__list').css('margin-left').match(/[-\d]+/)?.[0])
let margin_top, margin_bottom
if(video_type === '合集'){
margin_top = 0, margin_bottom = 1
}else if(video_type === '视频选集'){
margin_top = 10, margin_bottom = 1
}
let widths = get_header_item_width(video_type)
// let [Index, Title, View, DM, TM] = ['重置', 'Title', 'View', 'DM', 'TM']
$('#hhh_listsort').remove()
$('.video-pod__body').before(`
${(function add_span(){
let spans = ''
widths.forEach((v,i)=>{ spans += ` ${header_column_names[i]}` })
return spans
})()}
`)
$('#hhh_listsort span:first').css({'background-image': 'none'})
$('#hhh_listsort span:last ').css({'border-right-width': '1px'})
}
// window.removeEventListener('resize', add_listsort)
// window.addEventListener('resize', add_listsort)
//修改bilibili setSize函数,修改对应语句,重置right-container宽度,适配插入的节点listsort(主要是点击量和弹幕量)
function reset_setSize(){
if(video_type !== '合集') return
//n = 1680 < innerWidth ? 411 : 350
let reg = /(n\s*=\s*\d+\s*<\s*innerWidth\s*\?\s*)(\d+)\s*:\s*(\d+)/
let new_w = Math.max($('.right-container').width(), 411)
window.setSize = eval(`(${window.setSize.toString().replace(reg, `$1${new_w}:${new_w}`)})`)
//d < 668 && (d = 668), | 558
// let reg2 = /d\s*<\s*(\d+)\s*&&\s*\(d\s*=\s*(\d+)\),/
// let new_d = 558
// window.setSize = eval(`(${window.setSize.toString().replace(reg2, `d < ${new_d} && (d = ${new_d}),`)})`)
// let diff_width = new_w - 411
//o = parseInt(16 * (i - (1690 < innerWidth ? 318 : 308)) / 9)
// let reg3 = /318\s*:\s*(308)/
// let new_318 = 318 + diff_width
// window.setSize = eval(`(${window.setSize.toString().replace(reg3, `${new_318} : $1`)})`)
//r = t - 112 - n
// log('diff_width:', diff_width, new_w)
// let reg4 = /t\s*-\s*\d+\s*-\s*n/
// let new_112 = 112 + diff_width
// window.setSize = eval(`(${window.setSize.toString().replace(reg4, `t - ${new_112} - n`)})`)
window.dispatchEvent(new Event('resize'))
}
function header_sort(){
//['重置', 'Title', 'View', 'DM', 'TM', 'TM_str', 'View_fmt', 'DM_fmt'] ...
//【listsort】事件
//video-section-list section-0 section-1 section-2 ...
function store(){
let $video_items = $('.video-pod__list>.video-pod__item')
let video_items_array = Array.from($video_items)
return video_items_array
}
function bulid_sort_arr(video_items_array){
let unsorted_data_columns_arr = []
//保存排序数据
$(video_items_array).each((i,v)=>{
let $v = $(v)
let Title = $v?.find('.title')?.attr('title')
let $episode = $v.find('.hhh_episode_view')
let [real_idx, View, DM, TM] = [+$episode.attr('real_idx'), +$episode.attr('view'), +$episode.attr('dm'), +$episode.attr('TM')]
// '合集' ? ['重置', 'Title', 'View', 'DM', 'TM'] : ['重置', 'Title', 'DM', 'TM']
let unsorted_data_columns = video_type === '合集' ? [real_idx, Title, View, DM, TM] : [real_idx, Title, DM, TM]
// log(header_column_names, unsorted_data_columns)
unsorted_data_columns_arr.push(unsorted_data_columns)
})
return unsorted_data_columns_arr
}
//sort
function arr_sort(unsorted_data_columns_arr, order, i){ //ascending, descending
let sorted_data_columns_arr
if(order === 'ascending') {
sorted_data_columns_arr = [...unsorted_data_columns_arr].sort(function(a, b) {
if(typeof a[i] === 'string'){
return a[i].localeCompare(b[i])
}else{
return a[i] - b[i]
}
})
}else if(order === 'descending') {
sorted_data_columns_arr = [...unsorted_data_columns_arr].sort(function(b, a) {
if(typeof a[i] === 'string'){
return a[i].localeCompare(b[i])
}else{
return a[i] - b[i]
}
})
}else{err('[arr_sort] Out of range')}
return sorted_data_columns_arr
}
function restore(sorted_data_columns_arr, unsorted_data_columns_arr, video_items_array){
//建立排序后和真实顺序的对应关系,范围:1~length
let real_to_draw = []
unsorted_data_columns_arr.forEach(function(v,i){
real_to_draw[v[0]] = i
})
let new_video_items_array = []
sorted_data_columns_arr.forEach(function(v,i){
new_video_items_array[i] = video_items_array[real_to_draw[v[0]]]
// log(i,v,v[0],real_to_draw[v[0]])
})
let video_list = $('.video-pod__list')[0]
video_list.innerHTML = ''
new_video_items_array.forEach(function(v,i){
video_list.appendChild(v)
})
}
//list_sort
function list_sort(order, i){
//[index, Title, View, DM, tm_str, TM, view_fmt, dm_fmt] = [0, 1, 2, 3, 4, 5, 6, 7]
//let header_column_names = ['重置', 'Title', 'View', 'DM', 'TM_str', 'TM', 'View_fmt', 'DM_fmt']
let video_items_array = store()
let unsorted_data_columns_arr = bulid_sort_arr(video_items_array)
let sorted_data_columns_arr = arr_sort(unsorted_data_columns_arr, order, i)
restore(sorted_data_columns_arr, unsorted_data_columns_arr, video_items_array)
}
$('#hhh_listsort').off('click.hhh_listsort')
$('#hhh_listsort').on('click.hhh_listsort', function(e){
$('.hhh-listsort-head').css('opacity', 0.7)
let $head = $(e.target)
let sort = $head.attr('sort')
let text = $head.text().trim()
$head.css('opacity', 0.91)
if(sort === 'none'){
$head.attr('sort', 'descending')
.removeClass('hhh-listsort-head-asc')
.addClass('hhh-listsort-head-desc')
}else if(sort === 'ascending'){
$head.attr('sort', 'descending')
.removeClass('hhh-listsort-head-asc')
.addClass('hhh-listsort-head-desc')
}else if(sort === 'descending'){
$head.attr('sort', 'ascending')
.removeClass('hhh-listsort-head-desc')
.addClass('hhh-listsort-head-asc')
}else{err('[hhh_listsort click] Out of range')}
if(text === '重置'){
list_sort('ascending', header_column_names.indexOf(text))
$('.hhh-listsort-head').removeClass('hhh-listsort-head-asc')
.removeClass('hhh-listsort-head-desc')
}else{
// console.time('sort')
list_sort($head.attr('sort'), header_column_names.indexOf(text))
// console.timeEnd('sort')
}
// reals_to_draws = bulid_real_to_draw()
// log('click.hhh_listsort:', reals_to_draws)
})
}
add_listsort()
reset_setSize()
header_sort()
requestAnimationFrame(()=>false)
// console.timeEnd('main')
// log('------end------')
// })
}
function change_title_width(){
//判断是否是同一个item,如是则不改变宽度
// log('判断是否是同一个item', $('.video-pod')[0].hhh_change_width_slide_id, get_slide_id())
// log('判断是否是同一个item', $('.right-container').width())
if($('.video-pod')[0].hhh_change_width_slide_id === get_slide_id()) return
$('.video-pod')[0].hhh_change_width_slide_id = get_slide_id()
$('.video-pod')[0].hhh_sort_slide_id = undefined
let old_sections_w
let title_curr_width
let title_max_width
let right_container_curr_width
let right_container_max_width
//展开合集标题
async function expand_title(open = ON, default_title_max_width = 500){
// log('---合集标题展开---', default_title_max_width, $('.right-container').width(), config.getCheckboxSettingArgs('expandTitle', 'old_width'))
// log(open,'==========hasClass==========',$('#hhh_expand_title .switch-button').length, $('#hhh_expand_title .switch-button').hasClass('on'))
g_fn_arr[expand_title.name] = expand_title
//
function get_title_curr_width() {
return new Promise((resolve)=>{
setTimeout(() => {
resolve( $('.simple-base-item').not('.active').find('.title-txt:first').width() )
}, 10)
})
}
function get_title_max_width(){
$('.right-container').width('max-content')
let $items = $('.video-pod__list .title-txt')
let left_edges = []
$items.each((i,v)=>{ left_edges.push($(v).width()) })
let title_max_width = Math.max(...left_edges)
$('.right-container').width('')
return title_max_width
}
// title_curr_width = await get_title_curr_width()
title_max_width = get_title_max_width()
// log('title_curr_width:', title_curr_width, 'title_max_width:', title_max_width)
// $('.hhh_episode_view').show()
/*
// if(open === ON){
// if($('#hhh_expand_title .switch-button').length <= 0){ //初始运行或设置里开启
// //记录初始sections宽度
// old_sections_w = $('.base-video-sections-v1').width()
// let old_title_w = $('.video-episode-card__info-title').width()
// // log('old_sections_w:', old_sections_w, 'old_title_w:', old_title_w)
// //计算title最大宽度
// function get_items_width($items){
// let left_edges = []
// $items.each((i,v)=>{ left_edges.push($(v).width()) })
// left_edges.push(old_title_w)
// // log(Math.max(...left_edges),left_edges)
// left_edges = left_edges.sort(function(a, b) { return a - b })
// // log([...left_edges].reduce((a, b) => a + b, 0) / left_edges.length, left_edges)
// //可以设置按百分比去掉最宽的部分,避免个别过长标题造成合集过宽
// let ratio = 0.9
// left_edges = left_edges.slice(0, Math.ceil(left_edges.length * ratio))
// // log(Math.max(...left_edges),[...left_edges].reduce((a, b) => a + b, 0) / left_edges.length, default_title_max_width,left_edges)
// // return [...left_edges].reduce((a, b) => a + b, 0) / left_edges.length
// return Math.max(...left_edges)
// }
// $('.video-episode-card__info-title').width('auto').css({'overflow': 'visible'})
// title_max_width = get_items_width($('.video-episode-card__info-title')) + 5
// // $('.video-episode-card__info-title').width('').css({'overflow': 'hidden'})
// }else{} //调整展开宽度
// }else{ //设置里关闭
// if($('#hhh_expand_title .switch-button').hasClass('on') === true){
// $('#hhh_expand_title').click()
// config.setCheckboxSettingArgs('expandTitle', 'is_expand', ON)
// config.storageCheckboxSetting()
// }
// }
*/
///////////////////////////////
///////////////////////////////
///////////////////////////////
function expand_list22(open=ON, columns=10){
// log('---合集列表展开---')
$('#hhh_expand_list').remove()
let old_max_height = '250px'
let list_class_str = '.video-pod__body'
$(list_class_str).css({'max-height': old_max_height})
if(open !== ON) return false
if(video_type !== '合集') return false //不是合集
//第一次执行
if($('#hhh_expand_list').length <= 0) {
//复制自动连播按钮
let $next_button = $('.auto-play:contains(自动连播)')
$next_button.clone().appendTo($('.header-top>.right'))
.attr({'id': 'hhh_expand_list', 'title': ''})
.css({'margin-top': '5px'})
.find('.txt').text(`展开列表`).end()
.parent().css({'display': 'flex', 'flex-direction': 'column'})
// .parent().css({'display': 'flex'})
old_max_height = $(list_class_str).css('max-height')
}
//点击列表展开
let $vitem = $('.video-pod__item:first')
let vitem_height = $vitem.outerHeight() + parseInt($vitem.css('margin-top')) + parseInt($vitem.css('margin-bottom'))
let $switch_button = $('#hhh_expand_list .switch-btn')
if($switch_button.hasClass('on') === true) $switch_button.toggleClass('on') //初始不展开状况
$('#hhh_expand_list').off('click.hhh_expand_list')
$('#hhh_expand_list').on('click.hhh_expand_list', function(){
$switch_button.toggleClass('on')
if($switch_button.hasClass('on') === true){
let limit_height = vitem_height * columns //限高
$(list_class_str).css({'max-height': limit_height}) //展开columns个的高度
} else {
$(list_class_str).css({'max-height': old_max_height})
}
});
$('#hhh_expand_list').click() //默认展开
}
///////////////////////////////
///////////////////////////////
///////////////////////////////
$('#hhh_expand_title').remove()
if(open !== ON) return false
if(video_type !== '合集') return false //不是合集
let $next_button = $('.auto-play:contains(自动连播)')
$next_button.clone().appendTo($('.header-top>.right'))
.attr({'id': 'hhh_expand_title', 'title': ''})
.css({'margin-top': '5px'})
.find('.txt').text(`展开标题`).end()
.parent().css({'display': 'flex', 'flex-direction': 'column'})
let $switch_button = $('#hhh_expand_title .switch-btn')
if($switch_button.hasClass('on') === true) $switch_button.toggleClass('on') //初始不展开状态
tip_create_3_X({ target: $('#hhh_expand_title'), tip_target: $('#hhh_tip'), gap: 6,
title: `尽量展开标题,Title默认宽度: ${config.getCheckboxSettingArgs('expandTitle', 'width')}px` })
$('#hhh_expand_title').off('click.hhh_expand_title')
$('#hhh_expand_title').on('click.hhh_expand_title', async function(){
$switch_button.toggleClass('on')
// log('expandTitle:', config.getCheckboxSettingStatus('expandTitle'), $switch_button.hasClass('on'), status)
if($switch_button.hasClass('on') === true){
config.setCheckboxSettingArgs('expandTitle', 'is_expand', ON)
config.storageCheckboxSetting()
let old_title_w = await get_title_curr_width()
let old_right_container_w = $('.right-container').width('').width()
// $('.right-container').width('').css({'overflow': 'visible'})
// log(default_title_max_width, title_max_width)
//window.innerWidth
// log('title_max_width', title_max_width, ' window.innerWidth/3', window.innerWidth/3)
if(+default_title_max_width === -1) default_title_max_width = window.innerWidth/3 //超过屏幕宽度1/3,限制宽度
// $('.video-pod__body .title-txt').css('border', 'blue solid')
if(title_max_width > window.innerWidth/3) $('.video-pod__body .title-txt').width(window.innerWidth/3)
//else if(+default_title_max_width === -1) $('.video-pod__body .title-txt').width('max-content')
else if(title_max_width < default_title_max_width) $('.video-pod__body .title-txt').width('max-content')
else $('.video-pod__body .title-txt').width('')
let new_title_w = Math.min(title_max_width, default_title_max_width)
let diff = new_title_w - old_title_w
// log('title_max_width', title_max_width, 'default_title_max_width', default_title_max_width)
// log('new_title_w',new_title_w, 'old_title_w', old_title_w, 'diff', diff)
// log(default_title_max_width, +default_title_max_width === -1, title_max_width, old_title_w, title_max_width - old_title_w)
$('.right-container').width(old_right_container_w + diff + 25)
// if(title_max_width > window.innerWidth/3) $('.right-container').width(old_right_container_w + diff + 20) //超过屏幕宽度一半,限制宽度
// else if(+default_title_max_width === -1) $('.right-container').width('max-content')
// else if(title_max_width < default_title_max_width) $('.right-container').width('max-content')
// else $('.right-container').width(old_right_container_w + diff)
// log('old_right_container_w',old_right_container_w, 'old_title_w', old_title_w, 'new_right_container_w', $('.right-container').width())
// add_listsort()
// reset_setSize()
// header_sort()
init_sort(status, ON)
// $('.right-container').css({'overflow': 'hidden'})
} else {
config.setCheckboxSettingArgs('expandTitle', 'is_expand', OFF)
config.storageCheckboxSetting()
// log('old_title_w',$('.right-container').width())
// $('.right-container').width('').css({'overflow': 'visible'})
$('.right-container').width('')
$('.video-pod__body .title-txt').width('')
// $('.base-video-sections-v1').width(old_sections_w)
// $('.right-container').width(old_sections_w)
// add_listsort()
// reset_setSize()
// header_sort()
init_sort(status, ON)
// $('.right-container').css({'overflow': 'hidden'})
}
})
// log('expandTitle - is_expand',config.getCheckboxSettingArgs('expandTitle', 'is_expand'))
if(config.getCheckboxSettingArgs('expandTitle', 'is_expand')) $('#hhh_expand_title').click() //默认展开
}
expand_title(config.getCheckboxSettingStatus('expandTitle'), config.getCheckboxSettingArgs('expandTitle', 'width'))
// drap_sections()
function drap_sections(){
$('.base-video-sections-v1').off('mousemove.hhh').off('mousedown.hhh')
function fn_move(e){
let b = $('.base-video-sections-v1')[0]
let r = b.getBoundingClientRect()
let diffX = e.clientX - r.x;//鼠标距box边框的距离
let diffY = e.clientY - r.y;
// log(diffX,diffY,r.x,r.y,r.width,r.height,e.clientX,e.clientY)
let is_open = config.getCheckboxSettingStatus('expandTitle') && config.getCheckboxSettingArgs('expandTitle', 'is_expand')
if(diffX > r.width-5 && is_open) $(this).css({cursor: 'w-resize'})
else $(this).css({cursor: ''})
}
$('.base-video-sections-v1').on('mousemove.hhh', fn_move)
$('.base-video-sections-v1').on('mousedown.hhh', function(e){
log($(this).css('cursor'))
if($(this).css('cursor') === 'w-resize'){
$('.base-video-sections-v1').off('mousemove.hhh')
let $down_this = $(this)
log('drapStart')
let doc = document
let begin_x = e.clientX
let begin_w = $('.base-video-sections-v1').width()
doc.onmousemove = function(e){
log('--onmove--')
let diffX = e.clientX - begin_x
log(diffX,e.clientX,begin_x)
$('.base-video-sections-v1').width(begin_w+diffX)
expand_title(config.getCheckboxSettingStatus('expandTitle'), config.getCheckboxSettingArgs('expandTitle', 'width'))
return false
}
doc.onmouseup = function(){
//清除事件
log('--onup--')
doc.onmousemove = null;
doc.onmouseup = null;
$down_this.css({cursor: ''})
$('.base-video-sections-v1').off('mousemove.hhh').on('mousemove.hhh', fn_move)
return false
}
}
//$(this).css({cursor: 'w-resize'})
})
}
}
//视频列表加长后,调节点击视频后滚动到中间
function new_video_scroll(){
if(LIST_TYPE !== VIDEO_LIST) return
let func = $('.base-video-sections-v1')[0]?.__vue__?.openSectionAndScrollToVideo
// log($('.base-video-sections-v1')[0]?.__vue__?.openSectionAndScrollToVideo)
if(func === undefined) return
// log('---openSectionAndScrollToVideo---')
try {
let t = Object.prototype.toString.call(func).slice(1,-1).split(' ')[1]
// log(t)
if(t.includes('Proxy') === true) return
func[Symbol.toStringTag] = 'Proxy-' + t
let handler = {
apply(target, ctx, args) {
// log(ctx.curVideoIndex)
let h = parseInt($('.video-episode-card')[1]?.offsetTop - $('.video-episode-card')[0]?.offsetTop)
h = isNaN(h) === true ? 34 : h
let $list = $('.video-sections-content-list')
let count = parseInt(($list[0]?.offsetTop + $list.height()/2 - 0 - 140) / h) //计算大约需要多滚动几个item
function draw_to_real(idx){
if(+idx < 0) idx = 0
if($('.hhh_episode_view').length <= 0) return +idx
return +$($('.hhh_episode_view').get(idx)).attr('real_idx') - 1
}
function real_to_draw(section_idx, video_idx){
let draw_idx = video_idx
$(`.video-section-list.section-${section_idx} .hhh_episode_view`).each((i,v)=>{
if(+$(v).attr('real_idx') === video_idx+1) {
draw_idx = i
return false
}
})
return draw_idx
}
let real_idx = ctx.curVideoIndex
let draw_idx = real_to_draw(ctx.curSectionIndex, ctx.curVideoIndex)
// log(real_idx, draw_idx, draw_to_real(draw_idx - count), count, draw_idx - count, $('.video-sections-item')[ctx.curSectionIndex].offsetTop)
ctx.curVideoIndex = draw_to_real(draw_idx - count)
Reflect.apply(...arguments)
// log('real_idx:', real_idx, 'draw_idx:', draw_idx, 'count:', count, 'draw_idx - count', draw_idx - count, 'ctx.curVideoIndex:', ctx.curVideoIndex)
if(draw_idx - count < 0){ //后续保证滚动到中间
let middle = parseInt($list.height()/2 - h/2)
$list.animate({ scrollTop: $(`.video-section-list.section-${ctx.curSectionIndex} .video-episode-card:eq(${draw_idx})`)[0].offsetTop - $list[0].offsetTop - middle }, 2000)
}
ctx.curVideoIndex = real_idx
// t.prototype.onEnded = function() {
// this.bufferAtom.checkBufferStatus(!1),
// this.bufferAtom.checkLaggingStatus(!1),
// this.patchAdvStore.hasLeftVideoToPlay() ? this.rootPlayer.emit(s.p.PATCH_ADV_PLAY_ENDED) : this.rootPlayer.emit(s.p.MEDIA_ENDED)
// }
},
}
$('.base-video-sections-v1')[0].__vue__.openSectionAndScrollToVideo = new Proxy(func, handler)
} catch (error) {
console.error(error);
// Expected output: ReferenceError: nonExistentFunction is not defined
// (Note: the exact output may be browser-dependent)
}
}
function other(){
//const [MULTI_P, VIDEO_LIST, ACTION_LIST, NORMAL_VIDEO] = ['视频选集', '合集', '收藏列表', '常规视频'] //视频选集/合集(选集是单个BV号,合集是多个BV号)
//标红当前播放条目,默认不够醒目
$('.video-pod__list .simple-base-item .title-txt').css({'color': 'var(--text1)'})
$('.video-pod__list .simple-base-item.active .title-txt').css({'color': 'red'})
}
// old_obj_convert_new()
init(open)
// return
// const $multipart_progress = init(open)
// if($multipart_progress === OFF) return false
//update_obj()
// counter_obj()
update_progress()
update_title()
init_sort(status)
change_title_width()
other()
//多合集刷新时更新单个合集
if($('.video-pod__slide').length > 0) {
let is_change_break = null
$('.video-pod__list')[0]?.hhh_ob2?.disconnect()
let ob = new MutationObserver((mutations, observer) => {
for (var mutation of mutations) {
let target = mutation.target
if(typeof target.className === 'string' && !!$(target).text()){
// log($(target).find('.title-txt:first').text())
clearTimeout(is_change_break)
is_change_break = setTimeout(function() {
log("合集刷新完毕")
init(open)
update_progress()
update_title()
init_sort(status)
}, 50)
}
}
})
ob.observe($('.video-pod__list')[0], { childList: true })
$('.video-pod__list')[0].hhh_ob2 = ob
}
// new_video_scroll()
// function run(open, run_count){
// }
// run(open, run_count++)
}
memory_multipart_progress(config.getCheckboxSettingStatus('memoryProgress'), [config.getCheckboxSettingStatus('sortList')])
}
//搜索界面自动展开更多筛选
function auto_more_conditions(){
waitForTrue(()=>{
if($('.more-conditions.ov_hidden').length > 0)
$('.vui_button.vui_button--active-shrink.i_button_more').click()
return $('.more-conditions.ov_hidden').length <= 0
}, ()=>{})
}
//新版评论图片,点击图片返回
function return_comment(){
let $image_wrap = $('.show-image-wrap')
let $image_content = $('.image-content')
if($image_content[0].id !== 'hhh_show_image_wrap'){
$image_content[0].id = 'hhh_show_image_wrap'
//点击图片关闭图片:相对于右上角X
$image_content.click(()=>{
$('.operation-btn-icon.close-container').click()
})
//点击空白位置前后轮播图片:相当于左右箭头
$image_wrap.click((e)=>{
let wrap = $image_wrap[0].getBoundingClientRect()
let image = $image_content[0].getBoundingClientRect()
let clientX = e.clientX
if(clientX >= wrap.left && clientX <= image.left) { $('.operation-btn-icon.last-image').click(); return false }
if(clientX <= wrap.right && clientX >= image.right) { $('.operation-btn-icon.next-image').click(); return false }
})
//设置不透明度,防止遮挡
$('.preview-list').css('opacity', '0.5')
}
}
//https://api.bilibili.com/x/web-interface/archive/relation?aid=896486345&bvid=BV1CA4y1S7fS //得到投币数量
//初始化
function init() {
//读取设置 设置信息 && 快捷键信息
config.getCheckboxSetting()
function set_danmuku_block_version(){
// 创建一个代理对象来监视window.webAbTest
let PropertyProxy = new Proxy({}, {
set: function(target, property, value) {
if (property === 'danmuku_block_version') {
value = 'OLD';
// 修改为'OLD'是旧版,'NEW'是新版
}
target[property] = value;
return true;
}
});
// 使用Object.defineProperty来监视window.webAbTest的属性
Object.defineProperty(window, 'webAbTest', {
set: function(value) {
Object.assign(PropertyProxy, value);
return true;
},
get: function() {
return PropertyProxy;
},
configurable: true
});
}
set_danmuku_block_version()
// log('%%%%%%%%%%%%%%%%%%',window.location.href, geth5Player(), geth5Player()?.['tagName'], geth5Player()?.['baseURI'])
// log('-----------',geth5Player())
waitForTrueNoErr(()=>{return (h5Player = geth5Player()) !== undefined}, ()=>{
function get_ver(){
let video_ver = window?.player?.getFormattedLogs()?.match(/version:\s*([\d.]+)/)?.[1]
let bili_ver = $('#app').length > 0 ? BILI_3_X_VIDEO_V1 :
$('#__next').length > 0 ? BILI_3_X_MOVIE : undefined
return [video_ver, bili_ver]
}
[video_ver, ver] = get_ver()
if(ver === undefined || video_ver === undefined) return false
bb_config.set_bb(ver)
window.hhh_bb = bb
window.hhh_config = config
function lazyload(fn_arr){
let exclude_kv_body = {
[BILI_3_X_VIDEO_V1]: {
k: ['danmukuTop', 'danmukuTopClose', 'danmukuBottom', 'danmukuBottomClose', 'biliDlgM', 'coinDlgCoin', 'coinDlgCloseBtn', 'coinDlgOkBtn', 'playPBP',
'playTipWrap2', 'playCtrlSubtitle', 'playWatchLater', 'playTipWrap', 'playListAutoPlay'],
v: ['.video-toolbar-left .video-like.on', '.video-toolbar-left .video-coin.on', '.video-toolbar-left .video-fav.on', '.coin-dialog-mask .coin-btn',
'.bpx-player-volume-hint-text', '.bpx-player-volume-hint-icon', '.bpx-player-hotkey-panel', '.bili-dialog-m', '.coin-dialog-mask',
'.bpx-player-hotkey-panel-close', '.bpx-player-info-close', '.bpx-player-info-container', '.info-line','.bpx-player-top-mask',
'.bili-dialog-m .bi-btn', '.bpx-player-volume-hint', '.bpx-player-electric-jump'],
},
[BILI_3_X_MOVIE]: {
k: ['danmukuTop', 'danmukuTopClose', 'danmukuBottom', 'danmukuBottomClose', 'biliDlgM', 'coinDlgCoin', 'coinDlgCloseBtn', 'coinDlgOkBtn', 'playPBP',
'playTipWrap2', 'playCtrlSubtitle', 'playWatchLater', 'likeon' , 'coinon', 'switchDot', 'collecton', 'collecton', 'playListAutoPlay'
],
v: ['.like-info.active', '.coin-info.active', '.collect-info.active', '.coin-dialog-mask .coin-btn', '.bpx-player-volume-hint', '.bili-dialog-m',
'.bpx-player-volume-hint-text', '.bpx-player-volume-hint-icon', '.bpx-player-hotkey-panel', '.coin-dialog-mask', '.bpx-player-electric-jump',
'.bpx-player-hotkey-panel-close', '.bpx-player-info-close', '.bpx-player-info-container', '.info-line','.bpx-player-top-mask'],
},
}
function check_dom1(exclude_kv, is_show) {
// log('---check_dom1---',exclude_kv)
let exclude_k = exclude_kv['k']
let exclude_v = exclude_kv['v']
for(let [k, v] of Object.entries(bb)){
//if(!!k && exclude_k.indexOf(k) !== -1) log(k,v); //test
if(!!k && exclude_k.indexOf(k) !== -1) continue;
// if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) log( k, exclude_v.indexOf(v) +' - '+$(v).length+' - '+v ) //test
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) {
if(is_show) log( k, exclude_v.indexOf(v) +' - '+$(v).length+' - '+v )
return false
}
}
return true
}
function check_dom2(){
let testarr = ''
let checked_dom = [ {cark:['.rec-list .upname path', '.RecommendItem_data___6DmA use', '.recommend-video-card']},
{comment:['###_complex_01', '#comment', '.reply-list .sub-reply-dislike path']} ]
let ret = checked_dom.every(doms => {
return Object.values(doms)[0].some(dom=>{
if(dom.match(/###.+/) !== null){
if(dom.match(/complex_01/) !== null){
testarr += `${dom} ${$($('bili-comments')[0]?.shadowRoot)?.find('#contents')?.length > 0} | `
// return $($('bili-comments')[0]?.shadowRoot)?.length > 0
return jQuery(jQuery('bili-comments')[0]?.shadowRoot)?.find('#contents')?.length > 0
}
}
// log('check_dom2-1:', dom, $(dom).length > 0)
testarr += `${dom} ${$(dom).length > 0} | `
return $(dom).length > 0
})
})
// log('check_dom2:', testarr, ret)
return ret
}
// function check_dom2(){
// let checked_dom = [ {cark:['.video-page-card-small', '.RecommendItem_wrap__5sPoo', '.recommend-video-card']}, {comment:['#comment', '.comment-container .reply-list']} ]
// // let checked_dom = [ {cark:['.video-page-card-small', '.RecommendItem_wrap__5sPoo', '.recommend-video-card']}, {comment:['.comment-container .reply-list']} ]
// let ret = checked_dom.every(e => {
// let $t = $()
// Object.values(e)[0].forEach(v=>{ $t = $t.add($(v)) })
// // log(Object.keys(e), $t.length)
// log('check_dom2-1:', true)
// if($t.length > 0) return true
// })
// log('check_dom2-2:', ret)
// return ret
// }
function check_attr(){
return window?.bpNC_1
}
function is_run(exclude_kv, is_show){
// log(check_dom1(exclude_kv, is_show) , check_dom2() , check_attr())
$ = jQuery = $hhh_jq
return check_dom1(exclude_kv, is_show)
&& check_dom2()
// && check_attr()
}
function fn_run(fn_arr){
fn_arr.forEach(v=>v())
}
function waitForTrue2(ifTrue, callback, ifArgs, callArgs, time=100) {
if(--time < 0) { err('waitForTrue2 超时 '+ifTrue); return false }
const fn = waitForTrue2
//let fn = arguments.callee;
if (ifTrue(...ifArgs, false)) {
callback(...callArgs); return true
} else {
setTimeout(function() { fn(ifTrue, callback, ifArgs, callArgs, time); }, 100)
}
}
if(ver !== undefined) waitForTrue2(is_run, fn_run, [exclude_kv_body[ver]], [fn_arr], 50)
else err('未知bilibili版本')
// waitForTrue(()=>{
// check_dom.forEach(e => {
// //console.log(e, $(e).length)
// for(let [k,v] of Object.entries(e)){
// console.log(v)
// let $t = $(v[0])
// v.slice(1,-1).forEach(e=>{
// $t = $t.add($(e))
// })
// console.log($t.length)
// }
// })
// }, ()=>{
// check_dom.forEach(element => {
// log(element, $(element).length)
// });
// })
// waitForTrue(()=> window?.bpNC_1, ()=>{
// log(window.bpNC_1.config.aid)
// fn_run(fn_arr)
// })
// log('^^^^^^^^^1',window?.user?.__ob__?.dep?.id, window.__VUE__)
// if(ver !== undefined) waitForTrue(()=>window?.user?.__ob__?.dep?.id && window.__VUE__, ()=>{
// log('^^^^^^^^^2',window?.user?.__ob__?.dep?.id, window.__VUE__)
// // log(window.__MIRROR_CONFIG__.config.whiteScreen.checkDom)
// // window.__MIRROR_CONFIG__.config.whiteScreen.checkDom.forEach((v,i)=>{
// // console.log(i,v,$(v).length)
// // })
// // fn_run(fn_arr)
// })
// else err('未知bilibili版本')
}
let eve = ['loadstart', 'durationchange', 'loadedmetadata', 'loadeddata', 'progress', 'canplay', 'canplaythrough'] //test
eve = ['loadeddata']
h5Player = geth5Player()
eve.forEach((v)=>{
$(h5Player).off(`${v}.hhh`)
$(h5Player).on(`${v}.hhh`,(e)=>{
// log(e.type)
if(e.type === 'loadeddata'){
waitForTrue(()=> window?.__INITIAL_STATE__?.videoData?.bvid === window?.__INITIAL_STATE__?.bvid, ()=>{
lazyload([run_once, video_loaded_run]) //video_loaded_run
})
}
})
})
})
// }
/* var box = document.getElementById("hhh");
//配置选项
var config = { childList: true, subtree: true, attributes: true };
var observer = new MutationObserver(function (mutationsList, observer) {
for (var mutation of mutationsList) {
const target = mutation.target;
//typeof target.className === 'string' && target.className !== '' && log(target.className);
if (mutation.type == 'childList') {
//console.log('子元素被修改');
}
else if (mutation.type == 'attributes') {
//console.log(mutation.attributeName + '属性被修改');
}
}
});
//开始观测
observer.observe(document.body, config); */
// GM_setValue('zw_test', a);
// console.log(GM_getValue('zw_test'));
// console.log(GM_getValue('zw_test').name);
let is_card_load = true
let is_content_load = null
let is_rec_list_load = null
let is_homepage_load = true
let is_fav_list_load = true
let is_history_break = null
let is_run_3X_break = true
let run_load = true
let run_done = false
let dm_t
let clickitem_name
let class_name_obj = {}
let old_url
new MutationObserver((mutations, observer) => {
mutations.forEach(mutation => {
function show_class_name(class_name_obj){ //显示查找 className个数
function show_appoint_num(min, max){
for(let [k,v] of Object.entries(class_name_obj)){
if(max === -1){
if(v >= min) log(k,v)
}else{
if(v >= min && v <= max) log(k)
}
}
}
for(let i=0; i<=10; i++){
if(i<10){
log(`--------------[${i}]----------------`);
show_appoint_num(i,i)
} else if(i===10){
log(`--------------[${i}+]----------------`);
show_appoint_num(i,-1)
}
}
log('--------------End----------------')
return;
for(let [k,v] of Object.entries(class_name_obj)){
log(k+' - '+v)
let arr=[];
//for (let [k, v] of Object.entries(bb)) { !!v && v[0] === '.' && $(v).length !== -1 && arr.push(v+' - '+$(v).length) && 0 && log(v+' - '+$(v).length); }
for(let i=0; i<=10; i++){
if(i<10){
log(`--------------[${i}]----------------`);
arr.forEach(function(v){
+v.slice(-1) === i && v.slice(-2,-1) === ' ' && log(v);
})
} else if(i===10){
log(`--------------[${i}+]----------------`);
arr.forEach(function(v){
$.isNumeric(parseInt(v.slice(-2,-1))) && log(v);
})
}
}
log('--------------End----------------')
}
log(class_name_obj)
return;
//for (let [k, v] of Object.entries(bb)) { !!v && v[0] === '.' && $(v).length !== length && log(v+' - '+$(v).length); }
if(!!ver) { bb = {}; bb_config.set_bb(ver) }
let arr=[];
for (let [k, v] of Object.entries(bb)) { !!v && v[0] === '.' && $(v).length !== -1 && arr.push(v+' - '+$(v).length) && 0 && log(v+' - '+$(v).length); }
for(let i=0; i<=10; i++){
if(i<10){
log(`--------------[${i}]----------------`);
arr.forEach(function(v){
+v.slice(-1) === i && v.slice(-2,-1) === ' ' && log(v);
})
} else if(i===10){
log(`--------------[${i}+]----------------`);
arr.forEach(function(v){
$.isNumeric(parseInt(v.slice(-2,-1))) && log(v);
})
}
}
log('--------------End----------------')
//log(arr)
}
const target = mutation.target
// log($(geth5Player()).length)
//class_name_obj[target.className] = class_name_obj?.[target.className] === undefined ? 1 : ++class_name_obj[target.className]
// typeof target.className === 'string' && target.className !== '' && log(target.className)
// let $item_active = $('.list-box .on, .video-episode-card__info-playing')
// let name = $item_active.text()
// log(name)
//typeof target.className === 'string' && target.className !== '' && log($('.rec-list .video-page-card').length);
//干净链接
if(old_url !== window.location.href) { old_url = clear_url() }
//const stage = mutation.previousSibling && target.getAttribute('stage')
if($('.bilibili-player-video-wrap').length === 1){ //2.X
// if($('#app').hasClass('app-v1')){
// log("2.X“V3版”加载完毕");
// bb_config.set_bb(BILI_3_X_VIDEO_V1);
// run();
// }else{
// log("2.X“V2版”加载完毕");
// bb_config.set_bb(BILI_2_X_V2);
// run();
// }
} else if(1&&typeof target.className === 'string' && (target.className === 'bui-select-list-wrap#####' || target.className === 'rec-list####') ) {
//bug?? bpx-player-control-top 会激活重新加载视频
// clearTimeout(is_rec_list_load)
// is_rec_list_load = setTimeout(function() {
// // log('订阅合集列表加载完毕2222222222222222222222'); expand_list(config.getCheckboxSettingStatus('expandList'), config.getCheckboxSettingArgs('expandList', 'columns'));
// log("连播列表加载"); run_rec_list_newtab(config.getCheckboxSettingStatus('openVideoInNewTab'));
// add_to_video_sections_head() //列表加入总时长等
// list_filter() //合集列表关键字过滤
// //列表加入总时长
// //add_total_time()
// }, 200);
//} else if(1&&typeof target.className === 'string' && (target.className === 'bpx-player-control-top###' || target.className === 'rec-list###')) {
//|| target.className.includes('header-v2 win webscreen-fix') === true
} else if(1&&typeof target.className === 'string' && (target.className.includes('teleport') === true
|| target.className.includes('header-v2 win webscreen-fix') === true
|| target.className.includes('main-container') === true
|| target.className.includes('video-toolbar-container') === true)) {
log("投币快捷设置或添加到收藏夹关键字过滤")//***
//log(target.className)
collection_filter(config.getCheckboxSettingStatus('collectionFilter'))
set_dialog('coin', target.className)
//} else if(!bb_type && typeof target.className === 'string' && target.className === 'bpx-player-loading-panel-text') { //3.X pbp-tip bpx-player-loading-panel-text
//视频 ###弃用###
} else if(0&&typeof target.className === 'string' && ((target.className === 'bui-select-list-wrap' && run_load === true) || target.className === 'rec-list')) { //3.X pbp-tip bpx-player-loading-panel-text
function get_ver_____(){
let ver_reg = $('.bpx-player-loading-panel-text').length > 0? $('.bpx-player-loading-panel-text').text().match(/(\d+).(\d+).(\d+)-(\w+)/): null;
let ver;
if(ver_reg === null) { ver = null; ver_reg = []}
else if($('#app').find('.l-con').length > 0) ver = BILI_3_X_VIDEO;
else if($('#app').find('.plp-l').length > 0) ver = BILI_3_X_MOVIE; //todo plp-l
else if($('#app.app-v1').length > 0) ver = BILI_3_X_VIDEO_V1; //todo plp-l
else ver = BILI_2_X;
//log(ver_reg[0]+' | '+ver)
//log($('#app').find('.l-con').length+' | '+$('#app').find('.plp-l').length)
return [ver, ver_reg[0]];
}
function get_ver__(){
let ver_reg = $('.bpx-player-loading-panel-text').length > 0? $('.bpx-player-loading-panel-text').text().match(/(\d+).(\d+).(\d+)-(\w+)/): null
//log(ver_reg)
ver_reg ??= $('.bpx-player-info-log .info-title').text().match(/[\d.]+/)
// log($('.bpx-player-info-log .info-title').length)
// log('[2]',window?.player?.getFormattedLogs().match(/version:\s*([\d.]+)/)?.[1])
ver_reg = window?.player?.getFormattedLogs().match(/version:\s*([\d.]+)/)?.[1]
let ver
// if(ver_reg === null) { ver = null; ver_reg = [] }
if($('#app').find('.l-con').length > 0) ver = BILI_3_X_VIDEO;
else if($('#__next').find('.plp-l').length > 0) ver = BILI_3_X_MOVIE; //todo plp-l
else if($('#app').length > 0) ver = BILI_3_X_VIDEO_V1; //todo plp-l
else ver = BILI_2_X;
//log(ver_reg[0]+' | '+ver)
//log($('#app').find('.l-con').length+' | '+$('#app').find('.plp-l').length)
return [ver, ver_reg];
}
function show_bb_config(ver){ //显示查找 className DOM个数
//for (let [k, v] of Object.entries(bb)) { !!v && v[0] === '.' && $(v).length !== length && log(v+' - '+$(v).length); }
if(!!ver) { bb = {}; bb_config.set_bb(ver) }
let arr=[];
for (let [k, v] of Object.entries(bb)) { !!v && v[0] === '.' && $(v).length !== -1 && arr.push(v+' - '+$(v).length) && 0 && log(v+' - '+$(v).length); }
for(let i=0; i<=10; i++){
if(i<10){
log(`--------------[${i}]----------------`);
arr.forEach(function(v){
+v.slice(-1) === i && v.slice(-2,-1) === ' ' && log(v);
})
} else if(i===10){
log(`--------------[${i}+]----------------`);
arr.forEach(function(v){
$.isNumeric(parseInt(v.slice(-2,-1))) && log(v);
})
}
}
log('--------------End----------------')
//log(arr)
}
function isrun_3_x_movie() {
let exclude_k = ['danmukuTop', 'danmukuTopClose', 'danmukuBottom', 'danmukuBottomClose', 'biliDlgM', 'coinDlgCoin', 'coinDlgCloseBtn', 'coinDlgOkBtn', 'playPBP',
'playTipWrap2', 'playCtrlSubtitle', 'playWatchLater', 'likeon' , 'coinon', 'switchDot', 'like', 'coin' ];
let exclude_v = ['.like-info.active', '.coin-info.active', '.collect-info.active', '.coin-dialog-mask .coin-btn', '.bpx-player-volume-hint', '.bili-dialog-m',
'.bpx-player-volume-hint-text', '.bpx-player-volume-hint-icon', '.bpx-player-hotkey-panel', '.coin-dialog-mask', '.bpx-player-electric-jump',
'.bpx-player-hotkey-panel-close', '.bpx-player-info-close', '.bpx-player-info-container', '.info-line','.bpx-player-top-mask'];
for(let [k, v] of Object.entries(bb)){
//if(!!k && exclude_k.indexOf(k) !== -1) log(k,v); //test
if(!!k && exclude_k.indexOf(k) !== -1) continue;
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) log( k, exclude_v.indexOf(v) +' - '+$(v).length+' - '+v ); //test
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) return false;
}
return true;
}
function isrun_3_x_video() {
let exclude_k = ['danmukuTop', 'danmukuTopClose', 'danmukuBottom', 'danmukuBottomClose', 'biliDlgM', 'coinDlgCoin', 'coinDlgCloseBtn', 'coinDlgOkBtn', 'playPBP',
'playTipWrap2', 'playCtrlSubtitle', 'playWatchLater', ];
let exclude_v = ['.ops .like.on', '.ops .coin.on', '.ops .collect.on', '.coin-dialog-mask .coin-btn', '.bpx-player-volume-hint', '.bpx-player-electric-jump',
'.bpx-player-volume-hint-text', '.bpx-player-volume-hint-icon', '.bpx-player-hotkey-panel', '.bili-dialog-m', '.coin-dialog-mask',
'.bpx-player-hotkey-panel-close', '.bpx-player-info-close', '.bpx-player-info-container', '.info-line','.bpx-player-top-mask',
'.bili-dialog-m .bi-btn'];
for(let [k, v] of Object.entries(bb)){
//if(!!k && exclude_k.indexOf(k) !== -1) log(exclude_k.indexOf(k) +' - '+k+' - '+v);
if(!!k && exclude_k.indexOf(k) !== -1) continue;
//if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) log(exclude_v.indexOf(v) +' - '+$(v).length+' - '+v);
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) return false;
}
return true;
}
function isrun_3_x_video_v1() {
let exclude_k = ['danmukuTop', 'danmukuTopClose', 'danmukuBottom', 'danmukuBottomClose', 'biliDlgM', 'coinDlgCoin', 'coinDlgCloseBtn', 'coinDlgOkBtn', 'playPBP',
'playTipWrap2', 'playCtrlSubtitle', 'playWatchLater', 'playTipWrap', ];
let exclude_v = ['.video-toolbar-left .video-like.on', '.video-toolbar-left .video-coin.on', '.video-toolbar-left .video-fav.on', '.coin-dialog-mask .coin-btn', '.bpx-player-volume-hint', '.bpx-player-electric-jump',
'.bpx-player-volume-hint-text', '.bpx-player-volume-hint-icon', '.bpx-player-hotkey-panel', '.bili-dialog-m', '.coin-dialog-mask',
'.bpx-player-hotkey-panel-close', '.bpx-player-info-close', '.bpx-player-info-container', '.info-line','.bpx-player-top-mask',
'.bili-dialog-m .bi-btn'];
for(let [k, v] of Object.entries(bb)){
//if(!!k && exclude_k.indexOf(k) !== -1) log(exclude_k.indexOf(k) +' - '+k+' - '+v);
if(!!k && exclude_k.indexOf(k) !== -1) continue;
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) log(exclude_v.indexOf(v) +' - '+$(v).length+' - '+v);
if(!!v && exclude_v.indexOf(v) === -1 && $(v).length === 0) return false;
}
return true;
}
//clearTimeout(run_load);
run_load = false
//log('-------run_load----------')
//log(target.className)
//log($('.bpx-player-loading-panel-text').length)
clearTimeout(run_done)
run_done = setTimeout(function() {
//log(`-------run_load2----------`)
//log($('.bpx-player-loading-panel-text').text())
let ver_string
[ver, ver_string] = get_ver__();
log(`[${ver_string}][${ver}]加载完毕`);
//if(!ver || !ver_string) {
if(!ver) {
clearTimeout(run_load); return true;
}
// log('---bb_config.set_bb(ver);---')
bb_config.set_bb(ver)
////////////////////////
////////////////////////
// show_bb_config()
//setTimeout(()=>show_class_name(class_name_obj),2000)
//show_class_name(class_name_obj)
//return;
////////////////////////
////////////////////////
function run_(){
// run_2once()
// video_loaded_run() //视频加载时执行
//log('订阅合集列表加载完毕'); expand_list(config.getCheckboxSettingStatus('expandList'), config.getCheckboxSettingArgs('expandList', 'columns'))
log("连播列表加载"); run_rec_list_newtab(config.getCheckboxSettingStatus('openVideoInNewTab'))
list_filter() //合集列表关键字过滤
// add_to_video_sections_head() //列表加入总时长等
//log('add_to_video_sections_head: ',target.className)
//setTimeout(()=>run_load = true, 500)
}
if(ver === BILI_3_X_VIDEO) waitForTrue(isrun_3_x_video, run_);
else if(ver === BILI_3_X_VIDEO_V1) waitForTrue(isrun_3_x_video_v1, run_);
else waitForTrue(isrun_3_x_movie, run_);
// log('订阅合集列表加载完毕'); expand_list(config.getCheckboxSettingStatus('expandList'), config.getCheckboxSettingArgs('expandList', 'columns'));
// log("连播列表加载"); run_rec_list_newtab(config.getCheckboxSettingStatus('openVideoInNewTab'));
// add_to_video_sections_head() //列表加入总时长等
}, 800);
//动态首页
} else if(typeof target.className === 'string' && target.className==='bili-dyn-list__items'){
clearTimeout(is_content_load); //log(!!config.getCheckboxSettingStatus('showDynListContent') || 1)
is_content_load = setTimeout(function() { log("动态首页加载完毕"); run_content(!!config.getCheckboxSettingStatus('showDynListContent') || true); }, 200)
//当前在线
} else if(typeof target.className === 'string' && target.className === 'avatar' && target.baseURI.indexOf('www.bilibili.com/video/online.html') !== -1){
log("当前在线加载完毕");
run_online_preview(config.getCheckboxSettingStatus('onlinePreview'))
//首页
} else if(typeof target.className === 'string' && window.location.href.match(/https?:\/\/www.bilibili.com\/?$/) && is_homepage_load === true){
is_homepage_load = false
waitForTrue(()=> $('.rcmd-box-wrap').length === 1 || $('.bili-grid.short-margin.grid-anchor:first').length === 1 || $('.recommended-swipe.grid-anchor:first').length === 1, () => {
if($('#app').length > 0) ver = BILI_3_X_VIDEO
else if($('#i_cecream main.bili-layout').length > 0) ver = BILI_3_X_VIDEO_V1
else if($('#i_cecream main.bili-feed4-layout').length > 0) ver = BILI_4_X_V1
else ver = undefined
bb_config.set_bb(ver)
log(`[${ver}]-首页-加载完毕`)
run_homepage()
run_save_recommend_list(config.getCheckboxSettingStatus('saveRecommendList'))
run_add_carousel_slide()
run_add_online()
run_adblock_remove()
// run_go_back_new_version()
})
//第一时间执行
} else if(0&&typeof target.className === 'string' && window.location.href.match(/https?:\/\/www.bilibili.com\/.+/) && is_homepage_load === true){
//收藏夹
} else if(typeof target.className === 'string' && target.className==='be-scrollbar fav-list-container ps'){
// log(config.getCheckboxSettingStatus('favSetting'))
// log(config.sets)
clearTimeout(is_fav_list_load)
is_fav_list_load = setTimeout(function() { log("收藏夹设置完毕")
// log(config.getCheckboxSettingStatus('favSetting'))
run_fav(config.getCheckboxSettingStatus('favSetting')); }, 200)
//三连和选择弹窗
} else if(typeof target.className === 'string' && target.className.indexOf('bili-guide-all bili-guide') !== -1){
hideThreePopup(config.getCheckboxSettingStatus('hideThreePopup'))
//打分弹窗
} else if(typeof target.className === 'string' && target.className.indexOf('bili-score bili-no-event') !== -1){
hideScorePopup(config.getCheckboxSettingStatus('hideScorePopup'))
//搜索界面自动展开更多筛选
} else if(typeof target.className === 'string' && target.className.indexOf('header-entry-avatar') !== -1){
auto_more_conditions()
//新版评论图片,任意点击返回
} else if(typeof target.className === 'string' && target.className.indexOf('show-image-wrap') !== -1){
return_comment()
//新版(V2)评论图片,任意点击返回
} else if(typeof target.className === 'string' && target.className.indexOf('header-v') !== -1){
if(mutation.addedNodes[0]?.nodeName.toLowerCase().includes('bili-photoswipe') === true){
waitForTrueNoErr(()=>$($('bili-photoswipe')[0]?.shadowRoot).find('img').length >= 1, ()=>{
let $photoswipe = $($('bili-photoswipe')[0]?.shadowRoot)
let $image_wrap = $photoswipe.find('#container')
let $image_content = $photoswipe.find('#zoom-wrap')
if($image_content.attr('hhh_show_image_wrap') !== true){
$image_content.attr('hhh_show_image_wrap', true)
$image_wrap[0].removeEventListener('click', $image_wrap[0]?.hhh_show_image_btn_fn, true)
$image_wrap[0].hhh_show_image_btn_fn = function(e){
// log($(e), e.target.nodeName.toString().toUpperCase(), e.target.id, e.clientX, e.clientY)
let wrap_rect = $image_wrap[0].getBoundingClientRect()
let image_rect = $image_content[0].getBoundingClientRect()
if(e.target.nodeName.toLowerCase().includes('img') === true){
//点击图片关闭图片:相对于右上角X
$($('bili-photoswipe')[0]?.shadowRoot).find('#close').click()
}else{
//点击空白位置前后轮播图片:相当于左右箭头
let clientX = e.clientX
// log(clientX, wrap_rect.left, image_rect.left)
if(clientX >= wrap_rect.left && clientX <= image_rect.left) { $photoswipe.find('#prev').click() }
else if(clientX <= wrap_rect.right && clientX >= image_rect.right) { $photoswipe.find('#next').click() }
}
e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation()
}
$image_wrap[0].addEventListener('click', $image_wrap[0].hhh_show_image_btn_fn, true)
//鼠标变为默认形状
$image_content.css({'cursor': 'auto'})
//设置不透明度,防止遮挡
$photoswipe.find('#thumb').css({'opacity': '30%'})
}
})
}
// } else if(typeof target.className === 'string' && target.className==='history-list'){
// clearTimeout(is_history_break);
// is_history_break = setTimeout(function() { log("历史记录加载完毕"); run_history()}, 200);
//clearTimeout(is_rcmd_box_break);
//is_rcmd_box_break = setTimeout(function() { log("推荐列表加载完毕"); run_recommend_box()}, 50);
// } else if(is_card_load === false && typeof target.className === 'string' && target.className === 'card' && $(target).find('.video-container .content').length){
// is_card_load = true;
// log("2.X动态首页加载完毕");r
// run_card(); //搞笑,刚写完,2.70.7就有了
// removeMostViewedListener(config.getCheckboxSettingStatus('removeMostViewedListener'));
}
});
}).observe(document, {
childList: true,
subtree: true,
//attributes: true,
});
}
// console.log(jQuery.fn.jquery)
var $hhh_jq = $
init()
}
}
hhh_lightoff_main.init()