// ==UserScript==
// @name 酷狗在线听/下载/vip/2024
// @namespace http://tampermonkey.net/
// @version 2.0
// @icon https://i0.hdslb.com/bfs/album/0d58ba3462659867aa46633d4a4791e93160ffb5.jpg
// @description 无需登录在线听你想听的音乐
// @author 今天是充满希望的一天
// @match *://www.kugou.com/mixsong/*
// @match *://www.kugou.com/song/*
// @grant GM_xmlhttpRequest
// @grant GM_download
// @grant GM_addStyle
// @grant GM_getResourceText
// @require https://code.jquery.com/jquery-2.1.4.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js
// @require https://unpkg.com/nprogress@0.2.0/nprogress.js
// @resource css https://cdn.bootcdn.net/ajax/libs/jquery-confirm/3.3.4/jquery-confirm.min.css
// @connect 1.94.43.52
// @connect m.kugou.com
// ==/UserScript==
console.log("==================================插件启动成功==================================")
// 2022-12-20新增批量下载,以及部分功能的优化
let loc = location.href;
var mp3_Name = "";
var download_hash = "";
var download_hash_list = "0";
var mp3_ecid = "";
var mp3_ecid_download = "";
if (loc.indexOf("www.kugou.com/song/") > 0 || loc.indexOf("www.kugou.com/mixsong/") > 0) {
// 定义变量
let mp3_Hash = "";
let sq_hash = "";
let g_hash = "";
let albumid = "";
// 当前播放的最高音质url
let mp3_Url = "";
// 删除加载客户端弹窗
let close_div = document.getElementsByClassName("ui-dialog-grid")[0];
if (close_div != undefined){
close_div.style.display = "none"
}
// 添加按钮选择音质
let down_load_div = document.getElementsByClassName("btnArea2 clearfix")[0];
down_load_div.innerHTML = "";
/**
// 超高音质
let button_ws = document.createElement("button");
button_ws.id = "down_load_ws";
button_ws.textContent = "下载超高音质(需设置flac为白名单)";
button_ws.style.width = "230px";
button_ws.style.height = "50px";
button_ws.style.color = "#FFFFFF";
button_ws.style.cursor = "pointer";
button_ws.style.background = "#000000";
down_load_div.appendChild(button_ws);
$('#down_load_ws').hover(function () {
$(this).css('background', '#232020')
$(this).css('color', '#BCBBBB')
}, function () {
$(this).css('background', '#000000')
$(this).css('color', '#FFFFFF')
})
// 高音质
let button_g = document.createElement("button");
button_g.id = "button_g";
button_g.textContent = "下载高音质";
button_g.style.width = "230px";
button_g.style.height = "50px";
button_g.style.color = "#FFFFFF";
button_g.style.cursor = "pointer";
button_g.style.background = "#000000";
button_g.style.margin = "3px 0px";
down_load_div.appendChild(button_g);
$('#button_g').hover(function () {
$(this).css('background', '#232020')
$(this).css('color', '#BCBBBB')
}, function () {
$(this).css('background', '#000000')
$(this).css('color', '#FFFFFF')
})
*/
// 普通音质
let button_mp3 = document.createElement("button");
button_mp3.id = "button_mp3";
button_mp3.textContent = "下载普通音质";
button_mp3.style.width = "230px";
button_mp3.style.height = "50px";
button_mp3.style.color = "#FFFFFF";
button_mp3.style.cursor = "pointer";
button_mp3.style.background = "#000000";
down_load_div.appendChild(button_mp3);
$('#button_mp3').hover(function () {
$(this).css('background', '#232020')
$(this).css('color', '#BCBBBB')
}, function () {
$(this).css('background', '#000000')
$(this).css('color', '#FFFFFF')
})
// 点击下载按钮 超高音质
// button_ws.onclick = function () {
// if (sq_hash == download_hash) {
// alert(mp3_Name + " 已在下载中!")
// } else {
// download_hash = sq_hash;
// downloadBySrc(mp3_Url,0);
// }
// };
// // 点击下载按钮 高音质
// button_g.onclick = function () {
// if (g_hash == download_hash) {
// alert(mp3_Name + " 已在下载中!");
// } else {
// download_hash = g_hash;
// getMp3UrlSrc(g_hash, albumid, 0);
// }
// };
// 点击下载按钮 普通音质
button_mp3.onclick = function () {
// if (mp3_Hash == download_hash) {
// alert(mp3_Name + " 已在下载中!");
// } else {
// download_hash = mp3_Hash;
// getMp3UrlSrc(mp3_Hash, albumid, 0);
// }
if (mp3_ecid == mp3_ecid_download) {
alert(mp3_Name + " 已在下载中!");
} else {
mp3_ecid_download = mp3_ecid;
getMp3UrlSrcVip();
}
// getMp3UrlSrc(mp3_Hash, albumid, 0);
};
// // 点击下载按钮 超高音质
// document.getElementById('pb_download').onclick = function () {
// if (download_url == mp3_Url) {
// alert(mp3_Name + " 已在下载中!")
// } else {
// downloadBySrc(mp3_Url);
// setTimeout(function () {
// document.getElementsByClassName('ui-popup ui-popup-show ui-popup-focus')[0].style.display = "none"
// }, 50)
// }
// };
// 监听audio开始播放事件(事件在视频/音频(audio/video)开始播放时触发。)
document.getElementById('myAudio').addEventListener("play", function () {
let mp3_ecid_new = document.getElementById('myAudio').getAttribute("data-ecid");
if (mp3_ecid != mp3_ecid_new){
mp3_ecid = mp3_ecid_new;
/**
// 判断是否需要修改src属性
if (document.getElementById('myAudio').getAttribute("data-hash") != mp3_Hash) {
mp3_Hash = document.getElementById('myAudio').getAttribute("data-hash");
let play_hash = mp3_Hash;
let searchQualityUrl = 'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=' + play_hash;
// 查询音质
GM_xmlhttpRequest({
method: "get",
url: searchQualityUrl,
onload: function (r) {
let jsonTxt = r.responseText;
let json = JSON.parse(jsonTxt);
albumid = json.albumid.toString();
g_hash = json.extra['320hash'];
if (g_hash == '') {
button_g.style.display = 'none';
} else {
button_g.style.display = 'block';
play_hash = g_hash;
}
sq_hash = json.extra.sqhash;
if (sq_hash == '') {
button_ws.style.display = 'none';
} else {
button_ws.style.display = 'block';
play_hash = sq_hash;
}
// 访问第三方解析无损接口
let get_sq_url = "https://xxxxx.xxx/api/tampermonkey/url/byhash?hash=" + play_hash + "&albumid=" + albumid;
console.log(get_sq_url);
// get请求获取无损音质的信息
GM_xmlhttpRequest({
method: "get",
url: get_sq_url,
onload: function (r) {
let jsonTxt = r.responseText;
let json = JSON.parse(jsonTxt);
mp3_Url = json.data.play_url;
mp3_Name = json.data.audio_name;
document.getElementById('myAudio').src = mp3_Url;
//document.getElementById('openKugou').href = mp3_Url;
if (document.getElementById('myAudio').paused) {
document.getElementById('myAudio').play();
}
console.log(mp3_Name + mp3_Url.substr(mp3_Url.lastIndexOf(".")) + " 加载完成");
}
})
}
})
}
*/
// 访问第三方解析接口
let get_sq_url = "http://1.94.43.52:5001//url/newVip?ecid=" + mp3_ecid;
console.log(get_sq_url);
// get请求获取音乐的信息
GM_xmlhttpRequest({
method: "get",
url: get_sq_url,
onload: function (r) {
let jsonTxt = r.responseText;
let json = JSON.parse(jsonTxt);
mp3_Url = json.data.play_url;
mp3_Name = json.data.audio_name;
document.getElementById('myAudio').src = mp3_Url;
//document.getElementById('openKugou').href = mp3_Url;
if (document.getElementById('myAudio').paused) {
document.getElementById('myAudio').play();
}
console.log(mp3_Name + mp3_Url.substr(mp3_Url.lastIndexOf(".")) + " 加载完成");
}
})
}
})
// 直接用最暴力的方法,修改id
document.getElementById("bar").id = 'new_bar';
$("#new_bar").off("click").on("click", function(e) {
let new_pre = e.offsetX / $("#progress_middle").width();
document.getElementById('myAudio').currentTime = myAudio.duration * new_pre;
});
} else if (loc.indexOf("/yy/rank/") > 0 || loc.indexOf("/yy/html/rank.html") > 0) {
let download_div = document.getElementById("pc_temp_title");
document.getElementsByClassName("pc_temp_btn_s02 pc_temp_bicon_play")[0].style.marginTop = "0px";
$(".pc_rank_title .pc_temp_title").css("font-size", "12px");
let form = document.createElement("form");
let radio_sq = document.createElement("input");
radio_sq.type = "radio";
radio_sq.name = "choose_q";
radio_sq.value = "0";
radio_sq.style.marginLeft = "15px";
let radio_sq_label = document.createElement('label');
radio_sq_label.textContent = "超高音质";
radio_sq_label.id = "radio_sq_label";
radio_sq.style.cursor = "pointer";
radio_sq_label.style.cursor = "pointer";
let radio_g = document.createElement("input");
radio_g.type = "radio";
radio_g.name = "choose_q";
radio_g.value = "1";
radio_g.style.marginLeft = "15px";
let radio_g_label = document.createElement('label');
radio_g_label.textContent = "高音质";
radio_g_label.id = "radio_g_label";
radio_g.style.cursor = "pointer";
radio_g_label.style.cursor = "pointer";
let radio_d = document.createElement("input");
radio_d.type = "radio";
radio_d.name = "choose_q";
radio_d.value = "2";
radio_d.style.marginLeft = "15px";
radio_d.defaultChecked = true;
let radio_d_label = document.createElement('label');
radio_d_label.textContent = "标准音质";
radio_d_label.id = "radio_d_label";
radio_d.style.cursor = "pointer";
radio_d_label.style.cursor = "pointer";
form.style.display = "inline";
form.appendChild(radio_sq);
form.appendChild(radio_sq_label);
form.appendChild(radio_g);
form.appendChild(radio_g_label);
form.appendChild(radio_d);
form.appendChild(radio_d_label);
download_div.appendChild(form);
// 点击label,模拟点击对应的radio
$("#radio_sq_label").click(function () {
$('[name="choose_q"]').eq(0).trigger("click");
})
$("#radio_g_label").click(function () {
$('[name="choose_q"]').eq(1).trigger("click");
})
$("#radio_d_label").click(function () {
$('[name="choose_q"]').eq(2).trigger("click");
})
// 下载所选按钮
let download_button = document.createElement("button");
download_button.id = "download_select";
download_button.textContent = "下载所选音乐";
download_button.style.width = "100px";
download_button.style.height = "34px";
download_button.style.color = "#fff";
download_button.style.cursor = "pointer";
download_button.style.background = "#169af3";
download_button.style.marginLeft = "20px";
download_div.appendChild(download_button);
$('#download_select').hover(function () {
$(this).css('background', '#158fe1')
}, function () {
$(this).css('background', '#169af3')
})
$('#download_select').click(function () {
if (download_hash_list == "1") {
alert("正在下载中,请稍后,如长时间无反应,请刷新后重试!");
return;
}
download_hash_list = "1";
// 全选
if ($('.checkedAll').attr("class").indexOf("pc_temp_btn_checked") > 0) {
$.confirm({
title: '下载提示',
content: '你确定要下载所有选中的音乐吗?',
type: 'green',
icon: 'glyphicon glyphicon-question-sign',
buttons: {
ok: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
global.features.forEach(function (song, index) {
if ($('[name="choose_q"]:checked').val() == 0) {
// 使用同步方式
(async function () {
let sqhash = await getSqHashOrGHash(song.Hash, "sqhash");
getMp3UrlSrc(sqhash, song.album_id, song.FileName);
})()
} else if ($('[name="choose_q"]:checked').val() == 1) {
(async function () {
let ghash = await getSqHashOrGHash(song.Hash, '320hash');
getMp3UrlSrc(ghash, song.album_id, song.FileName);
})()
} else {
getMp3UrlSrc(song.Hash, song.album_id, song.FileName);
}
})
}
},
cancel: {
text: '取消',
btnClass: 'btn-primary',
action: function() {
download_hash_list = "0";
}
}
}
})
} else {
$.confirm({
title: '下载提示',
content: '你确定要下载所有选中的音乐吗?',
type: 'green',
icon: 'glyphicon glyphicon-question-sign',
buttons: {
ok: {
text: '确认',
btnClass: 'btn-primary',
action: function () {
// 获取选中的
$('.pc_temp_btn_checked').each(function () {
let song_index = $(this).attr("data-index");
let song = global.features[song_index];
mp3_Name = song.FileName;
if ($('[name="choose_q"]:checked').val() == 0) {
// 使用同步方式
(async function () {
let sqhash = await getSqHashOrGHash(song.Hash, "sqhash");
getMp3UrlSrc(sqhash, song.album_id, song.FileName);
})()
} else if ($('[name="choose_q"]:checked').val() == 1) {
(async function () {
let ghash = await getSqHashOrGHash(song.Hash, '320hash');
getMp3UrlSrc(ghash, song.album_id, song.FileName);
})()
} else {
// setTimeout(function () { getMp3UrlSrc(song.Hash, song.album_id, song.FileName); }, 5000);
getMp3UrlSrc(song.Hash, song.album_id, song.FileName);
}
});
}
},
cancel: {
text: '取消',
btnClass: 'btn-primary',
action: function() {
download_hash_list = "0";
}
}
}
})
}
setTimeout(function () { download_hash_list = "0"; }, 5000);
})
}
// 获取高音质或者超高音质的hash
function getSqHashOrGHash(hash, quality) {
let searchQualityUrl = 'http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=' + hash;
let quality_hash = "";
// 查询音质
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "get",
url: searchQualityUrl,
onload: function (r) {
let jsonTxt = r.responseText;
let json = JSON.parse(jsonTxt);
quality_hash = json.extra[quality];
if (quality_hash == "" && quality == "sqhash") {
quality_hash = json.extra['320hash'];
}
if (quality_hash == "") {
quality_hash = hash;
}
// 返回的值,quality_hash
resolve(quality_hash);
}
})
})
}
// 获取高音质或者普通音质的MP3地址并且下载
function getMp3UrlSrcVip() {
downloadBySrc(document.getElementById('myAudio').src, document.getElementsByClassName("audioName")[0].title);
// let get_url = "http://xx.xxx/api/tampermonkey/url/byhash?hash=" + d_hash + "&albumid=" + albumid;
// GM_xmlhttpRequest({
// method: "get",
// url: get_url,
// onload: function (r) {
// let jsonTxt = r.responseText;
// let json = JSON.parse(jsonTxt);
// downloadBySrc(json.data.play_url, file_name);
// }
// })
mp3_ecid_download = ""
}
// 获取高音质或者普通音质的MP3地址并且下载 此方法不再用了
function getMp3UrlSrc(d_hash, albumid, file_name) {
let get_url = "http://xxx.xxx/api/tampermonkey/url/byhash?hash=" + d_hash + "&albumid=" + albumid;
GM_xmlhttpRequest({
method: "get",
url: get_url,
onload: function (r) {
let jsonTxt = r.responseText;
let json = JSON.parse(jsonTxt);
downloadBySrc(json.data.play_url, file_name);
}
})
}
// 点击下载 by url
function downloadBySrc(download_url_quality, file_name) {
let down_name = file_name != 0 ? file_name : mp3_Name;
let download_url = download_url_quality;
let loaded = 0.0;
NProgress.set(0.0);
GM_download({
url: download_url,
name: down_name + download_url.substr(download_url.lastIndexOf(".")),
saveAs: true,
onerror: function (error) {
//如果下载最终出现错误,则要执行的回调
console.log(error)
console.log(down_name + " 下载报错,请反馈!");
},
onprogress: (pro) => {
//如果此下载取得了一些进展,则要执行的回调
// console.log(pro.loaded) //文件加载量
// console.log(pro.totalSize) //文件总大小
let size = (pro.loaded / pro.totalSize).toFixed(1);
if (loaded != size) {
loaded = size;
NProgress.inc(0.1);
}
},
ontimeout: () => {
//如果此下载由于超时而失败,则要执行的回调
console.log(down_name + "下载超时,请反馈!");
},
onload: () => {
//如果此下载完成,则要执行的回调
console.log(down_name + " 下载完成!");
download_hash = "";
NProgress.done();
}
})
}
GM_addStyle(GM_getResourceText("css"));
//========================================= nprogress.min.css
GM_addStyle(`
#nprogress{pointer-events:none}#nprogress .bar{background:#f90;position:fixed;z-index:1031;top:0;left:0;width:100%;height:5px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #f90,0 0 5px #f90;opacity:1;-webkit-transform:rotate(3deg) translate(0,-4px);-ms-transform:rotate(3deg) translate(0,-4px);transform:rotate(3deg) translate(0,-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#f90;border-left-color:#f90;border-radius:50%;-webkit-animation:nprogress-spinner 400ms linear infinite;animation:nprogress-spinner 400ms linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
`);
//=========================================jq的confirm
GM_addStyle(`
.jconfirm-box-container .jconfirm-box{width: 281px;}
`);