Greasy Fork

Greasy Fork is available in English.

酷狗在线听/下载

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

当前为 2022-08-21 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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)}}
`);