Export Youtube Playlist in tab delimited text

Shows a list of the playlist video names in tab delimited text to be easily copied

目前为 2020-12-14 提交的版本。查看 最新版本

// ==UserScript==
// @name         Export Youtube Playlist in tab delimited text
// @namespace    1N07 & MK
// @version      0.4
// @description  Shows a list of the playlist video names in tab delimited text to be easily copied
// @author       1N07 & MK
// @require      https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @include      https://www.youtube.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var listCreationAllowed = true;
    var urlAtLastCheck = "";
    setInterval(function(){
        if(urlAtLastCheck != window.location.href)
        {
            urlAtLastCheck = window.location.href;
            if(urlAtLastCheck.includes("/playlist?list="))
                InsertButtonASAP();
        }
    }, 100);


    function InsertButtonASAP()
    {
        let buttonInsertInterval = setInterval(function(){
            //wait for possible previous buttons to stop existing (due to how youtube loads pages) and for the space for the new button to be available
            if($("#exportPlainTextList").length == 0 && $("ytd-playlist-sidebar-secondary-info-renderer > #owner-container").length > 0)
            {
                $("ytd-playlist-sidebar-secondary-info-renderer > #owner-container").parent().after("<button id='exportTabTextList'>Export as tab delimited text</button>");
                $("#exportTabTextList").click(ScrollUntillAllVisible);
                clearInterval(buttonInsertInterval);
            }
        }, 100);
    }

    function ScrollUntillAllVisible()
    {
        if(!listCreationAllowed)
            return;

        listCreationAllowed = false;
        $("#exportPlainTextList").after(`<p id="listBuildMessage" style="color: red; font-size: 1.33em;">Getting list... please wait.</p>`);
        let numOfVideosInPlaylist = $("ytd-playlist-sidebar-renderer.ytd-browse > #items #stats > yt-formatted-string.ytd-playlist-sidebar-primary-info-renderer:first").text().replace(/(\D+|\s+)/g, '');
        let scrollInterval = setInterval(function(){
            if($("yt-formatted-string#index.ytd-playlist-video-renderer").last().text() != numOfVideosInPlaylist)
                $(document).scrollTop($(document).height());
            else
            {
                BuildAndDisplayList();
                clearInterval(scrollInterval);
            }
        }, 100);
    }

    function BuildAndDisplayList()
    {
        let list = "<Name>\t<Channel>\t<Duration>\n";
        let vTitle = "";
        let vFull = "";
        $("ytd-playlist-video-renderer #content #video-title").each(function(){
            vTitle = $(this).attr("title");
            if(vTitle != "[Private video]" && vTitle != "[Deleted video]") {
                vFull = $(this).attr("aria-label");
                vFull = vFull.replace(vTitle, "");
                vFull = vFull.replace(" by ", "\t");
                vFull = vFull.replace(/\w+(?=\s+ago)/g, "");
                vFull = vFull.replace(/\w+(?=\s+ago)/g, "");
                vFull = vFull.replace("   ago ", "\t");
                list += vTitle + vFull + "\n";
            } else {
                list += vTitle + "\n";
            }
        });
        $("body").append('<div id="tablistDisplayContainer" style="position: fixed; z-index: 9999; top: 5%; right: 5%; background-color: gray; padding: 10px; border-radius: 5px;"><button id="closeTheListThing">Close</button>&nbsp;&nbsp;&nbsp;<button id="selectAllAndCopy">Select all and copy</button><br><br><textarea id="tabPlayList" style="width: 50vw; height: 80vh; max-width: 90vw; max-height: 90vh;">'+list+'</textarea></div>');
        $("#listBuildMessage").remove();
        $("#closeTheListThing").click(function(){
            $("#tablistDisplayContainer").remove();
            listCreationAllowed = true;
        });
        $("#selectAllAndCopy").click(function(){
            document.getElementById("tabPlayList").select();
            document.execCommand("copy");
        });
    }

})();