YouTube → NewPipe (Intent Redirect)

Force YouTube links to open directly in NewPipe using Android intents

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         YouTube → NewPipe (Intent Redirect)
// @namespace    https://local.newpipe.redirect/
// @version      1.1
// @description  Force YouTube links to open directly in NewPipe using Android intents
// @match        *://*/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';

    function makeIntent(videoId) {
        return `intent://www.youtube.com/watch?v=${videoId}` +
               `#Intent;scheme=https;package=org.schabi.newpipe;end`;
    }

    function rewriteLink(a) {
        if (!a || !a.href) return;

        try {
            const url = new URL(a.href);

            // youtube.com/watch?v=ID
            if (url.hostname.includes("youtube.com") && url.searchParams.has("v")) {
                const id = url.searchParams.get("v");
                a.href = makeIntent(id);
            }

            // youtu.be/ID
            else if (url.hostname === "youtu.be") {
                const id = url.pathname.substring(1);
                if (id) {
                    a.href = makeIntent(id);
                }
            }
        } catch (e) {
            // ignore
        }
    }

    function rewriteAll() {
        document.querySelectorAll("a[href]").forEach(rewriteLink);
    }

    const observer = new MutationObserver(rewriteAll);

    rewriteAll();

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true
    });
})();