SoundCloud Downloader using local copy of youtube-dl

Download songs from SoundCloud using youtube-dl

当前为 2020-11-12 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name SoundCloud Downloader using local copy of youtube-dl
  3. // @namespace fke9fgjew89gjwe89
  4. // @version 1
  5. // @description Download songs from SoundCloud using youtube-dl
  6. // @author https://greasyfork.org/en/users/432346-fke9fgjew89gjwe89
  7. // @icon https://a-v2.sndcdn.com/assets/images/sc-icons/ios.png
  8. // @include /^https:\/\/soundcloud\.com/.*$/
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. "use strict";
  14.  
  15. var head = document.getElementsByTagName('head')[0];
  16. var style = document.createElement('style');
  17. var css = '.sc-button-directdl{text-indent:19px}.sc-button-directdl::before{background-size:16px 16px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UmVjdGFuZ2xlIDMxPC90aXRsZT48cGF0aCBkPSJNMyAxMXYyaDEwdi0ySDN6bTAtN2gxMGwtNSA2LTUtNnptMy0ydjJoNFYySDZ6IiBmaWxsPSIjMjIyIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);content:"";display:block;position:absolute;background-repeat:no-repeat;background-position:center center;width:20px;height:20px;top:0;bottom:0;margin:auto 0;left:4px}';
  18. style.setAttribute('type', 'text/css');
  19. if (style.styleSheet) {
  20. style.styleSheet.cssText = css;
  21. } else {
  22. style.appendChild(document.createTextNode(css));
  23. }
  24. head.appendChild(style);
  25.  
  26. String.prototype.mapReplace = function(map) {
  27. var regex = [];
  28. for (var key in map)
  29. regex.push(key.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
  30. return this.replace(new RegExp(regex.join("|"), "g"), function(word) {
  31. return map[word];
  32. });
  33. };
  34. var last_sound_title = "1";
  35. setInterval(function() {
  36. var sound_title = document
  37. .getElementsByClassName("soundTitle__title")[0]
  38. .children[0].innerText.mapReplace({
  39. "&": "&",
  40. "<": "&lt;",
  41. ">": "&gt;",
  42. "'": "&#39;",
  43. "/": "&#x2F;",
  44. "`": "&#x60;",
  45. "=": "&#x3D;",
  46. '"': "&quot;"
  47. });
  48.  
  49. if (last_sound_title !== sound_title) {
  50. last_sound_title = sound_title;
  51. var button_list = document.getElementsByClassName("sc-button-group sc-button-group-medium")[0];
  52.  
  53. var directdl = '<a href="ytdl://' + window.location + '" class="sc-button-directdl sc-button sc-button-medium sc-button-responsive" tabindex="0" aria-haspopup="true" role="button" title="Direct download" aria-label="Direct download">Direct download</a>';
  54.  
  55. button_list.insertAdjacentHTML('beforeend', directdl);
  56.  
  57. }
  58. if (document.getElementsByClassName("sound streamContext playing")[0] && !document.getElementsByClassName("sound streamContext playing")[0].querySelector(".sc-button-directdl")) {
  59. var stuff = document.getElementsByClassName("sound streamContext playing")[0];
  60. var linksr = stuff.querySelector(".soundTitle__title.sc-link-dark").href;
  61. console.log(linksr);
  62. var button_list = stuff.querySelector(".sc-button-group.sc-button-group-small");
  63.  
  64. var directdl = '<a href="ytdl://' + linksr + '" class="sc-button-directdl sc-button sc-button-small sc-button-responsive" tabindex="0" aria-haspopup="true" role="button" title="Direct download" aria-label="Direct download">Direct download</a>';
  65.  
  66. button_list.insertAdjacentHTML('beforeend', directdl);
  67.  
  68. var divs = document.getElementsByClassName("sc-button-directdl");
  69. var lastChild = divs[divs.length - 1];
  70. }
  71. }, 3 * 1000);
  72. })();