Greasy Fork

Greasy Fork is available in English.

酷狗在线听/下载

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

当前为 2022-09-13 提交的版本,查看 最新版本

// ==UserScript==
// @name         酷狗在线听/下载
// @namespace    http://tampermonkey.net/
// @version      1.2
// @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
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js
// @connect      *
// ==/UserScript==
console.log("==================================插件启动成功==================================")
console.log("===============================下载需要将扩展名.flac设置为白名单==================================")
console.log("===============================1.点击油猴的管理面板==================================")
console.log("===============================2.已安装脚本右面的设置(在右上角)==================================")
console.log("===============================3.往下拉找到 “下载 BETA” ,把“.flac”添加到框中,点击保存即可==================================")
let mp3_Hash = "";
let mp3_Url = "";
let mp3_Name = "";
let url = "";
let download_url = "";
// audio
let audioMp3 = document.getElementById('myAudio');

// 监听audio开始播放事件(事件在视频/音频(audio/video)开始播放时触发。)
audioMp3.addEventListener("play", function () {
    // 判断是否需要修改src属性
    if (audioMp3.getAttribute("data-hash") != mp3_Hash) {
        getMp3Detail();
    }
})

// 点击下载按钮
document.getElementsByClassName("btnDownloadClient")[0].onclick = function () {
    if (download_url == mp3_Url) {
        alert(mp3_Name + " 已在下载中!")
    } else {
        downloadBySrc();
        setTimeout(function () {
            document.getElementsByClassName('ui-popup ui-popup-show ui-popup-focus')[0].style.display = "none"
        }, 50)
    }
};

// 点击下载按钮
document.getElementById('pb_download').onclick = function () {
    if (download_url == mp3_Url) {
        alert(mp3_Name + " 已在下载中!")
    } else {
        downloadBySrc();
        setTimeout(function () {
            document.getElementsByClassName('ui-popup ui-popup-show ui-popup-focus')[0].style.display = "none"
        }, 50)
    }
};

// 点击下载
function downloadBySrc() {
    download_url = mp3_Url;
    let loaded = 0.0;
    NProgress.set(0.0);      // 与.start()
    GM_download({
        url: mp3_Url,
        name: mp3_Name, //不填则自动获取文件名
        saveAs: true, //布尔值,显示"保存为"对话框
        onerror: function (error) {
            //如果下载最终出现错误,则要执行的回调
            console.log(error)
            console.log(mp3_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(mp3_Name + "下载超时,请反馈!");
        },
        onload: () => {
            //如果此下载完成,则要执行的回调
            console.log(mp3_Name + "   下载完成!");
            NProgress.done();
        }
    })
}

// js修改audio的src属性,即播放链接
function getMp3Detail() {
    mp3_Hash = audioMp3.getAttribute("data-hash");
    // 访问第三方解析无损接口
    url = "http://8.142.95.208:5001/url/byhash?hash=" + mp3_Hash;
    // get请求获取无损音质的信息
    GM_xmlhttpRequest({
        method: "get",
        url: 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 + mp3_Url.substr(mp3_Url.lastIndexOf("."));
            audioMp3.src = mp3_Url;
            document.getElementById('openKugou').href = mp3_Url;
            if (audioMp3.paused) {
                audioMp3.play();
            }
            console.log(mp3_Name + "   加载完成");
        }
    })
}
//========================================= 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)}}
`);