YT-DVR

Unlocks rewind for YouTube live streams with disabled DVR

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         YT-DVR
// @namespace    n2gf
// @description  Unlocks rewind for YouTube live streams with disabled DVR
// @author       n2gf copyMister
// @version      1.0
// @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";

unsafeWindow.eval('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;\
                }\
            }\
        }\
        this[Symbol.for("YT-DVR")] = value;\
    },\
    get() {\
        return this[Symbol.for("YT-DVR")];\
    },\
    configurable: true,\
});');