// ==UserScript== // @name 网易云音乐歌曲封面下载 // @namespace 网易云音乐歌曲封面下载 // @version 0.2 // @description 歌曲封面下载,优化网易云音乐歌曲歌词下载 // @author opentdoor // @match http://music.163.com/* // @grant GM_xmlhttpRequest // @connect * // @downloadURL none // ==/UserScript== (function(root) { 'use strict'; function Downloader() { // request function FileRequest(url, progress, callback) { var req = GM_xmlhttpRequest({ method: 'GET', url: url, onprogress: function (res) { if (progress) progress(res); }, overrideMimeType: "text/plan;charset=x-user-defined", onreadystatechange: function (res) { if (res.readyState == 4) { if (res.status == 200) { var str = res.response; var ta1 = []; for (var i = 0; i < str.length; i++) { ta1[i] = str.charCodeAt(i) & 0x00ff; } var ua8 = new Uint8Array(ta1); var blob = new Blob([ua8]); callback(blob, res.status); } else { callback(null, res.status); } } } }); }; //save file function SaveFile(blob, filename) { if (root.navigator.msSaveBlob) { root.navigator.msSaveBlob(blob, filename); } else { var anchor = root.document.createElement('a'); var url = root.URL.createObjectURL(blob); anchor.download = filename; anchor.href = url; var evt = root.document.createEvent("MouseEvents"); evt.initEvent("click", true, true); anchor.dispatchEvent(evt); root.URL.revokeObjectURL(url); } } //interface function FileDownload(url, filename, downloading, success, error) { FileRequest(url, downloading, function (blob, status) { if (status == 200) { SaveFile(blob, filename); if (typeof success == 'function') success(); } else { if (typeof error == 'function') error(status); } }); } this.FileDownload = FileDownload; var anthorEvents = { onprogress: function (res) { console.log(res); if (res.lengthComputable) { this.anchor.innerHTML = `下载:${(res.loaded*100 / res.total).toFixed(2)}%`; } else { this.anchor.innerHTML = "下载:" + anthorEvents.calcLength(res.loaded); } }, calcLength: function (b) { b = Number(b) / 1024; if (b < 1024) { return b.toFixed(1) + "KB"; } b = b / 1024; if (b < 1024) { return b.toFixed(2) + "MB"; } b = b / 1024; return b.toFixed(3) + "GB"; }, onsuccess: function () { this.anchor.innerHTML = this.Html; this.doing = false; }, onerror: function () { this.anchor.innerHTML = "下载失败"; this.handler = setTimeout(function (t) { t.anchor.innerHTML = t.Html; t.doing = false; }, 2000, this); }, onAnthorClick: function (e) { e = e || event; var a = this.anchor; var ex = /([\w\s]+)(\.\w)(\?.*)?$/i.exec(a.href || ""); var name = a.download || a.title; if (ex) { if (!name && ex.length > 1) name = ex[1]; if (name && name.indexOf('.') == -1 && ex.length > 2) name += ex[2]; } if (!name || !a.href) return; e.preventDefault(); if (this.doing) return; this.doing = true; FileDownload(a.href, name, anthorEvents.onprogress.bind(this), anthorEvents.onsuccess.bind(this), anthorEvents.onerror.bind(this)); } }; //interface function BindAnthor(a) { var env = { Html: a.innerHTML, anchor: a }; a.addEventListener('click', anthorEvents.onAnthorClick.bind(env), true); } this.BindAnthor = BindAnthor; } //main var ggx=function(){ var ww=document.getElementById("g_iframe").contentWindow; var do2=ww.document; var aa=do2.querySelector("a[data-action='outchain']"); var info=do2.querySelectorAll("div.cnt .s-fc4 .s-fc7"); console.log(info); var name=do2.querySelector(".f-ff2")&&info&&info.length>1?do2.querySelector(".f-ff2").innerText+"-"+info[0].innerText+"-"+info[1].innerText:document.title.replace(/\-.*$/i,''); var dl=new Downloader(); if(aa){ var a=do2.createElement('a'); a.href= do2.querySelector(".j-img").dataset["src"]; a.download=name+'.jpg'; a.innerHTML='封面下载'; a.classList.add("des"); a.classList.add("s-fc7"); var br=do2.createElement('br'); aa.parentElement.appendChild(br); aa.parentElement.appendChild(a); dl.BindAnthor(a); }else{ return; } //优化歌曲歌词下载 do2.querySelector("div.cnt").addEventListener('mouseenter',function(e){ if(e.target.tagName=="A"&&e.target.target=='_blank'&&!e.target.nnbk) { e.target.nnbk=true; if(/\.mp3(\?.*)?$/i.test(e.target.href)) { e.target.download=name+".mp3"; dl.BindAnthor(e.target); } if(/^data\:text\/plain/i.test(e.target.href)) e.target.download=name+".lrc"; } },true); }; if(document.getElementById("g_iframe")) document.getElementById("g_iframe").addEventListener('load',ggx,true); })(window);