导出当前页网易云音乐列表
当前为
// ==UserScript==
// @name 网易云音乐列表导出
// @namespace undefined
// @version 0.0.1
// @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
// ==/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 ;
doc.addEventListener('DOMSubtreeModified', function () {
//检测列表
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;
}
//创建按钮
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(/<div class="soil">[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&");
var artist = cells[3].getElementsByTagName('span')[0].getAttribute('title').replace(/<div class="soil">[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&");
var album = cells[4].getElementsByTagName('a')[0].getAttribute('title').replace(/<div class="soil">[\s\S\n]*?<\/div>/g, "").replace(/ /g, " ").replace(/&/g, "&");
var spliChar = spli.value;
if(!spliChar.trim()) 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 '+';
};
});
})();