// ==UserScript== // @name 网易云音乐列表导出 // @namespace undefined // @version 0.0.2 // @description 导出当前页网易云音乐列表为文本 // @author allen smith // @match *://music.163.com/* // @require https://cdn.bootcss.com/clipboard.js/1.7.1/clipboard.js // @run-at document-end // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 检测页面 var htm = document.getElementsByClassName('f-oh'); if(htm.length === 0){ return; } // 检测文档变动 var doc = document.getElementById('g_mymusic'); var _body = document.body; var clipboard, btn, spli, interId, waitTimeoutId, wait ; doc.addEventListener('DOMSubtreeModified', function () { //查找列表动画 wait = document.getElementById('wait-animation'); if(wait) _body.removeChild(wait); wait = document.createElement("span"); wait.id = 'wait-animation'; wait.setAttribute('style', 'display:inline-block;position:absolute;right:50px;top:100px;padding:3px 5px;border:1px solid lightgray;background-color:white;color:black;border-radius:5px;font-size:14px;'); _body.appendChild(wait); wait.innerHTML = '导出:没有合适的列表'; //检测列表 var list = document.getElementsByClassName('m-table')[0]; if (!list) { btn = document.getElementById('export-btn'); spli = document.getElementById('export-spli'); if(btn) _body.removeChild(btn); if(spli) _body.removeChild(spli); return; } _body.removeChild(wait); //创建按钮 btn = null; spli = null; btn = document.getElementById('export-btn'); spli = document.getElementById('export-spli'); if (!spli) { spli = document.createElement("input"); spli.id = 'export-spli'; spli.className = 'export-spli'; spli.setAttribute('placeholder','输入分割符,默认为 --'); spli.setAttribute('style', 'display:inline-block;position:absolute;right:50px;top:100px;padding:3px 5px;border:1px solid lightgray;background-color:white;color:black;border-radius:5px;font-size:14px;'); _body.appendChild(spli); } if (!btn) { btn = document.createElement("button"); btn.id = 'export-btn'; btn.className = 'export-btn'; btn.innerText = '导出列表'; btn.setAttribute('style', 'display:inline-block;position:absolute;right:50px;top:130px;padding:3px 5px;border:1px solid lightgray;background-color:white;color:black;border-radius:5px;font-size:14px;'); _body.appendChild(btn); } //创建剪贴板 if (clipboard) clipboard.destroy(); clipboard = new Clipboard('.export-btn', { text: function (trigger) { //导出列表 btn.innerText = '正在导出 ...'; var result = ''; var listBody = list.getElementsByTagName('tbody')[0]; var rows = listBody.getElementsByTagName('tr'); for (var i = 0; i < rows.length; i++) { var ele = rows[i]; var cells = ele.getElementsByTagName('td'); var name = cells[1].getElementsByTagName('b')[0].getAttribute('title').replace(/
[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&"); var artist = cells[3].getElementsByTagName('span')[0].getAttribute('title').replace(/
[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&"); var album = cells[4].getElementsByTagName('a')[0].getAttribute('title').replace(/
[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&"); var spliChar = spli.value; if(!spliChar) spliChar = ' -- '; result += name + spliChar + artist + spliChar + album + '\r\n'; } //提示动画 btn.innerText = '已复制到剪贴板 ='; var count = 6; clearInterval(interId); interId = setInterval(function () { count--; if (count > 0) btn.innerText = '已复制到剪贴板 ' + waitAnimationChar(count); else{ btn.innerText = '导出列表'; clearInterval(interId); } }, 300); //输出到控制台 console.log(result); //输出到剪贴板 trigger.setAttribute('aria-label', result); return trigger.getAttribute('aria-label'); } }); }); //字符动画 var waitAnimationChar = function(n){ var temp = n % 3; if(temp === 0) return '#'; else if(temp == 1) return '$'; else if(temp == 2) return '+'; }; })();