您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
5/11/2025, 9:27:12 PM
- // ==UserScript==
- // @name Smooth YouTube livestream
- // @namespace UserScripts
- // @version 0.1.3
- // @license MIT License
- // @match https://www.youtube.com/*
- // @grant none
- // @author -
- // @description 5/11/2025, 9:27:12 PM
- // @run-at document-start
- // ==/UserScript==
- (() => {
- const observablePromise = (proc, timeoutPromise) => {
- let promise = null;
- return {
- obtain() {
- if (!promise) {
- promise = new Promise(resolve => {
- let mo = null;
- const f = () => {
- let t = proc();
- if (t) {
- mo.disconnect();
- mo.takeRecords();
- mo = null;
- resolve(t);
- }
- }
- mo = new MutationObserver(f);
- mo.observe(document, { subtree: true, childList: true })
- f();
- timeoutPromise && timeoutPromise.then(() => {
- resolve(null)
- });
- });
- }
- return promise
- }
- }
- }
- (async () => {
- const q = await observablePromise(() => {
- try {
- return ytcfg.data_.WEB_PLAYER_CONTEXT_CONFIGS.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH;
- } catch (e) { }
- }).obtain();
- if (q) setup();
- })();
- let bb = false;
- const setup = () => {
- if (bb) return;
- bb = true;
- const q = ytcfg.data_.WEB_PLAYER_CONTEXT_CONFIGS.WEB_PLAYER_CONTEXT_CONFIG_ID_KEVLAR_WATCH;
- if (q && q.serializedExperimentFlags) {
- const x = 85; // 17
- const y = 1.25; // 0.25
- q.serializedExperimentFlags = q.serializedExperimentFlags.replace(/&?html5_live_use_alternate_bandwidth_window_sizes=[^&=]*/, '') + '&html5_live_use_alternate_bandwidth_window_sizes=true'
- q.serializedExperimentFlags = q.serializedExperimentFlags.replace(/&?html5_live_ultra_low_latency_bandwidth_window=[^&=]*/, '') + '&html5_live_ultra_low_latency_bandwidth_window=' + x
- q.serializedExperimentFlags = q.serializedExperimentFlags.replace(/&?html5_live_low_latency_bandwidth_window=[^&=]*/, '') + '&html5_live_low_latency_bandwidth_window=' + x
- q.serializedExperimentFlags = q.serializedExperimentFlags.replace(/&?html5_live_normal_latency_bandwidth_window=[^&=]*/, '') + '&html5_live_normal_latency_bandwidth_window=' + x
- q.serializedExperimentFlags = q.serializedExperimentFlags.replace(/&?html5_min_startup_buffered_media_duration_for_live_secs=[^&=]*/, '') + '&html5_min_startup_buffered_media_duration_for_live_secs=' + y
- }
- };
- let cid1 = 0, cid2 = 0;
- let checks = new Set();
- let lastMedia = null;
- const onDelayDone = () => {
- const media = lastMedia;
- lastMedia = null;
- if (!media) return;
- // L = n * 1 - n * 0.968
- if (media.isConnected && media.playbackRate === 0.968) {
- media.playbackRate = 1;
- }
- }
- const delayCheck = () => {
- let media;
- for (const target of checks) {
- if (target.isConnected && target.playbackRate === 1 && target.matches('#player *, #ytd-player *')) {
- media = target;
- break;
- }
- }
- if (!media) return;
- if (!document.querySelector('.ytp-live-badge.ytp-live-badge-is-livehead')) return;
- if (cid2) clearTimeout(cid2);
- if (lastMedia && lastMedia.isConnected && lastMedia.playbackRate === 0.968) lastMedia.playbackRate = 1;
- lastMedia = media;
- media.playbackRate = 0.968;
- cid2 = setTimeout(onDelayDone, 30000);
- }
- document.addEventListener('canplay', (e) => {
- if (!e || !e.isTrusted || !(e.target instanceof HTMLMediaElement)) return;
- const p = document.querySelector('.ytp-live-badge.ytp-live-badge-is-livehead');
- const media = e.target;
- if (p && media.playbackRate === 1) {
- if (cid1) clearTimeout(cid1);
- checks.add(media);
- cid1 = setTimeout(delayCheck, 100);
- }
- }, true);
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址