Greasy Fork is available in English.

Bilibili Auto Turnoff Barrage

B站视频自动关闭弹幕:双击【t】键开/关切换

// ==UserScript==
// @name       Bilibili Auto Turnoff Barrage
// @namespace  https://greasyfork.org/zh-CN/users/6065-hatn
// @version    0.3.8
// @description  B站视频自动关闭弹幕:双击【t】键开/关切换
// @icon           http://www.gravatar.com/avatar/10670da5cbd7779dcb70c28594abbe56?r=PG&s=92&default=identicon
// @include		*.bilibili.com/video/av*
// @include		*.bilibili.com/anime/*
// @include		*.bilibili.com/bangumi/play/*
// @require0		http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js
// @copyright	2016, hatn
// @author		hatn
// @run-at     	document-end
// @grant0       GM_xmlhttpRequest
// @grant       GM_getValue
// @grant       GM_setValue
// @grant0       GM_deleteValue
// grant0       unsafeWindow
// ==/UserScript==

/***
*
* 功能:用于哔哩哔哩站(B站) 视频自动关闭弹幕
*
* 使用说明:
* 0、播放器右侧面板增加自定义设置项
* 1、双击【t】: 开/关弹幕
* 2、双击【f】: 全屏切换
* 3、双击【p】: 播放/暂停
* 4、单击【Esc】: 全屏&播放 // Firefox双击Esc退出全屏
* 5、双击【k/l】: 切换前/后一分P
* 6、默认勾选"防挡字幕"
* 7、自动宽屏
* 8、双击视频切换全屏
*/

/* #########  参数设置 S ######### */
var config = {
	auto_danmuku: 1, // 自动关闭弹幕 [1]开启(默认) [0]关闭
	auto_widescreen: 1, // 自动宽屏 [1]开启(默认) [0]关闭
    auto_playvedio: 0, // 自动播放 [1]开启 [0]关闭(默认)
    auto_preventshade: 1, // 防挡字幕 [1]开启(默认) [0]关闭
    auto_position: 1, // 自动定位播放器位置 [1]开启(默认) [0]关闭
    //auto_lightoff: 0, // 自动关灯[1]开启 [0]关闭(默认)
    //keyboard_flag: 1, // 监听单/双击键盘事件 [1]单双击(默认) [2]双击 [3]单击 [0]关闭
    click_flag: 1, // 监听单击键盘事件 [1]开启(默认)  [0]关闭
    dblclick_flag: 1, // 监听双击键盘事件 [1]开启(默认) [0]关闭
    css_flag: 1, // 额外的css样式 [1]开启(默认) [0]关闭 全屏时半透明弹幕栏和控制条
    control_view: { // 悬浮视图
        status: 0, // 显示视图 [1]开启 [0]关闭(默认)
        float: 2, // 停靠位置 [1]左 [2]右(默认)
        auto_hide: 0, // 操作后自动隐藏 [1]开启 [0]关闭(默认)
    }
};

/* #########  参数设置 E ######### */

