您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
When you click on "+ Add to" (for adding a new video to a playlist) YouTube displays the playlists -by default- in a strange order: beginning with the one selected last. This script arranges your playlists alphabetically, making it easier for you to find the one you are looking for.
// ==UserScript== // @name Youtube Playlists Sorted Alphabetically // @namespace http://www.pbworks.net // @description When you click on "+ Add to" (for adding a new video to a playlist) YouTube displays the playlists -by default- in a strange order: beginning with the one selected last. This script arranges your playlists alphabetically, making it easier for you to find the one you are looking for. // @author Paolo Brocco // @homepage http://www.pbworks.net // @copyright 2012+, Paolo Brocco (http://www.pbworks.net) // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html // @version 2015.07.09 // @include http://www.youtube.com/* // @include https://www.youtube.com/* // @uso:script 123272 // ==/UserScript== /*** DOCUMENT READY: triggers (buttons) with added calls to this script functions ***/ document.addEventListener('DOMContentLoaded', function() { //here begins everything //This is the "Add to" button document.querySelector('#watch8-secondary-actions > div.yt-uix-menu.yt-uix-videoactionmenu > button').setAttribute('onclick', ';initSortLists();return false;'); }, false); /*** INIT FUNCTIONS: logic to decide when to activate the sorting ***/ unsafeWindow.initSortLists = function(){ //this function checks if the menu is ready (ready I mean: if the ul list has children (li) (youtube populates the list via ajax, then shows it) ): //if ready: call sortLists() //else: wait for 100 ms var container = document.querySelector('#addto-list-panel > div.playlists.yt-uix-scroller > ul'); if(typeof container !== 'undefined' && container != null) { //unsafeWindow.console.log('the menu is ready!'); if (!container.classList.contains('sorted')) { var lists = container.querySelectorAll('li'); if (lists.length > 0) { //unsafeWindow.console.log('playlists arrived, sorting them.'); unsafeWindow.sortLists(); } else { setTimeout('initSortLists()', 100); } } else { //unsafeWindow.console.log('playlists already sorted ;)'); } return false; } else { //unsafeWindow.console.log('waiting 100 ms...'); setTimeout('initSortLists()', 100); } } /*** SORTING FUNCTIONS ***/ unsafeWindow.sortLists = function(){ //this function does what we want, meaning the sorting of the playlists, alphabetically //unsafeWindow.console.log('doing the magic!'); var oldList = document.querySelector('#addto-list-panel > div.playlists.yt-uix-scroller > ul'); var listParent = oldList.parentNode; var plists = []; var lTitle, lElement, newList; var lists = document.querySelectorAll('#addto-list-panel > div.playlists.yt-uix-scroller > ul li'); [].forEach.call(lists, function(li) { unsafeWindow.console.log('a list'); lTitle = li.getAttribute('data-item-name'); lElement = li; plists.push(listData(lTitle, li)); }); plists.sort(SortByTitle); newList = document.createElement('ul'); newList.setAttribute('role', 'menu'); newList.setAttribute('tabindex', '0'); newList.setAttribute('class', 'yt-uix-kbd-nav yt-uix-kbd-nav-list sorted'); for (p in plists) { newList.appendChild(plists[p].lElement); } listParent.replaceChild(newList, oldList); } /*** HELPERS ***/ //This will sort an array function SortByTitle(a, b){ var aName = a.title.toLowerCase(); var bName = b.title.toLowerCase(); return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); } //function to populate lists data array function listData(title, lElement) { return { title: title, lElement: lElement } }