YouTube List Stripper

Open YouTube videos from a playlist in a new tab without the playlist attributes

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         YouTube List Stripper
// @name:ja      YouTubeでプレイリストを外して開くやつ
// @namespace    https://greasyfork.org/ja/users/1492018-sino087
// @version      1.1.1
// @description  Open YouTube videos from a playlist in a new tab without the playlist attributes
// @description:ja プレイリストから動画を開くときに、プレイリストの属性を外して新しいタブで開きます
// @author       sino
// @license      MIT
// @icon         https://www.youtube.com/s/desktop/db7db827/img/favicon.ico
// @match        *://www.youtube.com/*
// @noframes
// @grant        GM_openInTab
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';

    function getCleanUrl(url) {
        try {
            const urlObj = new URL(url);
            if (urlObj.pathname === '/watch' && urlObj.searchParams.has('list')) {
                urlObj.searchParams.delete('list');
                urlObj.searchParams.delete('index');
                return urlObj.toString();
            }
        } catch (e) {
            console.error('YouTube List Stripper: Invalid URL', e);
        }
        return null;
    }

    function handleClick(event) {
        const pathname = window.location.pathname;
        const search = window.location.search;
        const isPlaylist = pathname === '/playlist' && search.includes('list=');
        const isWatchList = pathname === '/watch' && search.includes('list=');

        if (!isPlaylist && !isWatchList) return;

        let link = event.target.closest('a');
        if (!link || !link.href) {
            const contentDiv = event.target.closest('ytd-playlist-video-renderer > div#content');
            if (contentDiv) {
                link = contentDiv.querySelector('a#video-title');
            }
            if (!link || !link.href) return;
        }
        if (link.classList.contains('yt-spec-button-shape-next')) {
            return;
        }

        if (event.button !== 0 || event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) {
            return;
        }

        const cleanUrl = getCleanUrl(link.href);
        if (cleanUrl) {
            event.preventDefault();
            event.stopPropagation();
            event.stopImmediatePropagation();

            if (isWatchList) {
                const video = document.querySelector('video');
                if (video) {
                    video.pause();
                }
            }

            window.open(cleanUrl, '_blank');
        }
    }

    document.addEventListener('click', handleClick, true);

})();