Greasy Fork

来自缓存

Greasy Fork is available in English.

ximalaya-download

喜马拉雅音乐或视频下载

当前为 2024-11-06 提交的版本,查看 最新版本

// ==UserScript==
// @name        ximalaya-download
// @namespace   http://greasyfork.icu/zh-CN/users/135090
// @grant       none
// @version     1.4.4
// @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/*
// @match       https://m.ximalaya.com/album/*
// @match       https://m.ximalaya.com/selfshare/album*
// ==/UserScript==

setTimeout(function(){
    'use strict';
    //获取单曲解析结果
    if (location?.pathname?.indexOf("sound")>0){
        var playurl;
        if (window.location.pathname.indexOf("sound")>0){
            var trackid=window.location.pathname.split("/")[2];
            var stitle="xm";
            var xmitem={
                id:trackid,
                ttl:stitle
            };
            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(xmitem).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=xmitem.ttl;
                        link.textContent=xmitem.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);
                        item.ttl = resp.trackInfo.title;
                    } 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("解密错误,无视频");
                        res=ares;
                        item.ttl += ".m4a";
                    }
                }
            });
            return res;
        }
    }
    //获取专辑列表
    if (location.pathname.indexOf("/album/") == 0 && location.hostname == "www.ximalaya.com"){
        var alt=[];
        var ttls=[];
        var abid=location.pathname.indexOf("/album/") == 0 ? location.pathname.split("/")[2] : "77545064";
        var abapi=`https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=${abid}&pageNum=1&pageSize=100`;
        setTimeout(function(){
        fetch(abapi,{method:"get"})
        .then(res=>{var jsondata=res?.json();return jsondata;})
        .then(res=>{
            var trackcount=res?.data?.trackTotalCount;
            if (trackcount == undefined){
                var adt2;
                for (let name of document.scripts) {
                    if (name.innerHTML.indexOf("window.__INITIAL_STATE__") == 0){
                        //console.log(name.innerHTML);
                        if (name.innerHTML.indexOf("AlbumDetailTrackListV2") > 0) {
                            var sid=name.innerHTML.indexOf("AlbumDetailTrackListV2")+24;
                            var eid=name.innerHTML.indexOf("SeoSearchPage")-2;
                            var adt=name.innerHTML.substring(sid,eid);
                            console.log(adt2=adt);
                        }
                    }
                }
                var ti=JSON.parse(adt2);
                trackcount=ti.tracksInfo.trackTotalCount;
                console.log(trackcount);
            }
            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 (pns > 1){
                var abapinew=abapi.replace('pageNum=1','pageNum='+pns);
                var morehtm=`<a id="newab" target="_blank" href="${abapinew}">${abapinew}</a>`
                morehtm += `<p id=tip>专辑曲目超过100,请修改API参数后再访问.最大页码为${pns}</p>`;
                var alink=document.createElement("p");
                alink.innerHTML=morehtm;
                document.body.append(alink);
                //document.querySelector(".detail.layout-main").append(alink);
            }
            document.querySelector(".side").remove();
            document.querySelector("#rootFooter").remove();
            document.querySelector(".sound-list").remove();
            var h2p=document.createElement("ul");
            h2p.id="h2u";
            h2p.position="absolute";
            h2p.style.display = "table";
            h2p.style.color = "#230de5";
            h2p.style.listStyle = 'decimal';
            h2p.style.paddingTop="0";
            h2p.style.paddingBottom="50px";
            document.body.append(h2p);
            ttls.forEach((it,n)=>{
                console.log(it,n+1);
                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("#h2u").append(ulli);
            });
        });},1500);
    }
    //移动版视图
    if (location.pathname.indexOf("/album/") == 0 && location.hostname == "m.ximalaya.com"){
        window.location.href="https://www.ximalaya.com"+location.pathname;
    }
    if (location.pathname.indexOf("/selfshare/album") == 0 && location.hostname == "m.ximalaya.com"){
        window.location.href="https://www.ximalaya.com/album/"+location.pathname.split("/")[3];
    }
},500);