YouTube 标准画质

只允许 YouTube 选择 1080P60、1080P30、720P60、720P30 画质。避免由于网络问题卡顿:高画质用不上费流量、低网速降画质瞎眼睛。

  1. // ==UserScript==
  2. // @name YouTube 标准画质
  3. // @description 只允许 YouTube 选择 1080P60、1080P30、720P60、720P30 画质。避免由于网络问题卡顿:高画质用不上费流量、低网速降画质瞎眼睛。
  4. // @match https://www.youtube.com/*
  5. // @version 1.0
  6. // @author yzcjd
  7. // @author2 ChatGPT4 辅助
  8. // @namespace https://greasyfork.org/users/1171320
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. // 定义优先顺序
  17. const preferredQualities = ['hd1080', 'hd720'];
  18.  
  19. // 监听播放状态变化
  20. function hookPlayer() {
  21. const checkPlayer = () => {
  22. const player = document.getElementById('movie_player');
  23.  
  24. if (!player || typeof player.getAvailableQualityLevels !== 'function') {
  25. setTimeout(checkPlayer, 500);
  26. return;
  27. }
  28.  
  29. console.log('[YouTube Quality Filter] Player ready, binding events.');
  30.  
  31. player.addEventListener('onStateChange', function(state) {
  32. if (state === 1) { // 播放开始
  33. console.log('[YouTube Quality Filter] Playing - enforcing quality.');
  34. enforceQuality(player);
  35. }
  36. });
  37.  
  38. // 视频切换或重新加载时,也重新检测
  39. setInterval(() => {
  40. enforceQuality(player);
  41. }, 30000); // 每30秒强制一次,确保不会被降回高画质
  42. };
  43.  
  44. checkPlayer();
  45. }
  46.  
  47. function enforceQuality(player) {
  48. if (!player || typeof player.getAvailableQualityLevels !== 'function') return;
  49.  
  50. const levels = player.getAvailableQualityLevels(); // 获取当前可用画质
  51. console.log('[YouTube Quality Filter] Available qualities:', levels);
  52.  
  53. let targetQuality = null;
  54.  
  55. if (levels.includes('hd1080')) {
  56. targetQuality = 'hd1080';
  57. } else if (levels.includes('hd720')) {
  58. targetQuality = 'hd720';
  59. }
  60.  
  61. if (targetQuality) {
  62. console.log('[YouTube Quality Filter] Setting quality to:', targetQuality);
  63. player.setPlaybackQualityRange(targetQuality, targetQuality);
  64. player.setPlaybackQuality(targetQuality);
  65. }
  66. }
  67.  
  68. // 监听YouTube内部的导航完成
  69. window.addEventListener('yt-navigate-finish', () => {
  70. console.log('[YouTube Quality Filter] Navigation detected - Re-hooking player.');
  71. setTimeout(hookPlayer, 1000);
  72. });
  73.  
  74. // 初次加载
  75. hookPlayer();
  76. })();