Playlists buttons V3

Adds Buttons to your favorite playlists.

当前为 2023-06-25 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Playlists buttons V3
  3. // @version 3
  4. // @description Adds Buttons to your favorite playlists.
  5. // @author Bliwi
  6. // @match https://soundcloud.com/*
  7. // @grant none
  8. // @run-at document-end
  9. // @noframes
  10. // @license MIT
  11. // @namespace https://greasyfork.org/users/943433
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16. //Load things
  17.  
  18. setTimeout(function welcome(){
  19. var root = document.documentElement;
  20. root.style.setProperty('--welcome', 'none');
  21. }, 100);
  22. var savedUrls = JSON.parse(localStorage.getItem('urls'));
  23. var savedNames = JSON.parse(localStorage.getItem('names'));
  24. let currentPage = location.href;
  25. setTimeout(playlistsLoad, 500);
  26. setInterval(function()
  27. {
  28. if(!document.querySelector('.pinbutton')){
  29. if(window.location.href.indexOf("com/you/sets") != -1){
  30. pinToSidebar();
  31. }
  32. };
  33. }, 500);
  34. //console.log(savedNames);
  35. //add new playlist button
  36. function pinToSidebar() {
  37. //Pin button
  38.  
  39. let button = document.createElement('a');
  40. let header = document.querySelector('.collectionNav');
  41. button.className = 'pinbutton';
  42. button.innerHTML = '📌';
  43. header.insertBefore(button, header.children[2]);
  44.  
  45. //Clear
  46.  
  47. setTimeout(function clear(){
  48. let button = document.createElement('a');
  49. let header = document.querySelector('.collectionNav');
  50. button.className = 'pinbutton';
  51. button.innerHTML = '🗑️';
  52. header.insertBefore(button, header.children[2]);
  53. button.onclick = function (){
  54. if (confirm("Are you sure you want to remove all the pinned playlists?")){
  55. var savedUrls = [];
  56. var savedNames = [];
  57. localStorage.setItem('names', JSON.stringify(savedNames));
  58. localStorage.setItem('urls', JSON.stringify(savedUrls));
  59. location.reload();}
  60. }
  61. },10)
  62.  
  63. //Plus Button
  64.  
  65. setTimeout(
  66. function plus() {
  67. let button = document.createElement('a');
  68. let header = document.querySelector('.collectionNav');
  69. button.className = 'pinbutton';
  70. button.innerHTML = '➕';
  71. header.insertBefore(button, header.children[2]);
  72. button.onclick = function (){
  73. var newName = prompt('Enter the name of the playlist:');
  74. if (newName) {
  75. var newURL = prompt('Enter the URL for the playlist:');
  76. if (newURL) {
  77.  
  78. var modifiedUrl = newURL.replace('https://soundcloud.com', '').replace('http://soundcloud.com', '');
  79. savedUrls.push(modifiedUrl);
  80. savedNames.push(newName);
  81. console.log(savedNames);
  82. console.log(savedUrls);
  83.  
  84. localStorage.setItem('names', JSON.stringify(savedNames));
  85. localStorage.setItem('urls', JSON.stringify(savedUrls));
  86. if (confirm("Done pinning,Soundfy will now reload to take effect.")){location.reload();}
  87. }
  88. }
  89. }
  90. },
  91. 10);
  92.  
  93. //Extract the playlists
  94. button.onclick = function (){
  95. button.innerHTML = 'Extracting the playlists';
  96. setTimeout(function done(){
  97. if (confirm("Done pinning,Soundfy will now reload to take effect.")){location.reload();}
  98. },1000)
  99. // Query the elements on the page
  100. var elements = document.querySelectorAll('a.sc-link-primary.sc-link-dark.sc-type-light.sc-text-secondary.playableTile__mainHeading.playableTile__heading.audibleTile__audibleHeading.sc-truncate.sc-font-light.sc-text-h4');
  101. // Store the URLs in variables
  102. //
  103. var urls = [];
  104. var names = [];
  105. for (var i = 0; i < elements.length; i++) {
  106. let button = document.createElement('a');
  107. let header = document.querySelector('.collectionSection__top');
  108. header.style.display = "block !important";
  109. button.innerHTML = modnames3;
  110. header.insertBefore(button, header.children[2]);
  111. button.className = 'playlist-name';
  112. var url = elements[i].href;
  113. var modifiedUrl = url.replace('https://soundcloud.com', '').replace('http://soundcloud.com', '');
  114. var modnames = url.replace('https://soundcloud.com/', '').replace('http://soundcloud.com/', '');
  115. var modnames2 = modnames.replace('-', ' ').replace('-', ' ');
  116. var modnames3 = modnames2.replace('/sets/', ' - ').replace('/sets/', ' - ');
  117. names.push(modnames3);
  118. urls.push(modifiedUrl);
  119. }
  120. console.log(urls);
  121. console.log(names);
  122. //Save the Urls and names to the local storage
  123. //
  124. localStorage.setItem('urls', JSON.stringify(urls));
  125. localStorage.setItem('names', JSON.stringify(names));
  126.  
  127. };
  128.  
  129. }
  130.  
  131. //functions
  132. //Load the playlists
  133. function playlistsLoad() {
  134. for (var i = 0; i < savedUrls.length; i++) {
  135. var url = savedUrls[i];
  136. var name = savedNames[i];
  137. insertButton(name,url);
  138. }
  139. }
  140. //Insert the buttons
  141. function insertButton(playlistname,playlistlink) {
  142. let playlist = document.createElement('a');
  143. let header = document.querySelector('.header__middle');
  144. const i = savedNames.indexOf(playlistname);
  145. playlist.id = i;
  146. playlist.innerHTML = playlistname;
  147. playlist.className = 'playlist-button';
  148. playlist.href = playlistlink;
  149.  
  150. //Delete or rename
  151. playlist.ondblclick = function() {
  152. var newName = prompt('Enter a new name(del to delete):');
  153. if (newName === 'del') {
  154. //delete savedNames[i];
  155. savedNames.splice(i, 1);
  156. savedUrls.splice(i, 1);
  157. playlist.className = '';
  158. playlist.innerHTML = '';
  159. playlist.href = '';
  160. console.log(savedNames);
  161. localStorage.setItem('names', JSON.stringify(savedNames));
  162. localStorage.setItem('urls', JSON.stringify(savedUrls));
  163. } else if (newName) {
  164. // Rename
  165. playlist.innerHTML = newName;
  166. savedNames[i] = newName;
  167. console.log(savedNames);
  168. localStorage.setItem('names', JSON.stringify(savedNames));
  169. }
  170. }
  171. if (header) {
  172. header.insertBefore(playlist, header.children[2]);
  173.  
  174. } else {setTimeout(playlistsLoad, 1000);}
  175. }
  176. })();