Spotify Playlist Sorter

Sorts Spotify Web Player playlists by track name.

  1. // ==UserScript==
  2. // @name Spotify Playlist Sorter
  3. // @namespace https://gist.github.com/GamrCorps/
  4. // @version 1.6.1
  5. // @description Sorts Spotify Web Player playlists by track name.
  6. // @author ZekNikZ
  7. // @match https://open.spotify.com/*
  8. // @grant none
  9. // ==/UserScript==
  10. var zkz_swp_d = false;
  11.  
  12. function zkz_srt() {
  13. if (!zkz_swp_d) {
  14. var btn1 = document.createElement('BUTTON');
  15. btn1.appendChild(document.createTextNode('N'));
  16. btn1.setAttribute("style", "margin-left: .5em;");
  17. btn1.onclick = zkz_srt;
  18. document.getElementsByClassName('now-playing-bar__right')[0].appendChild(btn1);
  19. var btn3 = document.createElement('BUTTON');
  20. btn3.appendChild(document.createTextNode('A'));
  21. btn3.setAttribute("style", "margin-left: .5em;");
  22. btn3.onclick = zkz_srt_art;
  23. document.getElementsByClassName('now-playing-bar__right')[0].appendChild(btn3);
  24. var btn2 = document.createElement('BUTTON');
  25. btn2.appendChild(document.createTextNode('#'));
  26. btn2.setAttribute("style", "margin-left: .5em;");
  27. btn2.onclick = zkz_srt_num;
  28. document.getElementsByClassName('now-playing-bar__right')[0].appendChild(btn2);
  29. zkz_swp_d = true;
  30. }
  31. console.log('SORTING PLAYLIST BY NAME...');
  32.  
  33. var list = document.getElementsByClassName('tracklist');
  34.  
  35. var items = list[0].childNodes;
  36. var itemsArr = [];
  37. for (var i in items) {
  38. if (items[i].nodeType == 1) { // get rid of the whitespace text nodes
  39. itemsArr.push(items[i]);
  40. }
  41. }
  42.  
  43. itemsArr.sort(function(a, b) {
  44. var _a = a.getElementsByClassName('track-name')[0].innerHTML;
  45. var _b = b.getElementsByClassName('track-name')[0].innerHTML;
  46. return _a == _b ? 0 : (_a > _b ? 1 : -1);
  47. });
  48.  
  49. for (i = 0; i < itemsArr.length; ++i) {
  50. list[0].appendChild(itemsArr[i]);
  51. }
  52. }
  53.  
  54. function zkz_srt_num() {
  55. console.log('SORTING PLAYLIST BY NUMBER...');
  56.  
  57. var list = document.getElementsByClassName('tracklist');
  58.  
  59. var items = list[0].childNodes;
  60. var itemsArr = [];
  61. for (var i in items) {
  62. if (items[i].nodeType == 1) { // get rid of the whitespace text nodes
  63. itemsArr.push(items[i]);
  64. }
  65. }
  66.  
  67. itemsArr.sort(function(a, b) {
  68. var _a = parseFloat(a.getElementsByClassName('position top-align')[0].innerHTML);
  69. var _b = parseFloat(b.getElementsByClassName('position top-align')[0].innerHTML);
  70. return _a == _b ? 0 : (_a > _b ? 1 : -1);
  71. });
  72.  
  73. for (i = 0; i < itemsArr.length; ++i) {
  74. list[0].appendChild(itemsArr[i]);
  75. }
  76. }
  77.  
  78. function zkz_srt_art() {
  79. console.log('SORTING PLAYLIST BY ARTIST...');
  80.  
  81. var list = document.getElementsByClassName('tracklist');
  82.  
  83. var items = list[0].childNodes;
  84. var itemsArr = [];
  85. for (var i in items) {
  86. if (items[i].nodeType == 1) { // get rid of the whitespace text nodes
  87. itemsArr.push(items[i]);
  88. }
  89. }
  90.  
  91. itemsArr.sort(function(a, b) {
  92. var _a = a.getElementsByClassName('artists-album')[0].textContent;
  93. var _b = b.getElementsByClassName('artists-album')[0].textContent;
  94. return _a == _b ? 0 : (_a > _b ? 1 : -1);
  95. });
  96.  
  97. for (i = 0; i < itemsArr.length; ++i) {
  98. list[0].appendChild(itemsArr[i]);
  99. }
  100. }
  101.  
  102. (function() {
  103. 'use strict';
  104. window.onload = zkz_srt;
  105. })();