您需要先安装一个扩展,例如 篡改猴、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,
- });