// ==UserScript==
// @name bilibili弹幕隐藏快捷键(临时隐藏)
// @namespace tonyu_balabala_03e6ea
// @version 1.0
// @description bilibili弹幕隐藏快捷键(临时隐藏,默认为 N 键,不是网页自带开关机制,网页自带开关快捷键为 D 键)
// @author Tony
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAoVQTFRFAAAAfov/f4v/f4z/f4z/f4z/f4z/f4v/fYr/fov/f4z/f4z/f4z/f4z/f4z/foz/fYv/e4n/f4z/f4z/f4z/fov/eor/for/f4z/f4z/f4z/foz/f4v/eYj/eon/fov/foz/f4z/f4z/f4z/foz/f4z/f4z/fov/d4j/fov/f4z/f4z/fov/foz/f4z/fov/fIz/UWD8UWD8UWD8UWD8q7D/q7D/q7D/fYv/foz/fov/fIn/f4z/QID/UWD8UWD8UWD8q7D/q7D/q7D/q7D/Zmb/f4z/f4z/eYz/f4z/fov/UWD8q7D/q7D/q7D/VYD/f4z/f4z/f4r/f4z/fIv/q7D/for/f4z/fYr/f4z/fov/q7D/q7D/fov/foz/f4z/aoD/q7D/cID/f4z/fYv/f4v/q7D/q7D/q7D/f4z/f4z/fov/UWD8UWD8q7D/q7D/q7D/q7D/q7D/f4v/f4z/fov/UWD8UWD8UWD8f4z/f4z/f4z/e4f/UWD8UWD8d4n/f4z/d4b/UWD8eIf/f4z/f4z/UWD8UWD8UWD8UWD8f4v/f4z/foz/fov/foz/f4z/fYv/f4z/f4z/fIv/f4z/eIf/eYb/f4z/f4z/fov/fov/f4z/foz/f4z/fIr/fIz/f4z/f4z/f4z/cXH/YID/f4z/foz/fYj/f4z/UWD8UWD8f4z/fIn/for/foz/fIz/UWD8UWD8foz/f4z/for/f4v/fov/bW3/cXH/f4z/f4z/foz/f4z/f4z/fov/foz/eYj/eon/foz/f4z/f4z/fov/eIf/f4z/f4z/f4z/f4v/e4T/for/foz/f4z/f4z/f4z/f4v/for/f4v/f4z/f4v/fov/VQ1gSwAAANd0Uk5TAB9fg5SSgVoXFY3Z/v/RgQ4FjPXwewMh1MloNxUEBhg7b9XFLujMOgFG29weH+eFBhjl2xAeRAEJnRQE0ABM/zOU/9E9AIq5A4mDTZn7awCjYxfLBl4J3g6OOfcoV2XdALEB2iBjhP4ckFkxUjcJXGZhCEuCEtS9UBxWkwTk1wdiBcgIYYDBojYLIFVYNE86Gm2aEdYBAuXAgURmWe8JDeZ3nwABulQDw0sypQIWpQnYyrjKDh5QAAHIFBW7kUMbBwhLmeMOAmDt5FIBDGPG/bxZCD9YPBCTjRZGAAACCklEQVR4nJWT+V9MURjGX1FMzaNoUZaULJkSaSRbJzdDSZRE2UJ2lZ1kC9FiT9bKkrKVXUJR1rLv/p7OPXfmujN3/OD55Tzv+3w/n3Pez+c9RP+jLi5du7m6de/hPDW4exghZOzp6aWLe/X2hkY+vn72eR9/3g3o26//gMCBQcGDeBFi0OaDhwBDh4XaytDhJiAs/G8+IgIYOUp2kaOjzGOix1LMOMA03pZPmAgETxI2lrG4yVL8FLJMBaYlWIFEYLqSUxIHZkhS8kyalQKkKs3Z3kibQ3aAJKXT3HnwyRDNTGA+OQILFtIiYLFoZiFkiQ6QltKybKTJveXACtICKwWwajWtAeRB1gLrVCCHsdy89Ru4Nm6izUAQ720BtlJkklDONsa25yveTDuAAg7sBHbRbqbTHtoLFHLAFdhHUXpgPx0AijhwUH6KOU4o9xBjxSWKL6Uy4DAHjgBH1UfmM1aiFseA4/w4AZy0G1MtymE8JZ8VqDjtDDhzFueEOQ9ccAZUAlXCeFUj+6IeuBSByzGKvQLUXHUEauuAa1b2+g0g0SLsTcZuCWPh61DfYLvtdhZw567szPful4prHwAPH6nzUKO8pI+bbOWTIr6kT5+RRs0tfNNNz1+0tr0Mf/X6DS/q35Kd3rV3aD/O+w8fyVGfPn+xfr2v377/0MVChp+/UgsLfv9xnv5Dnauuj5T4NeYmAAAAAElFTkSuQmCC
// @license MIT
// @match *://*.bilibili.com/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_registerMenuCommand
// ==/UserScript==
(function() {
'use strict';
let danMuSwitchKC = GM_getValue('tony_danmu_switch_keycode', 78)
let danMuSwitchKName = GM_getValue('tony_danmu_switch_keyname', 'n')
let danMuSwitchMode = GM_getValue('tony_danmu_switch_mode', '1')
function mySwitch(danMu) {
if(danMu) {
if(danMu.style.visibility == "") danMu.style.visibility="hidden"
else danMu.style.visibility=""
}
}
function keydownHandler(e) {
switchHandler(e)
document.removeEventListener('keydown', keydownHandler);
}
function switchHandler(e) {
if(e.keyCode == danMuSwitchKC) {
let danMu1 = document.getElementsByClassName("bilibili-player-video-danmaku")[0]
let danMu2 = document.getElementsByClassName("bilibili-player-video-adv-danmaku")[0]
let danMu3 = document.getElementsByClassName("bilibili-player-video-bas-danmaku")[0]
let danMu4 = document.getElementsByClassName("bpx-player-row-dm-wrap")[0]
mySwitch(danMu1)
mySwitch(danMu2)
mySwitch(danMu3)
mySwitch(danMu4)
}
}
document.addEventListener('keydown', keydownHandler);
document.addEventListener('keyup', function(e) {
if(danMuSwitchMode === '1') switchHandler(e)
document.addEventListener('keydown', keydownHandler);
});
let hasSettingShow = false
function showSetting() {
if(hasSettingShow) return
let settingBox = document.createElement("div");
settingBox.setAttribute("style", `position: fixed !important;
top: 10px !important;
left: 50% !important;
z-index:2147483647 !important;
`)
let contentBox = document.createElement('div')
contentBox.setAttribute("style", `box-shadow: 0 0 10px rgba(100, 100, 100, 0.2) !important;
max-height: calc(100vh - 60px) !important;
max-width: 80vw !important;
overflow: auto !important;
background-color: rgb(235, 235, 235) !important;
text-align: center !important;
font-size: 13px !important;
border-radius: 16px !important;
white-space: nowrap;
padding: 10px 16px 10px 16px !important;
margin-left: -50% !important;
margin-right: 50% !important;
z-index:2147483647 !important;
box-sizing: content-box !important;
border: 2px solid rgb(100 100 100 / 10%) !important;
`)
if('backdropFilter' in document.documentElement.style) {
contentBox.style.backgroundColor = 'rgba(235, 235, 235, 0.8)'
contentBox.style.backdropFilter = 'saturate(50%) blur(14px)'
//contentBox.style.transform = 'translateZ(0)'
}
if(getComputedStyle) {
let fontFml = getComputedStyle(document.body, null)['font-family']
if(fontFml) contentBox.style.fontFamily = fontFml
}
let settingContent = document.createElement('div')
settingContent.setAttribute('style', 'font-weight: 600 !important;')
let MemorySettingTitle = document.createElement('div')
MemorySettingTitle.setAttribute('style', 'margin-top:10px;')
MemorySettingTitle.innerText = '弹幕临时隐藏开关模式'
settingContent.appendChild(MemorySettingTitle)
let danMuSwitchModeSelector = document.createElement('select')
danMuSwitchModeSelector.setAttribute('style', 'margin-top:10px;padding:3px 10px;border:2px solid rgb(168,168,168);border-radius:10px;')
let danMuSwitchModeOption1 = document.createElement('option')
danMuSwitchModeOption1.value = '1'
danMuSwitchModeOption1.innerText = '长按模式'
danMuSwitchModeOption1.selected = danMuSwitchMode==='1'
let danMuSwitchModeOption2 = document.createElement('option')
danMuSwitchModeOption2.value = '2'
danMuSwitchModeOption2.innerText = '敲击模式'
danMuSwitchModeOption2.selected = danMuSwitchMode==='2'
danMuSwitchModeSelector.appendChild(danMuSwitchModeOption1)
danMuSwitchModeSelector.appendChild(danMuSwitchModeOption2)
danMuSwitchModeSelector.addEventListener('change', function() {
danMuSwitchMode = danMuSwitchModeSelector.value
GM_setValue('tony_danmu_switch_mode', danMuSwitchMode)
})
settingContent.appendChild(danMuSwitchModeSelector)
let KCSettingTitle = document.createElement('div')
KCSettingTitle.setAttribute('style', 'margin-top:10px;')
KCSettingTitle.innerText = '快捷键设置'
settingContent.appendChild(KCSettingTitle)
let KCSettingBox = document.createElement('div')
KCSettingBox.setAttribute('style', 'margin-top:10px;')
let KNameTitle = document.createElement('span')
KNameTitle.innerText = '弹幕隐藏快捷键(点击修改→):'
KNameTitle.setAttribute('style', 'margin-right:6px;')
let KCSettingBtnBox = document.createElement('div')
KCSettingBtnBox.setAttribute('style', 'display:none;margin-top:8px;')
let KCSettingBtnOK = document.createElement('button')
let KCSettingBtnCancel = document.createElement('button')
let KName = document.createElement('button')
KName.innerText = danMuSwitchKName
KName.setAttribute('style', 'padding:8px 16px;border-radius:28px;color:rgb(5,107,0);background-color:rgb(240,240,240);border:1px solid rgb(100,100,100);')
let clickSpdKC = danMuSwitchKC
let clickSpdKName = danMuSwitchKName
function keyupHandler(e) {
e.stopPropagation()
clickSpdKC = e.keyCode
clickSpdKName = e.key
KName.innerText = clickSpdKName
}
function kNameClickHandler() {
clickSpdKC = danMuSwitchKC
clickSpdKName = danMuSwitchKName
KName.innerText = '请按键ヾ(•ω•`)o'
KName.addEventListener('keydown', keyupHandler)
KName.removeEventListener('click', kNameClickHandler)
KCSettingBtnBox.style.display = 'block'
KName.focus()
}
KName.addEventListener('click', kNameClickHandler)
KCSettingBtnOK.innerText = '确认'
KCSettingBtnOK.setAttribute('style', 'padding:8px 10px;border:0;color:white;background-color:rgb(25,207,20);border-radius:28px;')
KCSettingBtnOK.addEventListener('click', function() {
danMuSwitchKC = clickSpdKC
danMuSwitchKName = clickSpdKName
GM_setValue('tony_danmu_switch_keycode', clickSpdKC)
GM_setValue('tony_danmu_switch_keyname', clickSpdKName)
KName.innerText = danMuSwitchKName
KName.removeEventListener('keydown', keyupHandler)
KName.addEventListener('click', kNameClickHandler)
KCSettingBtnBox.style.display = 'none'
})
KCSettingBtnCancel.innerText = '取消'
KCSettingBtnCancel.setAttribute('style', 'margin-right:6px;padding:8px 10px;border:0;color:white;background-color:rgb(243,97,128);border-radius:28px;')
KCSettingBtnCancel.addEventListener('click', function() {
KName.innerText = danMuSwitchKName
// let clickSpdKC = spdKCSettings[i]
// let clickSpdKName = spdKNames[i]
KName.removeEventListener('keydown', keyupHandler)
KName.addEventListener('click', kNameClickHandler)
KCSettingBtnBox.style.display = 'none'
})
KCSettingBox.appendChild(KNameTitle)
KCSettingBox.appendChild(KName)
KCSettingBtnBox.appendChild(KCSettingBtnCancel)
KCSettingBtnBox.appendChild(KCSettingBtnOK)
KCSettingBox.appendChild(KCSettingBtnBox)
settingContent.appendChild(KCSettingBox)
let hideBtnBox = document.createElement('div')
hideBtnBox.setAttribute('style', 'margin-top:10px;')
let hideBtn = document.createElement('button')
hideBtn.innerText = '关闭面板'
hideBtn.setAttribute('style', 'padding:8px 10px;border:0;color:white;background-color:rgb(50,130,236);border-radius:28px;')
hideBtn.addEventListener('click', function() {
document.documentElement.removeChild(settingBox)
hasSettingShow = false
})
hideBtnBox.appendChild(hideBtn)
settingContent.appendChild(hideBtnBox)
let settingTip = document.createElement('div')
settingTip.setAttribute('style', 'margin-top:10px;')
settingTip.innerText = '设置完成后刷新页面,以确保生效'
settingContent.appendChild(settingTip)
contentBox.appendChild(settingContent)
settingBox.appendChild(contentBox)
document.documentElement.appendChild(settingBox)
hasSettingShow = true
}
GM_registerMenuCommand('设置',showSetting)
})();