var danmukuObj = {
	/* 参数 */
    cfg: {}, // 参数集
    localConfig: {}, // 本地参数集
	defaultCfg: {
		auto_danmuku: 1,
        auto_widescreen: 1,
        auto_playvedio: 0,
        auto_preventshade: 1,
        auto_position: 1,
        //auto_lightoff: 0,
        //keyboard_flag: 1,
        click_flag: 1,
        dblclick_flag: 1,
        css_flag: 1,
        control_view: {
            status: 0,
            float: 2,
            auto_hide: 0
        }
    },
    // 临时数据
    DATA: {
        script_name: 'Bilibili_Auto_Turnoff_Barrage',
        curr_pathname: '', // 当前页面链接
        videoListenner: null,
    },
    /* 按键参数 */
    keyData: {
        timenow: 0, // 上一按键时间
        preKey: '', // 记忆前一按键
        keepTime: 400, // 双击间隔
        keyBtn: { // 双/单击按键对应动作
            '0': { // global
                'nextbtn': '.bilibili-player-video-toast-item-jump',
                'pageBgm': '.bangumi-list-wrapper ul.episode-list>li.episode-item',
                'currPage': '#v_multipage a.item.on',
                'currPageBgm': '.bangumi-list-wrapper ul.episode-list>li.episode-item.on',
                //'currPageBgm': 'ul.slider-list>li.v1-bangumi-list-part-child.cur:eq(0)',
                //'currNotPageBgm': 'ul.slider-list>li.v1-bangumi-list-part-child:not(.cur)',
                'dealPageFunc': function(s, _act) {
                    var act = _act == 'prev' ? 'prev' : 'next';
                    if (/bangumi/.test(location.href)) { // 番剧模式
                        var $curr_li = $(s.keyData.keyBtn[0].currPageBgm)[act]('li') || false;
                        if ($curr_li == false) return false;
                        $curr_li.click();
                        /** onclick事件失效(已被取消)直接模拟点击 li
                        var onclick = $('a[onclick]:eq(0)', $curr_li).attr('onclick') || false;
                        if (onclick != false) eval('unsafeWindow.' + onclick);*/
                        // 重新插入css样式到iframe 通过band的点击事件($curr_li.click)实现即可
                        //s.band('bangumi');
                        //s.keyData.keyBtn[0].addCssIframe(s); // 事件处理
                        return true;
                    }
                    var href = $(s.keyData.keyBtn[0].currPage)[act]('a[href]').attr('href') || false;
                    if (href != false) location.href = href;
                },
                'addCssIframe': function(s) {
                    if (s.DATA.videoListenner) clearInterval(s.DATA.videoListenner);
                    s.DATA.curr_pathname = location.pathname;
                    var ii = 0;
                    var crontrolDom = setInterval(function() {
                        if (ii > 99) {
                            clearInterval(crontrolDom);
                            console.log('log: bofangqi_dom not found !');
                        }
                        if ($('.bilibili-player-advopt-wrap', s.dom_type).size() > 0) {
                            clearInterval(crontrolDom);
                            /*s.settingView() + */setTimeout(() => s.autoAction(), 3000);
                            console.log('log: controlView done !');
                        }
                        ++ii;
                    }, 1000);
                    /*var selector = s.keyData.keyBtn['84'].selector;
                    var new_iframe_dom = setInterval(function() {
                        if (ii > 15) {
                            clearInterval(new_iframe_dom);
                            console.log('log: new_iframe_dom not found !');
                        }
                        if (s.checkIframe(selector, s.iframe_arr)) {
                            clearInterval(new_iframe_dom);
                            s.addCss(true);
                            setTimeout(function() {
                                //debugger;
                                s.band('bangumi_keyup');
                                s.autoAction();
                            }, 1000);
                            console.log('log: new_iframe_dom found !');
                        }
                        ++ii;
                    }, 1000);*/
                }
            },
            // 双击操作
            '70': {'type': 'fullscreen', 'selector': '.bilibili-player-iconfont-fullscreen.icon-24fullscreen:eq(0)'},
            //'71': {'type': 'lightoff', 'selector': '.bilibili-player-video-float-type[type="light"]:eq(0)'},
            '75': {
                'type': 'prepage',
                'function': function(keyData, s) {
                    s.keyData.keyBtn[0].dealPageFunc(s, 'prev');
                },
            },
            '76': {
                'type': 'nextpage',
                'function': function(keyData, s) {
                    s.keyData.keyBtn[0].dealPageFunc(s, 'next');
                }
            },
            '80': {
                'type': 'playvedio',
                'selector': 'div.bilibili-player-video-btn-start:eq(0)',
                'player_box': '.player-wrapper,.player',
                'pause_btn': 'div.bilibili-player-video-btn-start.video-state-pause',
                'function': function(keyData, s) {
                    if ($(keyData.pause_btn, s.dom_type).length > 0) return true;
                    $('html, body').animate({scrollTop: $(keyData.player_box).offset().top + 0}, 600); // top + 22
                }
            },
            '84': {
                'type': 'danmuku',
                'selector': 'div.bilibili-player-video-control div.bilibili-player-video-btn.bilibili-player-video-btn-danmaku',
                'hide_danmu_set': '.bilibili-player-danmaku-setting-lite-panel',
                'flag_off': 'div.bilibili-player-video-control div.bilibili-player-video-btn.bilibili-player-video-btn-danmaku.video-state-danmaku-off',
                'function': function(keyData, s) {
                    $(keyData.hide_danmu_set, s.dom_type).hide(); // 模拟点击 + 隐藏弹幕设置面板
                }
            },
            // 单击操作
            '_27': {
                'type': 'fullandplay',
                'full_status': '#bilibiliPlayer.mode-fullscreen',
                'function': function(keyData, s) {
                    if ($(keyData.full_status, s.dom_type).length > 0) return false; // 退出全屏时不触发该事件··
                    s.keyAction(70);
                    if ($(s.keyData.keyBtn[80].pause_btn, s.dom_type).size() > 0) setTimeout(() => s.keyAction(80), 450);
                }
            },
			// 鼠标操作
			'doubleClick_fullscreen': { // 双击全屏
				'type': 'doubleClick_fullscreen',
				'selector': '.bilibili-player-iconfont-fullscreen.icon-24fullscreen:eq(0)',
				'function': function(keyData, s) {
					if ($(s.keyData.keyBtn[80].pause_btn, s.dom_type).size() > 0) setTimeout(() => s.keyAction(80), 450);
				}
			},
            // 自动操作(无按键)
            'preventshade': {  // 防挡字幕
                'type': 'preventshade',
                //'selector': '[for="checkbox41"]'//checkbox22
                'function': function(keyData, s) {
                    setTimeout(() => {
                        $danmubox = $('.bilibili-player-video-btn-danmaku:eq(0)');
                        $danmubox.mouseover() + $('[for="checkbox41"]').click() + $danmubox.mouseout();
                    }, 3000);
                }
            },
            'widescreen': { // 自动宽屏
                'type': 'widescreen',
                'selector': '.bilibili-player-video-btn-widescreen'
            },
            'automatic_positioning': { // 自动定位播放器
                'type': 'automatic positioning',
                'function': function (keyData, s) {
                    $('html, body').animate({scrollTop: $(s.keyData.keyBtn[80].player_box).eq(0).offset().top + 0}, 600); //22
                }
            }
        }
    },
    hash: null, // location.hash
    dom_type: document, // 使用 document/iframe
    iframe_arr: { // body体集合
        bangumi: "iframe.player.bilibiliHtml5Player",
    },
    /* 前置操作 */
    preOperation: function() {
        var s = this;
        s.DATA.curr_pathname = location.pathname;
    },
	/* 初始化 */
	init: function() {
        var s = this;
        s.preOperation();
		s.band();
        s.addCss();
        s.autoAction();
        s.controlView('add');
		console.log('log: Bilibili Auto Turnoff Barrage, Run...');
	},
	/* 启动器 */
	launcher: function(config) {
		var s = this;
		s.setParam(config);
        var times = 100;
        var ii = 0;
		var preTimer = setInterval(function () {
            ++ii;
            var selector = s.keyData.keyBtn['84'].selector; //'div.bilibili-player-video-btn.bilibili-player-video-btn-danmaku';
			if ($(selector).length > 0 || s.checkIframe(selector, s.iframe_arr)) {
				window.clearInterval(preTimer);
                console.log('log: Try ' + ii + ' times!');
				setTimeout(function() {
                    s.init(); // 延迟3秒执行
                }, 3000);
				return true;
			}
			if (--times < 0) {
                window.clearInterval(preTimer) + console.log('err: time out!');
			}
		}, 600);
	},
    /* 检查各项iframe */
    checkIframe: function(selector, iframe_arr) {
        var s = this;
        var $type;
        for (var i in iframe_arr) {
            $type = $(iframe_arr[i]);
            if ($type.length > 0 && $(selector, $type.contents()).length > 0) {
                s.dom_type = $type.contents();
                return true;
            }
        }
        return false;
    },
	/* 参数读取 */
	setParam: function(config) {
		var s = this;
		config = typeof config == 'object' ? config : {};
        s.localConfig = {};
        var localConfigStr = localStorage.getItem('bili_hatn_config');
        if (localConfigStr != null) s.localConfig = eval('(' + localConfigStr + ')');
		s.dataMgr('get');
        console.log(s.cfg); // test
	},
    /* 全局css */
    addCss: function(_onlyIframe) {
        var s = this;
        if (s.cfg.css_flag != 1 && s.cfg.control_view.status != 1) return false;
        var onlyIframe = _onlyIframe || false; // 只插入到iframe
        var playerCss = controlViewCss = '';

        if (s.cfg.css_flag == 1) {
            var playerCss = `#bilibiliPlayer.mode-fullscreen .bilibili-player-video-sendbar[style^="opacity: 1;"]{ background: rgba(0,0,0,0.3); bottom: 60px !important;} #bilibiliPlayer.mode-fullscreen .bilibili-player-video-control[style^="opacity: 1;"]{ border-color: rgba(255,255,255,.3); text-shadow: #333 1px 1px 3px; background: rgba(0,0,0,0.3); -moz-transform:scale(1,2);-webkit-transform:scale(1,2);bottom: 16px !important;}.bilibili-player-video-btn.bilibili-player-video-btn-color~.bilibili-player-video-inputbar.focus, .bilibili-player-video-control .bpui-slider-tracker[name="slider"], #bilibiliPlayer.mode-fullscreen ul.bpui-selectmenu-list.bpui-selectmenu-list-left { background: 0; border-color: rgba(255,255,255,.3) !important; } .bilibili-player-video-progress-buffer { background: rgba(255,255,255, 0.3) !important; }  #bilibiliPlayer.mode-fullscreen #bilibiliPlayer.mode-fullscreen ul.bpui-selectmenu-list.bpui-selectmenu-list-left>li, #bilibiliPlayer.mode-fullscreen .bilibili-player-danmaku-setting-lite, #bilibiliPlayer.mode-fullscreen .bilibili-player-video-volumebar-wrp, .bpui-selectmenu-list-row[data-selected] { background: rgba(0,0,0,0.3) !important; } #bilibiliPlayer.mode-fullscreen ul.bpui-selectmenu-list.bpui-selectmenu-list-left>li:not([data-selected="selected"]), #bilibiliPlayer.mode-fullscreen .bilibili-player-video-danmaku-input, #bilibiliPlayer.mode-fullscreen .bilibili-player-video-volume-num, #bilibiliPlayer.mode-fullscreen [name="time_textarea"], #bilibiliPlayer.mode-fullscreen .bilibili-player-danmaku-setting-lite-title, #bilibiliPlayer.mode-fullscreen .bpui-checkbox-text, #bilibiliPlayer.mode-fullscreen .bilibili-player-block-filter-label, #bilibiliPlayer.mode-fullscreen .row-title, #bilibiliPlayer.mode-fullscreen .js-action:not(.active)>.fontsize_selector, #bilibiliPlayer.mode-fullscreen .js-action:not(.active) .selection-name { color: #ccc !important; text-shadow: #333 1px 1px 3px; } #bilibiliPlayer.mode-fullscreen .bilibili-player-video-btn-send.bpui-component.bpui-button.button, #bilibiliPlayer.mode-fullscreen .bpui-slider-progress { background: rgba(0,161,214,0.6); border: 0; } #bilibiliPlayer.mode-fullscreen .bilibili-player-video-progress-buffer-range { background: rgba(138,220,237,0.6); } #bilibiliPlayer.mode-fullscreen .bilibili-player-video-volumebar.bpui-component.bpui-slider.bpui-slider-vertical { opacity: 0.6; } #bilibiliPlayer.mode-fullscreen .bilibili-player-video-volumebar-wrp, #bilibiliPlayer.mode-fullscreen .bilibili-player-video-float-panel.show, #bilibiliPlayer.mode-fullscreen .bilibili-player-video-float-quality-lists, #bilibiliPlayer.mode-fullscreen .bilibili-player-video-float-split, #bilibiliPlayer.mode-fullscreen .bilibili-player-danmaku-setting-lite-panel { border-color: rgba(255,255,255,.3) !important; } #bilibiliPlayer.mode-fullscreen .bilibili-player-mode-selection-container.active, #bilibiliPlayer.mode-fullscreen .bilibili-player-color-picker-container.active { background: rgba(0,0,0,0.3) !important; border-color: rgba(255,255,255,.3) !important; } .bilibili-player.mode-fullscreen .bilibili-player-area .bilibili-player-video-control .bilibili-player-video-btn.bilibili-player-video-btn-widescreen { background-color: transparent !important; } .bilibili-player .bilibili-player-area .bilibili-player-video-control .bilibili-player-video-btn.bilibili-player-video-btn-quality .bpui-selectmenu .bpui-selectmenu-list-row { color: #aaa !important; }`;
            var playerCssStr = '<style id="player-style">' + playerCss + ' </style>';
            $(playerCssStr).appendTo($('body', s.dom_type));
        }
        if (onlyIframe == true) return false;

        if (s.cfg.control_view.status == 1) {
            var float = s.cfg.control_view.float == 1 ? 'left' : 'right';
            var width = '45px';
            controlViewCss = '#control-view-box { font-family: SimSun; z-index: 9999999999; cursor: pointer; position: fixed; opacity: 0.5; ' + float + ': 5px; top: 200px; width: ' + width + '; box-sizing:border-box; color: #fff; font-size: 13px; line-height: ' + width + '; } [data-cmd] { text-align: center; display: block; width: ' + width + '; height: ' + width + '; width: 100%; border-radius: 50%; } span[data-cmd] { background-color: rgb(248,142,139); } #control-view-box>ul { overflow-y: hidden; max-height: 0; width: 100%; clear: both; transition: 0.5s 0s max-height ease; } li[data-cmd] { margin-top: 5px; background-color: rgb(170,215,255); } #control-view-box.show>ul { max-height: 300px; } [data-cmd]:hover { background-color: rgb(68,216,128); } [data-cmd]:hover { background-color: rgb(69,218,132); }';
            var controlViewCssStr = '<style id="controlViewCss-style">' + controlViewCss + ' </style>';
            $(controlViewCssStr).appendTo($('body'));
        }
    },
    /* 控制视图 */
    controlView: function(_type) {
        var s = this;
        if (s.cfg.control_view.status != 1) return false;
        var type_arr = ['switch', 'add', 'show', 'hide'];
        var type = $.inArray(_type, type_arr) != -1 ? _type : type_arr[0];
        var id = 'control-view-box';
        var $s = $('#' + id);
        if (type == 'add') {
            if ($s.length >= 1) return false;
            var html = `
            <div id="${id}" class="show">
                <span data-cmd="switch" title="收缩/展开">Bili</span>
                <ul>
                    <li data-cmd="70" title="双击F/单击ESC">全屏</li>
                    <li data-cmd="80" title="双击P">播/暂</li>
                    <li data-cmd="84" title="双击T">弹幕</li>
                    <li data-cmd="75" title="双击K">上一P</li>
                    <li data-cmd="76" title="双击L">下一P</li>
                </ul>
            </div>`;
            $('body').append(html);
            var windowHeight = document.documentElement.clientHeight;
            var boxHeight = $s[0].clientHeight;
            var topHeight = parseInt((windowHeight - boxHeight) / 2) + 'px';
            $s.css('top', topHeight);
        } else if (type == 'switch') {
            var flag = $s.hasClass('show');
            flag ? $s.removeClass('show') : $s.addClass('show');
        } else if (type == 'show') {
            $s.addClass('show');
        } else if (type == 'hide') {
            $s.removeClass('show')
        }
    },
	/* 设置视图 */
	settingView: function() {
		var s  = this;
        if ($('#setting-tips', s.dom_type).size() > 0) return true; // 防止重复插入
		var config_obj = {
			auto_danmuku: {name: '关闭弹幕', tips: '自动关闭弹幕'},
			auto_widescreen: {name: '自动宽屏', tips: '自动开启网页宽屏'},
			auto_playvedio: {name: '自动播放', tips: '加载完毕自动播放视频'},
			auto_preventshade: {name: '防挡字幕', tips: '自动勾选防挡底部字幕'},
			auto_position: {name: '自动定位', tips: '加载完毕滚动条自动定位到播放器位置'},
			//auto_lightoff: {name: '自动关灯', tips: '自动打开关灯模式'},
			//keyboard_flag: {name: '按键监听', tips: '监控单双击按键事件'},
			click_flag: {name: '按键单击监听', tips: '监控单击按键事件'},
			dblclick_flag: {name: '按键双击事件', tips: '监控双击按键事件'},
			css_flag: {name: '透明底栏', tips: '全屏时半透明弹幕栏和控制条'},
			//control_view: {name: '浮动按钮', tips: '开启侧边浮动按钮'}
		};
		var html_str = makeItemHtml(s.cfg);
        setTimeout(() => $('.bilibili-player-advopt-wrap', s.dom_type).append(html_str), 1000);

        // 播放结束事件
        $('video').on('ended', function(e) {
            var i = 12;
            if (s.DATA.videoListenner) clearInterval(s.DATA.videoListenner);
            s.DATA.videoListenner = setInterval(function() {
                if (--i < 0) {
                    console.log('log: videoListenner timeout !');
                    clearInterval(s.DATA.videoListenner);
                    return false;
                } else if (s.DATA.curr_pathname != location.pathname) {
                    clearInterval(s.DATA.videoListenner);
                    s.keyData.keyBtn[0].addCssIframe(s);
                    console.log('log: videoListenner done !');
                }
            }, 2000);
        });

		function makeItemHtml(obj) {
            if (typeof obj != 'object') return;
            var item_html = '', item, act_status, html_str = '', className = 'bpui-state-active';;
			for (var i in config_obj) {
				item = config_obj[i];
                //if (typeof item == 'object') continue;
                act_status = obj[i] > 0 ? className : '';
                item_html = `
				<div flag="config" class="bilibili-player-fl" title="${item['tips']}">
					<input type="checkbox" class="bilibili-player-setting-videomirror bpui-component bpui-checkbox bpui-button">
					<label for="${i}" class="button bpui-button-text-only ${act_status}" role="button" id="${i}">
						<span class="bpui-button-text">
							<i class="bpui-icon-checkbox icon-12checkbox"></i>
							<i class="bpui-icon-checkbox icon-12selected2"></i>
							<i class="bpui-icon-checkbox icon-12select"></i>
							<span class="bpui-checkbox-text">${item['name']}</span>
						</span>
					</label>
				</div>`;
				html_str += item_html;
            }

            var front_html = `
            <div id="setting-tips" style="width: 100%; float: left; text-indent: 50px;" title="刷新生效">---- 自定义设置 ----</div>`;

			return front_html + html_str;
		}
	},
	/* 事件绑定 */
	band: function(type) {
		var s = this;
        var type = type || 'init';
        if (type == 'init') {
            $dom = s.dom_type == document ? $(document) : $(document).add(s.dom_type);
            if (s.dom_type != document) {
                s.hash = location.hash;
                $(s.keyData.keyBtn[0].currPageBgm).on('click', function() {
                    var hash = location.hash;
                    console.log('log: ' + hash + ', ' + s.hash);
                    if (hash == s.hash) return false;
                    s.hash = hash;
                    s.keyData.keyBtn[0].addCssIframe(s);
                });
            }
            keyupEvent($dom);
            viewEvent(s);
        /*} else if (type == 'bangumi') {
            s.keyData.keyBtn[0].addCssIframe(s);*/
        } /*else if (type == 'bangumi_keyup') {
            var $dom = $(document).add(s.dom_type);
            // 重新绑定
			$dom.off('keyup');
            $dom.off('dblclick');
            $dom.off('click');
            keyupEvent($dom);
        }*/

        function keyupEvent($dom) {
			$dom.on('click', '[flag="config"] label, .bilibili-player-setting-btn', function() { // 视图设置事件
                var $s = $(this);
                if ($s.hasClass('bilibili-player-setting-btn')) {
                    s.settingView(); // 插入设置项html
                } else {
                    var className = 'bpui-state-active';
                    var id = this.id;
                    $s.hasClass(className) ? $s.removeClass(className) : $s.addClass(className);
                    s.cfg[id] = s.cfg[id] > 0 ? 0 : 1;
                    s.dataMgr('set'); // 保存参数
                    console.log('log: turn config[' + id + '] ' + (s.cfg[id] > 0 ? 'on' : 'off'));
                }
            });

            s.cfg.auto_widescreen && $(s.dom_type).on('fullscreenchange mozfullscreenchange webkitfullscreenchange msfullscreenchange', function(e) { // 退出全屏时宽屏
                if (e.target.className.indexOf('mode-fullscreen') == -1) {
                    s.keyAction('widescreen');
                    console.log('log: exit fullscreen & widescreen');
                }
            })

            $dom.on('dblclick', '#bilibiliPlayer .bilibili-player-video', function() { // 鼠标双击事件
                s.keyAction('doubleClick_fullscreen');
            });

            // 视频分P 点击/自动跳转
            $(document).on('click', s.keyData.keyBtn[0].nextbtn + ', ' + s.keyData.keyBtn[0].pageBgm, function() {
                setTimeout(() => {
                    if (s.DATA.curr_pathname == location.pathname) return false; // 点击的是当前分P
                    if (s.DATA.videoListenner) clearInterval(s.DATA.videoListenner);
                    s.keyData.keyBtn[0].addCssIframe(s);
                }, 500);
            });

            (!s.cfg.click_flag && !s.cfg.dblclick_flag) || $dom.on('keyup', function(event) {
                if ($("input:focus, textarea:focus").length > 0) return false; // 焦点在输入框时 不响应按键事件
                var keyCode = event.keyCode;
                var double = doubleClick(keyCode);
                var one_click = s.cfg.click_flag ? true: false;
                var double_click = s.cfg.dblclick_flag ? true: false;
                if (double == false && one_click == true) { // 非双击
                    keyCode = '_' + keyCode;
                    if (typeof s.keyData.keyBtn[keyCode] == 'undefined') return false;
                    s.keyAction(keyCode);
                } else if (double == true && typeof s.keyData.keyBtn[keyCode] != 'undefined' && double_click == true) {
                    s.keyAction(keyCode);
                }
            });

            /* 双击判定 */
            function doubleClick(keyCode) {
                var timenow = (new Date()).getTime();
                if (s.keyData.timenow == 0) {
                    s.keyData.timenow = timenow;
                    s.keyData.preKey = keyCode;
                    return false;
                } else {
                    var intval = timenow - s.keyData.timenow;
                    if (intval < s.keyData.keepTime && s.keyData.preKey == keyCode) {
                        s.keyData.timenow = 0;
                        return true;
                    }
                    s.keyData.preKey = keyCode;
                    s.keyData.timenow = timenow;
                }
                return false;
            }
        }

        /* 悬浮按钮 */
        function viewEvent(s) {
            s.cfg.control_view.status == 1 && $(document).on('click', '#control-view-box [data-cmd]', function() {
                var cmd = $(this).data('cmd');
                if (cmd == 'switch') {
                    s.controlView(); // swith
                    return true;
                }
                s.keyAction(cmd);
                if (s.cfg.control_view.auto_hide == 1) s.controlView('hide');
            });
        }
	},
    /* 自动类操作 */
    autoAction: function() {
        var s = this;
        //if (s.cfg.auto_lightoff == 1) s.keyAction(71);
        if (s.cfg.auto_danmuku == 1) s.keyAction(84);
        if ((s.cfg.auto_playvedio == 1 && $(".video-state-pause").size() > 0) || (s.cfg.auto_playvedio != 1 && $(".video-state-pause").size() < 1)) s.keyAction(80);
        if ((s.cfg.auto_widescreen == 1 && $('.icon-24wideon').size() < 1) || (s.cfg.auto_widescreen != 1 && $('.icon-24wideon').size() > 0)) s.keyAction('widescreen'); // 电影模式不开启
        if (s.cfg.auto_preventshade == 1) s.keyAction('preventshade');
        if (s.cfg.auto_position == 1) s.keyAction('automatic_positioning');
    },
    /* 按键操作 */
    keyAction: function(_keyCode) {
        var s = this;
        var keyCode = _keyCode || false;
        if (keyCode == false || typeof s.keyData.keyBtn[keyCode] == 'undefined') return false;
        var keyData = s.keyData.keyBtn[keyCode];
        var selector = keyData.selector || false;
        var subsidiary_func = keyData.function || false;
        if (selector != false) $(selector, s.dom_type).click(); // 点击操作
        if (subsidiary_func != false) subsidiary_func(keyData, s); // 附属操作
        console.log('log: ' + s.keyData.keyBtn[keyCode].type + ' Action.');
    },
	/* 数据操作 */
	dataMgr: function(act) {
		var s = this;
        var action = act == 'set' ? 'set' : 'get';
        var config_name = s.DATA.script_name + '_config';
		if (action == 'get') {
			var cfgStr = GM_getValue(config_name);
			if (typeof cfgStr == 'undefined' || cfgStr == '') {
                $.extend(s.cfg, s.defaultCfg, config, s.localConfig);
				return false;
			}
            var cfg_obj = JSON.parse(cfgStr);
            if (typeof cfg_obj != 'object')  {
                $.extend(s.cfg, s.defaultCfg, config, s.localConfig);
				return false;
            }
            $.extend(s.cfg, s.defaultCfg, config, s.localConfig, cfg_obj); // 合并
		} else {
			var cfgStr = JSON.stringify(s.cfg);
			GM_setValue(config_name, cfgStr);
		}
	}
};

danmukuObj.launcher(config);