您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Unlocks rewind for YouTube live streams with disabled DVR
// ==UserScript== // @name YTBetter - Enable Rewind/DVR // @namespace YTBetter // @version 2.9 // @description Unlocks rewind for YouTube live streams with disabled DVR // @description:ru Позволяет перематывать YouTube-стримы, где такая возможность заблокирована // @author copyMister // @match https://www.youtube.com/* // @match https://m.youtube.com/* // @run-at document-start // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com // @grant none // @license MIT // ==/UserScript== "use strict"; // Interop with "Simple YouTube Age Restriction Bypass" const { get: getter, set: setter, } = Object.getOwnPropertyDescriptor(Object.prototype, "playerResponse") ?? { set(value) { this[Symbol.for("YTBetter")] = value; }, get() { return this[Symbol.for("YTBetter")]; }, }; const isObject = (value) => value != null && typeof value === "object"; Object.defineProperty(Object.prototype, "playerResponse", { set(value) { if (isObject(value)) { const { streamingData, videoDetails, playerConfig } = value; if (isObject(videoDetails) && videoDetails.isLive && !videoDetails.isLiveDvrEnabled) { videoDetails.isLiveDvrEnabled = true; if (isObject(playerConfig) && playerConfig.mediaCommonConfig) { playerConfig.mediaCommonConfig.useServerDrivenAbr = false; } if (isObject(streamingData) && (streamingData.hlsManifestUrl || streamingData.dashManifestUrl) && streamingData.serverAbrStreamingUrl) { delete streamingData.serverAbrStreamingUrl; } } } setter.call(this, value); }, get() { return getter.call(this); }, configurable: true, });