【Listen 1】網易雲音樂歌單過長無法導入


前言

喜歡的歌版權在不同平台上,聽個歌還得切來切去太麻煩了。
以前一直用網易雲,歌曲推薦是真的好,但是逐漸網易雲變為“網抑雲”,加上廣告和新增一些花里胡哨的功能讓我對它越來越沒法說”愛“,看着歌單逐漸變灰,真的無奈。
無意間發現一個開源的插件Listen 1,整合了網易雲音樂,蝦米,QQ音樂,酷狗音樂,酷我音樂,Bilibili,咪咕音樂,很強大,而且沒廣告,界面清爽簡潔,支持其他平台歌單導入,並且歌曲沒版權自動換平台,這就是我需要的,
但是我導入歌單的時候其他都成功了,最大的一個歌單卻導入失敗,一直轉圈圈,里面有一千四百多首歌,應該是歌曲太多導致失敗

已經pr

正文

解決方案(當前版本為2.10.0):
打開下載的插件文件夾,打開文件:.\js\provider\netease.js

找到第207行左右的”ng_parse_playlist_tracks“方法,修改為:

    function ng_parse_playlist_tracks(playlist_tracks, hm, se, callback) {
        var list = playlist_tracks;//id集合
        var count = Math.ceil(list.length / 1000);//數據分頁數向上取整
        var nowCount = 0;//請求返回的數據數量
        var playList = [];//儲存返回數據(未排序)
        /**
         * 下面為原方法
         * @param {any} playlist_tracks
         * @param {any} hm
         * @param {any} se
         * @param {any} callback 更改為自己的callback
         * @param {any} index 新增字段,因異步請求返回順序不一致,所以增加標記返回下標
         */
        function ng_parse_playlist_tracks_getData(playlist_tracks, hm, se, callback, index) {
            const target_url = 'https://music.163.com/weapi/v3/song/detail';
            const track_ids = playlist_tracks.map(i => i.id);
            const d = {
                c: '[' + track_ids.map(id => ('{"id":' + id + '}')).join(',') + ']',
                ids: '[' + track_ids.join(',') + ']'
            }
            const data = _encrypted_request(d);
            hm({
                url: target_url,
                method: 'POST',
                data: se(data),
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
            }).then((response) => {
                //調用自定義callback
                return callback(index, response.data.songs.map(track_json => ({
                    id: `netrack_${track_json.id}`,
                    title: track_json.name,
                    artist: track_json.ar[0].name,
                    artist_id: `neartist_${track_json.ar[0].id}`,
                    album: track_json.al.name,
                    album_id: `nealbum_${track_json.al.id}`,
                    source: 'netease',
                    source_url: `http://music.163.com/#/song?id=${track_json.id}`,
                    img_url: track_json.al.picUrl,
                    url: `netrack_${track_json.id}`,
                })));
            });
        }
        /**
         * 自定義callback
         * @param {any} index 當前數據下標
         * @param {any} data 數據集
         */
        function cb(index, data) {
            nowCount++;
            playList[index] = data;//根據下標儲存返回數據
            //數據全部返回時調用原方法返回數據
            if (count == nowCount) {
                //數組拼接成一個對象集合
                var _playList = [];
                for (var i = 0; i < playList.length; i++) {
                    _playList = _playList.concat(playList[i]);
                }
                return callback(null, _playList);
            }
        }
        //分頁並循環獲取數據
        for (var i = 0; i < count; i++) {
            playlist_tracks = list.slice(i * 1000, (i + 1) * 1000);
            ng_parse_playlist_tracks_getData(playlist_tracks, hm, se, cb, i)
        }
    }

一千四百多首歌導入成功:

出現這個問題的原因是歌單超過1000首后會被傳入的id過多,數據包太大會被服務器拒絕

最后

1、感謝Listen 1作者及其他熱愛分享的人
2、筆者前端技術一般般,代碼不是很優美,歡迎各位指正
3、這個方法是網易雲的,qq音樂等其他平台因為沒有合適的歌單,同時喜歡的歌就兩三首,搜索歌名添加就行,絕對不是因為懶o(´^`)o,其他平台想修改可以提供一個思路:
呼出控制台,導入歌單后如果卡死會在控制台內新增一個報錯:

根據報錯內容就可以找到是哪個方法出了問題,再參照上面的方法進行修改


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM