酷狗在线听/下载/vip

无需登录在线听你想听的音乐

// ==UserScript==
// @name         酷狗在线听/下载/vip
// @namespace    https://topaa.top/
// @version      1.9
// @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://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/jquery-confirm/3.3.4/jquery-confirm.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js
// @resource css https://cdn.bootcdn.net/ajax/libs/jquery-confirm/3.3.4/jquery-confirm.min.css
// @connect      music.topaa.top
// @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://music.topaa.top/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 = "https://music.topaa.top/api/tampermonkey/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 = "https://music.topaa.top/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 = "https://music.topaa.top/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;}
`);