ximalaya-download

喜马拉雅音乐或视频下载

// ==UserScript==
// @name        ximalaya-download
// @namespace   https://greasyfork.org/zh-CN/users/135090
// @grant       none
// @version     1.4.1
// @author      zwb83925462
// @license     BSD
// @description 喜马拉雅音乐或视频下载
// @run-at      document-end
// @require     https://registry.npmmirror.com/ajax-hook/3.0.3/files/dist/ajaxhook.min.js
// @require     https://registry.npmmirror.com/crypto-js/4.2.0/files/crypto-js.js
// @require     https://registry.npmmirror.com/jquery/3.7.1/files/dist/jquery.min.js
// @match       https://www.ximalaya.com/sound/*
// @match       https://www.ximalaya.com/album/*
// ==/UserScript==

(function() {
    'use strict';
    //获取单曲解析结果
    if (location.pathname.includes("/sound/")){
        var playurl;
        var title=document?.querySelector("h1.title")?.textContent || document?.querySelector("h1.title-wrapper")?.textContent;
        if (window?.location?.pathname?.includes("sound")){
            var trackid=window?.location?.pathname?.split("/")[2];
            var item={
                id:trackid,
                ttl:title
            };
            setTimeout(function(){
                var link = document.createElement("a");
                var container = document.body;
                link.id="mp4";
                link.style="position:fixed;top:10%;left:2%";
                link.style.display = "block";
                link.style.color = "#230de5";
                getAllMusicURL2(item).then(result=>{
                    playurl=result?.toString();
                    return playurl;
                }).then(data=>{
                    if (data == undefined){
                        link.textContent="未购买,无法下载";
                        link.style.fontSize = "20px";
                        link.style.color="#F00";
                    } else {
                        link.download=item.ttl;
                        link.textContent=item.ttl;
                        console.log(link.href=data);
                    }
                });
                container.append(link);
            },2000);
        }
        async function getAllMusicURL2(item) {
            function decrypt(t) {
                return CryptoJS.AES.decrypt({
                    ciphertext: CryptoJS.enc.Base64url.parse(t)
                }, CryptoJS.enc.Hex.parse('aaad3e4fd540b0f79dca95606e72bf93'), {
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7
                }).toString(CryptoJS.enc.Utf8);
            }
            var res = null;
            var ares = null;
            const timestamp = Date.parse(new Date());
            var url = `https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/${timestamp}?device=web&trackId=${item.id}&forVideo=true&needMp4=true`;
            var aurl =`https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/${timestamp}?device=web&trackId=${item.id}`;
            $.ajax({
                type: 'get',
                url: aurl,
                async: false,
                dataType: "json",
                success: function(resp) {
                    try {
                        ares = decrypt(resp.trackInfo.playUrlList[0].url);
                    } catch (e) {
                        console.log("无效");
                    }
                }
            });
            $.ajax({
                type: 'get',
                url: url,
                async: false,
                dataType: "json",
                success: function(resp) {
                    try {
                        res = decrypt(resp.trackInfo.playUrlList[0].url);
                        item.ttl += ".mp4";
                    } catch (e) {
                        console.log("解密错误,无视频");
                        item.ttl += ".m4a";
                        res=ares;
                    }
                }
            });
            return res;
        }
    }
    //获取专辑列表
    if (location.pathname.includes("/album/")){
        var alt=[];
        var ttls=[];
        var abid=location.pathname.includes("/album/") ? location.pathname.split("/")[2] : "77545064";
        var abapi=`https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=${abid}&pageNum=1&pageSize=100`;
        fetch(abapi,{method:"get"})
        .then(res=>{return res?.json()})
        .then(res=>{
            var trackcount=res?.data?.trackTotalCount;
            var pagenums=(trackcount/100 | 0) + (trackcount % 100 >0 ? 1 : 0);
            //var pagenums = (trackcount % 100 >0 ? trackcount+100 : trackcount) / 100 | 0;
            //console.log(pagenums);
            var tracks=res?.data?.tracks;
            tracks.forEach(i=>{
                alt.push(i.url);ttls.push(i.title);
            });
            return pagenums;
        })
        .then(pns => {
            if (document.querySelector("div.download-more")){
                document.querySelector("div.download-more").style.marginTop="2vh";
                document.querySelector("div.download-more").innerHTML=null;
            }
            if (pns > 1){
                var abapinew=abapi.replace('pageNum=1','pageNum='+pns);
                var morehtm=`<a id="newab" target="_blank" href="${abapinew}">${abapinew}</a><p id=tip></p>`;
                document.querySelector("div.download-more").innerHTML=morehtm;
                document.querySelector("div.download-more > #newab").style.color = "#230de5";
                document.querySelector("div.download-more > #tip").textContent="专辑曲目超过100,请修改API参数后再访问.最大页码为"+pns;
            }
            document.querySelector(".sound-list>ul").innerHTML=null;
            document.querySelector(".sound-list>ul").style.listStyle = 'decimal';
            ttls.forEach((it,n)=>{
                //console.log(it,n);
                var ulli=document.createElement("li");
                var plink=document.createElement("a");
                plink.href=alt[n];
                plink.target="_blank";
                plink.style.color="#088";
                plink.style.fontSize="20px";
                plink.textContent=it;
                ulli.append(plink);
                document.querySelector(".sound-list>ul").append(ulli);
            });
        });
    }
})();