您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
停用 YouTube 的 AV1 视频播放
- // ==UserScript==
- // @name Disable YouTube AV1
- // @description Disable AV1 for video playback on YouTube
- // @name:zh-TW 停用 YouTube AV1
- // @description:zh-TW 停用 YouTube 的 AV1 影片播放
- // @name:zh-HK 停用 YouTube AV1
- // @description:zh-HK 停用 YouTube 的 AV1 影片播放
- // @name:zh-CN 停用 YouTube AV1
- // @description:zh-CN 停用 YouTube 的 AV1 视频播放
- // @name:ja YouTube AV1 停用
- // @description:ja YouTube の動画再生に AV1 を停用する
- // @name:ko YouTube AV1 비활성화
- // @description:ko YouTube의 동영상 재생에 AV1을 비활성화하기
- // @name:vi Vô hiệu hóa YouTube AV1
- // @description:vi Vô hiệu hóa AV1 để phát video trên YouTube
- // @name:de YouTube AV1 deaktivieren
- // @description:de Deaktiviert AV1 für die Videowiedergabe auf YouTube
- // @name:fr Désactiver YouTube AV1
- // @description:fr Désactivez AV1 pour la lecture des vidéos sur YouTube
- // @name:it Disabilita YouTube AV1
- // @description:it Disabilita AV1 per la riproduzione dei video su YouTube
- // @name:es Desactivar AV1 en YouTube
- // @description:es Desactivar AV1 para la reproducción de videos en YouTube
- // @namespace http://tampermonkey.net/
- // @version 2.4.4
- // @author CY Fung
- // @match https://www.youtube.com/*
- // @match https://www.youtube.com/embed/*
- // @match https://www.youtube-nocookie.com/embed/*
- // @exclude https://www.youtube.com/live_chat*
- // @exclude https://www.youtube.com/live_chat_replay*
- // @exclude /^https?://\S+\.(txt|png|jpg|jpeg|gif|xml|svg|manifest|log|ini)[^\/]*$/
- // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com
- // @grant none
- // @run-at document-start
- // @license MIT
- // @compatible chrome
- // @compatible firefox
- // @compatible opera
- // @compatible edge
- // @compatible safari
- // @unwrap
- // @allFrames true
- // @inject-into page
- // ==/UserScript==
- (function () {
- 'use strict';
- console.debug("disable-youtube-av1", "injected");
- const flagConfig = () => {
- let firstDa = true;
- let cid = 0;
- const { setInterval, clearInterval, setTimeout } = window;
- const tn = () => {
- const da = (window.ytcfg && window.ytcfg.data_) ? window.ytcfg.data_ : null;
- if (!da) return;
- const isFirstDa = firstDa;
- firstDa = false;
- for (const EXPERIMENT_FLAGS of [da.EXPERIMENT_FLAGS, da.EXPERIMENTS_FORCED_FLAGS]) {
- if (EXPERIMENT_FLAGS) {
- // EXPERIMENT_FLAGS.html5_disable_av1_hdr = true;
- // EXPERIMENT_FLAGS.html5_prefer_hbr_vp9_over_av1 = true;
- }
- }
- if (isFirstDa) {
- let mo = new MutationObserver(() => {
- mo.disconnect();
- mo.takeRecords();
- mo = null;
- setTimeout(() => {
- cid && clearInterval.call(window, cid);
- cid = 0;
- tn();
- })
- });
- mo.observe(document, { subtree: true, childList: true });
- }
- };
- cid = setInterval.call(window, tn);
- };
- const supportedFormatsConfig = () => {
- function typeTest(type) {
- if (typeof type === 'string' && type.startsWith('video/')) {
- if (type.includes('av01')) {
- if (/codecs[\x20-\x7F]+\bav01\b/.test(type)) return false;
- } else if (type.includes('av1')) {
- if (/codecs[\x20-\x7F]+\bav1\b/.test(type)) return false;
- }
- }
- }
- // return a custom MIME type checker that can defer to the original function
- function makeModifiedTypeChecker(origChecker, dx) {
- // Check if a video type is allowed
- return function (type) {
- let res = undefined;
- if (type === undefined) res = false;
- else res = typeTest(type);
- if (res === undefined) res = origChecker.apply(this, arguments);
- else res = !dx ? res : (res ? "probably" : "");
- // console.debug(20, type, res)
- return res;
- };
- }
- // Override video element canPlayType() function
- const proto = (HTMLVideoElement || 0).prototype;
- if (proto && typeof proto.canPlayType == 'function') {
- proto.canPlayType = makeModifiedTypeChecker(proto.canPlayType, true);
- }
- // Override media source extension isTypeSupported() function
- const mse = window.MediaSource;
- // Check for MSE support before use
- if (mse && typeof mse.isTypeSupported == 'function') {
- mse.isTypeSupported = makeModifiedTypeChecker(mse.isTypeSupported);
- }
- };
- function disableAV1() {
- // This is the setting to disable AV1 [ 480p (or below) - AV1, above 480p - VP9 ]
- // localStorage['yt-player-av1-pref'] = '480';
- try {
- Object.defineProperty(localStorage.constructor.prototype, 'yt-player-av1-pref', {
- get() {
- if (this === localStorage) return '480';
- return this.getItem('yt-player-av1-pref');
- },
- set(nv) {
- this.setItem('yt-player-av1-pref', nv);
- return true;
- },
- enumerable: true,
- configurable: true
- });
- } catch (e) {
- // localStorage['yt-player-av1-pref'] = '480';
- }
- if (localStorage['yt-player-av1-pref'] !== '480') {
- console.warn('Disable YouTube AV1 and VP9', '"yt-player-av1-pref = 480" is not supported in your browser.');
- return;
- }
- console.debug("disable-youtube-av1-and-vp9", "AV1 disabled by yt-player-av1-pref = 480");
- }
- disableAV1();
- // flagConfig();
- supportedFormatsConfig();
- })();