// ==UserScript==
// @name bilibili关灯
// @namespace hhh2000
// @version 0.6
// @description bilibili关灯(把被新版B站藏起来的关灯按钮揪出来,在关闭弹幕按钮左边,还可以用快捷键,默认'A')
// @author hhh2000
// @include *://*.bilibili.com/video/*
// @include *://*.bilibili.tv/video/*
// @include *://*.bilibili.com/bangumi/*
// @include *://*.bilibili.tv/bangumi/*
// @require https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// @run-at document-end
// @grant none
// ==/UserScript==
function waitForNode(nodeSelector, callback) {
var node = nodeSelector();
if (node) {
callback(node);
} else {
setTimeout(function() { waitForNode(nodeSelector, callback); }, 100);
}
}
function waitForTrue(ifTrue, callback) {
if (ifTrue()) {
callback();
} else {
setTimeout(function() { waitForTrue(ifTrue, callback); }, 100);
}
}
function isFullScreen() {
return $('#bilibiliPlayer').hasClass('mode-fullscreen');
}
function abc(e) {console.log(e)};
//关灯按钮样式
function lightoff_css() {
var body_brgb = 'rgb(160, 130, 110)';
var dot_crgb = 'rgb(230, 200, 180)';
var dot_brgb = 'rgb(50, 50, 50)';
var dark_rgb = 'rgb(77, 77, 77)';
if ($('.bilibili-player-video-danmaku-switch>.bui-switch-input')[0].checked === false) {
$('.bilibili-player-video-danmaku-switch .bui-switch-body:first').css('background-color', dark_rgb);
$('.bilibili-player-video-danmaku-switch .bui-switch-body:first>.bui-switch-dot').css('color', dark_rgb);
}
else {
$('.bilibili-player-video-danmaku-switch .bui-switch-body:first').css('background-color', body_brgb);
$('.bilibili-player-video-danmaku-switch .bui-switch-body:first>.bui-switch-dot').css({'color': dot_crgb, 'background-color': dot_brgb});
}
}
//控制进度条
//.bilibili-player-setting-opacity 透明度
//.bilibili-player-setting-area 显示区域
//.bilibili-player-setting-speedplus 弹幕速度 等等
//利用系统mousedown事件
//'正数': right, '负数': left, -1 ~ +1
function set_progress(selector, percent){
var opacity = document.querySelector(selector);
var dot = document.querySelector(selector + ' .bui-thumb-dot');
var e1 = new MouseEvent('mousedown'); var e2 = new MouseEvent('mouseup');
var danmaku_setting_wrap = '.bilibili-player-video-danmaku-setting-wrap';
$(danmaku_setting_wrap).css({"display":"block"});
percent = percent<-1? -1:percent>1? 1:percent;
var opacity_rect = opacity.getClientRects();
var dot_rect = dot.getClientRects();
var dot_clientX = dot_rect[0].left+(dot_rect[0].right-dot_rect[0].left)/2;
var clientX = dot_clientX + percent*opacity_rect[0].width*1.1;
e1.initMouseEvent('mousedown',1,1,window,1,0,0,clientX,0,0,0,0,0,0,null);
e2.initMouseEvent('mouseup' ,1,1,window,1,0,0,clientX,0,0,0,0,0,0,null);
opacity.dispatchEvent(e1); opacity.dispatchEvent(e2);
$(danmaku_setting_wrap).css({"display":"none"});
}
//非全屏滚轮音量调节
function set_volumeHint(){
//div(抄bilibili^^)
var volumeHint = '<div id=hhh_volumeHint class="bilibili-player-volumeHint" style="opacity: 0; display: none;">\n'+
' <span class="bilibili-player-volumeHint-icon video-state-volume-max">\n'+
' <i class="bilibili-player-iconfont bilibili-player-iconfont-volume icon-24soundsmall"></i>\n'+
' <i class="bilibili-player-iconfont bilibili-player-iconfont-volume-max icon-24soundlarge"></i>\n'+
' <i class="bilibili-player-iconfont bilibili-player-iconfont-volume-min icon-24soundoff"></i>\n'+
' </span>\n'+
' <span class="bilibili-player-volumeHint-text">57%</span>\n'+
'</div>';
if($('#hhh_volumeHint').length === 0) $('.bilibili-player-video-wrap').append(volumeHint);
//add wheelevent
$('.bilibili-player-video-wrap').off('mousewheel.hhh_volumeHint');
$('.bilibili-player-video-wrap').on('mousewheel.hhh_volumeHint', function(e){
e.preventDefault(); //阻止页面滚动
$(".bilibili-player-volumeHint:[id!='hhh_volumeHint']").css('display', 'none'); //隐藏系统音量
if(window.player.isFullScreen() === false) { //只处理非全屏
var wheelDelta = e.originalEvent.wheelDelta;
var volume = window.player.volume();
if(wheelDelta === 120) { //向上滚动,减少音量
window.player.volume(volume+0.05);
} else if(wheelDelta === -120) { //向下滚动,增大音量
window.player.volume(volume-0.05);
}
//console.log(this); var ve=e;
$('#hhh_volumeHint>.bilibili-player-volumeHint-text').text(Math.round(window.player.volume()*100)+'%'); //音量百分比显示
var h = $('#hhh_volumeHint'); //显示及渐隐效果(抄bilibili^^)
clearTimeout(this.showHintTimer),
h.stop().css("opacity", 1).show(),
this.showHintTimer = window.setTimeout((function() {
h.animate({
opacity: 0
}, 300, (function() {
$(this).hide()
}
))
}
), 1e3)
}
});
}
//主程序
function run(){
waitForNode(() => document.querySelector('.bilibili-player-video-danmaku-switch .bui-switch-dot'),
(node) => {
//防止重复加载
if ($('.bilibili-player-video-danmaku-switch .bui-switch-dot').length !== 1) return;
//插入关灯按钮
$("div.bilibili-player-video-danmaku-switch:first").clone().prependTo("div.bilibili-player-video-danmaku-root:first");
$('span.bui-switch-body>.bui-switch-dot:first>span').remove();
$('span.bui-switch-body>.bui-switch-dot:first')[0].innerHTML = '灯';
//点击关灯
$('.bilibili-player-video-danmaku-switch>.bui-switch-input:first').click(function(e){
$('.bilibili-player-video-btn-setting-right-others-content-lightoff>input').click();
lightoff_css();
});
//键盘关灯等
$(document).off('keydown.hhh_lightoff');
$(document).on('keydown.hhh_lightoff',function(e){
if(e.keyCode === 'A'.charCodeAt()){ //开关灯
$('.bilibili-player-video-btn-setting-right-others-content-lightoff>input').click();
//实际点击按钮和调用点击事件bui-switch-input')[0].checked值不同,需要下面这句
$('.bilibili-player-video-danmaku-switch>.bui-switch-input')[0].checked = !$('.bilibili-player-video-danmaku-switch>.bui-switch-input')[0].checked;
lightoff_css();
} else if(e.keyCode === 'W'.charCodeAt()) { //网页全屏
$('.bilibili-player-video-web-fullscreen').click();
} else if(e.keyCode === 'Q'.charCodeAt()) { //宽屏模式
isFullScreen() ? $('.bilibili-player-video-btn-fullscreen').click() : $('.bilibili-player-video-btn-widescreen').click();
} else if(e.keyCode === 'D'.charCodeAt()) { //开关弹幕
$('.bilibili-player-video-danmaku-switch>.bui-switch-input:last').click();
} else if(e.keyCode === 'T'.charCodeAt()) { //开关顶端弹幕
$('.bilibili-player-block-filter-type[ftype=top]').click();
} else if(e.keyCode === 'B'.charCodeAt()) { //开关底端弹幕
$('.bilibili-player-block-filter-type[ftype=bottom]').click();
} else if(e.keyCode === 'R'.charCodeAt()) { //开关洗脑循环
$(".bilibili-player-video-btn-setting-left-repeat>.bui-switch-input").click();
} else if(e.keyCode === 'Z'.charCodeAt()) { //-弹幕透明度
set_progress('div.bilibili-player-setting-opacity', -0.15);
} else if(e.keyCode === 'C'.charCodeAt()) { //+弹幕透明度
set_progress('div.bilibili-player-setting-opacity', 0.15);
}
});
//初始化关灯按钮
lightoff_css();
//一些CLASS命名
var danmaku_setting = '.bilibili-player-video-danmaku-setting';
var video_setting = '.bilibili-player-video-btn.bilibili-player-video-btn-setting';
var video_setting_wrap = '.bilibili-player-video-btn-setting-wrap';
//激活系统弹幕设置,以此使用网页全屏等
$(danmaku_setting).mouseenter().mouseleave();
//激活系统关灯设置,以此使用关灯
//去掉mouseout(),否则如果太快执行mouseout()无法激活关灯class,应该是mouseenter()未执行完就被mouseout打断了
$(video_setting).mouseenter();
//避免显示激活页面
waitForNode(() => document.querySelector(video_setting_wrap),
(node) => {
$(node).css({"visibility":"hidden"}); //visible
})
//解决因为激活关灯class,导致全屏时滚轮无法调节音量的问题
waitForTrue(()=>$(video_setting_wrap).css('display') === 'block',
() => {
$(video_setting_wrap).css('display', 'none').css('visibility', 'visible');
});
//自动运行
var STATAS = 'ON'; // ON | ALLOFF
if('ON'===STATAS && $('.bilibili-player-video-btn-setting-left-autoplay>.bui-switch-input')[0].checked === false) //开启自动播放
$(".bilibili-player-video-btn-setting-left-autoplay>.bui-switch-input").click();
if('ON'===STATAS) $(".bilibili-player-video-btn-setting-left-repeat>.bui-switch-input").click(); //开启洗脑循环
if('ON'===STATAS) {
$('.bilibili-player-video-btn-setting-right-others-content-lightoff>input').click(); //关灯
//实际点击按钮和调用点击事件bui-switch-input')[0].checked值不同,需要下面这句
$('.bilibili-player-video-danmaku-switch>.bui-switch-input')[0].checked = !$('.bilibili-player-video-danmaku-switch>.bui-switch-input')[0].checked;
lightoff_css();
}
//非全屏音量调节
set_volumeHint();
});
}
function init() {
//内部加载视频窗口
waitForNode(() => document.querySelector('video'),
(node) => {
var oV = document.getElementsByTagName("video")[0];
oV.addEventListener('DOMNodeInserted', () => {
run();
});
});
run();
}
window.onload = init();