Greasy Fork

Greasy Fork is available in English.

bilibili关灯

bilibili关灯(把被新版B站藏起来的关灯按钮揪出来,在关闭弹幕按钮左边,还可以用快捷键,默认'A')

目前为 2021-06-09 提交的版本。查看 最新版本

// ==UserScript==
// @name         bilibili关灯
// @namespace    hhh2000
// @version      0.5
// @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 弹幕速度 等等
//'正数': 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 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.lightoff');
        $(document).on('keydown.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('OFF'===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();
        }

    });
}

function init() {
    //内部加载视频窗口
    waitForNode(() => document.querySelector('video'),
        (node) => {
        var oV = document.getElementsByTagName("video")[0];
        oV.addEventListener('DOMNodeInserted', () => {
            run();
        });
    });

    run();
}

window.onload = init();