Greasy Fork

来自缓存

Greasy Fork is available in English.

虎牙免登陆清晰度

虎牙免登陆可控清晰度【自动切最高清晰度】【自 2023-07 huya 更新后,全网首发 huya 绕过登录可切换画质清晰度】

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         虎牙免登陆清晰度
// @namespace    https://github.com/demon-zhonglin/tmJavaScript
// @version      0.9
// @description  虎牙免登陆可控清晰度【自动切最高清晰度】【自 2023-07 huya 更新后,全网首发 huya 绕过登录可切换画质清晰度】
// @author       demon-zhonglin
// @include      https://*.huya.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
  'use strict';

  // 监听节点
  const waitNode = ({ selector = '', timeNum = 500, callback = Function.prototype, frq = 0}) => {
    try {
      const node = document.querySelector(selector)
      if (node) {
        callback(node, selector)
        return
      } else {
        setTimeout(function() {
          if (frq >= 10) return
          waitNode({ selector, timeNum, callback, frq: ++frq})
        }, timeNum)
      }
    } catch (error) {
      window.alert(`waitNode err: ${error}`)
    }
  }

  // 判断对象是否含有指定字段(可深层字段)
  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 }) => {
    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 closeLogin = () => waitNode({
    selector: '#UDBSdkLgn',
    callback: (node, selector) => {
      node.style.cssText = 'display: none;'
    }
  })

  // 更新画质项 节点属性
  const changeVideotypeItem = () => {
    $('.player-videotype-list li').each(function(e, t) {
      let obj = $(t).data('data')
      obj.status = 1
      $(t).data('data', obj)
    })

    const videotypeList = $('.player-menu-panel ul.player-videotype-list > li')
    if (videotypeList.length > 0) {
      setTimeout(() => {
        try{
          videotypeList[0].click()
          closeLogin()
        } catch {
          window.alert('自动切换画质失败,请手动切换视频画质!')
        }
      }, 1000)
    }
  }

  // 覆盖关闭窗口事件
  waitObjectHasKey({
    obj: window,
    _key: 'HyLogin',
    callback: () => {
      window.HyLogin.prototype.closeUdbLogin = function() {
        window.HyLogin.notice("loginClose")
      }
    }
  })

  // 清空倒计时
  const clearCountdown = () => {
    const timeNum = window.localStorage.getItem('roomHeartbeat')
    if (Number.isInteger(timeNum)) {
      window.localStorage.setItem('roomHeartbeat', -Infinity) // 跳过未登录时间检测
    }
  }

  const main = () => {
    const loopEvent = (num = 0) => {
      // 避免多开浏览器tab有某个tab失效导致重新触发登录时间
      clearCountdown()

      // 防止未重置登录弹窗关闭事件前,手动关闭登录弹窗
      closeLogin()

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

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

  main()
})();