B站播放体验增强

默认网页全屏 网页全屏时滚轮切换宽屏 滚动页面到顶部无鼠标移动自动网页全屏

当前为 2023-08-12 提交的版本,查看 最新版本

// ==UserScript==
// @name  B站播放体验增强
// @description   默认网页全屏 网页全屏时滚轮切换宽屏 滚动页面到顶部无鼠标移动自动网页全屏
// @namespace  1018148046
// @author  颜太吓
// @version  6.1
// @icon https://www.bilibili.com/favicon.ico
// @match https://www.bilibili.com/*
// @run-at  document-start
// @grant  none
// ==/UserScript==
((D) => {
  let url = location.pathname, dbl_timeout, scroll_timeout
  const player = {
    play_btn: ['.bpx-player-ctrl-play', '.squirtle-video-start', '.bilibili-player-video-btn-start'],
    webmode_btn: ['.bpx-player-ctrl-web', '.squirtle-video-pagefullscreen', '.bilibili-player-video-web-fullscreen'],
    webmode_dom: ['.mode-webscreen', '.full-screen', '.mode-webfullscreen'],
    play() {D.querySelector(this.play_btn.find(e => D.querySelector(e))).click()},
    change() {D.querySelector(this.webmode_btn.find(e => D.querySelector(e))).click()},
    get webmode() {return this.webmode_dom.find(e => D.querySelector(e))}
  }, handle = {
    click(e) {
      if (e.target.localName == 'video' || e.target.className == 'bilibili-player-dm-tip-wrap') {
        e.stopPropagation()
        clearTimeout(dbl_timeout)
        if (e.detail == 1) dbl_timeout = setTimeout(() => player.play(), 200)
        if (e.detail == 2) player.change()
      }
    },
    dblclick(e) {if (e.target.localName == 'video' || e.target.className == 'bilibili-player-dm-tip-wrap') e.stopPropagation()},
    wheel() {player.webmode && player.change()},
    mousemove() {clearTimeout(scroll_timeout)},
    scroll(e) {
      clearTimeout(scroll_timeout)
      scroll_timeout = setTimeout(() => {
        if (!window.scrollY && !player.webmode) player.change()
      }, 500)
    }
  }
  const style = D.createElement('style')
  style.type = 'text/css'
  style.innerHTML = `@keyframes init{from{transform:scaleX(1)}to{transform:scaleX(1)}}${player.webmode_btn.join(',')}{animation: init 0s}`
  D.documentElement.appendChild(style)
  D.addEventListener("animationend", function(e) {
    if (e.animationName != 'init') return
    D.removeEventListener("animationend", arguments.callee)
		Object.entries(handle).forEach(e => D.addEventListener(...e, true))
    player.change()
    const mutationObserver = new MutationObserver(e => {
      if (url == location.pathname) return
      url = location.pathname
      !player.webmode && player.change()
    })
    mutationObserver.observe(D.querySelector('title'), {childList: true})
  })
})(document)