YouTube → SkipCut Link Rewriter

Rewrite YouTube links to SkipCut links before they are opened

// ==UserScript==
// @name         YouTube → SkipCut Link Rewriter
// @namespace    https://greasyfork.org/nl/users/1197317-opus-x
// @version      1.0
// @description  Rewrite YouTube links to SkipCut links before they are opened
// @author       Opus-X
// @license      MIT
// @icon         https://www.skipcut.com/favicon.ico
// @match        *://*/*
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    function convertYouTubeToSkipCut(url) {
        try {
            const u = new URL(url);

            if (u.hostname.match(/(^|\.)youtube\.com$/)) {
                // Normal video
                if (u.pathname === '/watch' && u.searchParams.has('v')) {
                    return `https://www.skipcut.com/watch?v=${u.searchParams.get('v')}`;
                }
                // Live stream
                if (u.pathname.startsWith('/live/')) {
                    const liveId = u.pathname.split('/')[2];
                    if (liveId) {
                        return `https://www.skipcut.com/live/${liveId}`;
                    }
                }
                // Playlist
                if (u.pathname === '/playlist' && u.searchParams.has('list')) {
                    return `https://www.skipcut.com/playlist?list=${u.searchParams.get('list')}`;
                }
            }
        } catch (e) {}
        return null;
    }

    document.addEventListener('click', function (e) {
        // Only left-click without modifier keys
        if (e.button !== 0 || e.ctrlKey || e.shiftKey || e.metaKey) return;

        const a = e.target.closest('a[href]');
        if (!a) return;

        const newUrl = convertYouTubeToSkipCut(a.href);
        if (newUrl) {
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation(); // Kill YouTube's own router
            window.open(newUrl, '_blank', 'noopener');
        }
    }, true); // capture mode so we run before site handlers
})();