// ==UserScript== // @name Export Youtube Playlist in tab delimited text // @description Creates the current playlist as tab delimited text to be easily copied // @author 1N07 & MK // @namespace max44 // @homepage https://greasyfork.org/en/users/309172-max44 // @match *://*.youtube.com/* // @match *://*.youtu.be/* // @icon https://cdn.icon-icons.com/icons2/1488/PNG/512/5295-youtube-i_102568.png // @version 1.0.5 // @license MIT // @require https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js // @downloadURL 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() { $("#exportTabTextList").remove(); //Remove previous button let buttonInsertInterval = setInterval(function() { if ($("#exportTabTextList").length == 0) { if ($("ytd-playlist-sidebar-primary-info-renderer.style-scope.ytd-playlist-sidebar-renderer > ytd-playlist-thumbnail").length > 0) { //Old design $("ytd-playlist-sidebar-primary-info-renderer.style-scope.ytd-playlist-sidebar-renderer > ytd-playlist-thumbnail").parent().after(""); $("#exportTabTextList").click(ScrollUntilFullListVisible); } else if ($("div.metadata-wrapper.ytd-playlist-header-renderer > div.play-menu.ytd-playlist-header-renderer > ytd-button-renderer").length > 0) { //New design $("div.metadata-wrapper.ytd-playlist-header-renderer > div.play-menu.ytd-playlist-header-renderer > ytd-button-renderer").parent().after(""); $("#exportTabTextList").click(ScrollUntilFullListVisible); } //Check whether unavailable videos are hidden or not //var i; //var strAux = ""; //var flgHidden = false; //var myNodeList = document.querySelectorAll("#text"); //for (i = 0; i < myNodeList.length; i++) { // if (myNodeList[i].className.indexOf("style-scope ytd-alert-with-button-renderer") > -1) { // strAux = myNodeList[i].innerText; // strAux = strAux.trim(); // strAux = strAux.toLowerCase(); // if (strAux.indexOf("unavailable videos are hidden") > -1) { // flgHidden = true; // break; // } // } //} //if (flgHidden) { // $("#exportTabTextList").click(ScrollAsPossible); //Unavailable videos are hidden //} else { //$("#exportTabTextList").click(ScrollUntilFullListVisible); //} //clearInterval(buttonInsertInterval); - Do not clear interval in order to add button back if playlist is rebuilt } }, 100); } function ScrollUntilFullListVisible() { if (!listCreationAllowed) return; listCreationAllowed = false; $("#exportTabTextList:not(.yt-spec-button-shape-next--size-m)").after(`
Getting full list, please wait...
`); $("#exportTabTextList.yt-spec-button-shape-next--size-m").after(`Getting full list, please wait...
`); 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 ($("ytd-continuation-item-renderer.ytd-playlist-video-list-renderer").length > 0) //if ($("yt-formatted-string#index.ytd-playlist-video-renderer").last().text() != numOfVideosInPlaylist) $(document).scrollTop($(document).height()); else { BuildAndDisplayList(); clearInterval(scrollInterval); } }, 100); } /*function ScrollAsPossible() { //If unavailable videos are hidden if (!listCreationAllowed) return; listCreationAllowed = false; $("#exportTabTextList").after(`Getting full list, please wait...
`); $(document).scrollTop($(document).height()); let scrollInterval2 = setInterval(function(){ if (CheckSpinner()) { $(document).scrollTop($(document).height()); } else { BuildAndDisplayList(); clearInterval(scrollInterval2); } }, 500); } function CheckSpinner() { //True if playlist is still loading var i; var myNodeList = document.querySelectorAll("#spinner"); for (i = 0; i < myNodeList.length; i++) { if (myNodeList[i].className.indexOf("style-scope ytd-continuation-item-renderer") > -1) return true; } return false; }*/ function BuildAndDisplayList() { let list = "