Greasy Fork

Greasy Fork is available in English.

虎牙免登陆清晰度

虎牙免登陆自动切最高清晰度

当前为 2022-07-09 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         虎牙免登陆清晰度
// @namespace    https://github.com/demon-zhonglin/tmJavaScript
// @version      0.5
// @description  虎牙免登陆自动切最高清晰度
// @author       demon-zhonglin
// @include      https://*.huya.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
  'use strict';

  const waitNode = ({ selector = '', timeNum = 500, callback = Function.prototype, frq = 0}) => {
    const node = document.querySelector(selector)
    if (node) {
      callback(selector)
      return
    } else {
      setTimeout(function() {
        if (frq >= 10) return
        waitNode(selector, timeNum, callback, ++frq)
      }, timeNum)
    }
  }

  const _hasOwnProperty = (__obj = {}, __key = '') => {
    let keys = __key.split('.')
    if (keys.length === 1) return Object.prototype.hasOwnProperty.call(__obj, __key)
    const childObj = __obj[keys[0]]
    keys.shift()
    return _hasOwnProperty(childObj, keys.join('.'))
  }

  const waitObjectHasKey = ({ _obj = {}, _key = '', timeNum = 500, callback = Funciton.prototype, frq = 0 }) => {
    let keys = _key.split('.')

    if (_hasOwnProperty(_obj, _key)) {
      callback(_obj, _key)
      return
    } else {
      setTimeout(function() {
        if (frq >= 20) return
        frq += frq
        waitObjectHasKey({ _obj, _key, timeNum, callback, frq })
      }, timeNum)
    }
  }

  // 更新画质项 节点属性
  const changeVideotypeItem = () => {
    const videotypeList = document.querySelectorAll('.player-menu-panel ul.player-videotype-list > li')
    if (videotypeList.length > 0) {
      for (let _i = 0; _i < videotypeList.length; _i++) {
        videotypeList[_i].setAttribute('isenjoybitrate', '0')
      }
      setTimeout(() => {
        try{
          videotypeList[0].click()
        } catch {
          window.alert('自动切换画质失败,请手动切换视频画质!')
        }
      }, 1000)
    }
  }

  // 显示 画质切换
  const changPlayerMenuVisible = () => {
    waitNode({
      selector: 'div.player-videotype div.player-menu-panel',
      timeNum: 500,
      callback: (selector) => {
        const node = document.querySelector(selector)
        // node.style.setProperty('dispaly', "block", 'important')
        node.style.cssText = 'display: block; height: 210px;'
        changeVideotypeItem()
      }
    })
  }

  // 显示 视频下方菜单
  const changPlayerCtrlVisible = () => {
    waitNode({
      selector: '#player-ctrl-wrap',
      timeNum: 500,
      callback: (selector) => {
        const node = document.querySelector(selector)
        node.style.setProperty('bottom', "60px", 'important')
        setTimeout(() => {
          changPlayerMenuVisible()
        }, 2000)
      }
    })
  }

  const main = () => {
    waitObjectHasKey({
      obj: window,
      _key: 'HyLogin',
      callback: () => {
        window.HyLogin.prototype.closeUdbLogin = function() {
          window.HyLogin.notice("loginClose")
        }
      }
    })

    // 关闭登录弹窗
    waitNode({
      selector: '#UDBSdkLgn',
      callback: (selector) => {
        const node = document.querySelector(selector)
        node.style.cssText = 'display: none;'
      }
    })

    const loopEvent = (num = 0) => {
      if (window.VPlayer.prototype.videoStatus === 0) { // 视频就绪
        changPlayerCtrlVisible()
        return
      }
      setTimeout(() => {
        if (num > 10) return
        loopEvent(++num)
      }, 500)
    }

    // 监听视频状态
    waitObjectHasKey({
      _obj: window,
      _key: 'VPlayer.prototype.videoStatus',
      callback: loopEvent
    })
  }

  main()
})();