Netease Music Download

网易云音乐下载地址

  1. // ==UserScript==
  2. // @name Netease Music Download
  3. // @namespace qixinglu.com
  4. // @description 网易云音乐下载地址
  5. // @include http://music.163.com/*
  6. // @grant none
  7. // @version 0.0.1.20140517140352
  8. // ==/UserScript==
  9.  
  10. var api = {
  11.  
  12. detailUrl: function(songIds) {
  13. var tpl = 'http://music.163.com/api/song/detail?ids=[${songIds}]';
  14. return tpl.replace('${songIds}', songIds.join(','));
  15. },
  16.  
  17. detail: function(songIds, callback) {
  18. var req = new XMLHttpRequest();
  19. req.open('GET', this.detailUrl(songIds), true);
  20. req.onload = function() {
  21. callback(JSON.parse(this.responseText));
  22. };
  23. req.send();
  24. },
  25.  
  26. mediaUrl: function(songId) {
  27. return 'http://music.163.com/api/song/media?id=' + songId;
  28. },
  29.  
  30. media: function(songId, callback) {
  31. var req = new XMLHttpRequest();
  32. req.open('GET', this.mediaUrl(songId), true);
  33. req.onload = function() {
  34. callback(JSON.parse(this.responseText));
  35. };
  36. req.send();
  37. },
  38.  
  39. };
  40.  
  41. var innerFrame = document.querySelector('iframe');
  42.  
  43. var pages = [
  44. {
  45. url: 'http://music.163.com/#/m/song?id=',
  46. handler: function() {
  47. var songId = location.href.match(/id=([0-9]+)/)[1];
  48. var downloadLine = this.createDownloadLine(songId);
  49.  
  50. var innerFrameDoc = innerFrame.contentWindow.document;
  51. var albumNode = innerFrameDoc.querySelectorAll('p.des.s-fc4')[1];
  52. var parentNode = albumNode.parentNode;
  53. parentNode.insertBefore(downloadLine, albumNode.nextElementSibling);
  54. },
  55. createDownloadLine: function(songId) {
  56. var disableStyle = function(link) {
  57. link.text += '(无)';
  58. link.style.color = 'gray';
  59. link.style.textDecoration = 'none';
  60. link.style.cursor = 'auto';
  61. };
  62.  
  63. var mp3Link = this.createLink('歌曲');
  64. var lyricLink = this.createLink('歌词');
  65.  
  66. api.detail([songId], function(result) {
  67. var song = result.songs[0];
  68. mp3Link.href = song.mp3Url;
  69. });
  70. api.media(songId, function(result) {
  71. if (result.lyric) {
  72. lyricLink.href = 'data:text/plain;charset=utf-8,' +
  73. encodeURIComponent(result.lyric);
  74. } else {
  75. disableStyle(lyricLink);
  76. }
  77. });
  78.  
  79. var container = this.createLineContainer('下载');
  80. container.appendChild(mp3Link);
  81. container.appendChild(lyricLink);
  82. return container;
  83. },
  84. createLink: function(label) {
  85. var link = document.createElement('a');
  86. link.innerHTML = label;
  87. link.className = 's-fc7';
  88. link.style.marginRight = '10px';
  89. link.href = 'javascript:void(0);';
  90. return link;
  91. },
  92. createLineContainer: function(label) {
  93. var container = document.createElement('p');
  94. container.className = 'desc s-fc4';
  95. container.innerHTML = label + ':';
  96. container.style.margin = '10px 0';
  97. return container;
  98. },
  99. },
  100. ]
  101.  
  102. if (innerFrame) {
  103. innerFrame.addEventListener('load', function() {
  104. var i, page;
  105. for (i = 0; i < pages.length; i += 1) {
  106. var page = pages[i];
  107. if (location.href.indexOf(page.url) == 0) {
  108. page.handler();
  109. }
  110. }
  111. });
  112. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址