【Listen1】⽹易云⾳乐歌单过长⽆法导⼊
前⾔
喜欢的歌版权在不同平台上,听个歌还得切来切去太⿇烦了。
以前⼀直⽤⽹易云,歌曲推荐是真的好,但是逐渐⽹易云变为“⽹抑云”,加上⼴告和新增⼀些花⾥胡哨的功能让我对它越来越没法说”爱“,看着歌单逐渐变灰,真的⽆奈。
⽆意间发现⼀个开源的插件,整合了⽹易云⾳乐,虾⽶,QQ⾳乐,酷狗⾳乐,酷我⾳乐,Bilibili,咪咕⾳乐,很强⼤,⽽且没⼴告,界⾯清爽简洁,⽀持其他平台歌单导⼊,并且歌曲没版权⾃动换平台,这就是我需要的,
但是我导⼊歌单的时候其他都成功了,最⼤的⼀个歌单却导⼊失败,⼀直转圈圈,⾥⾯有⼀千四百多⾸歌,应该是歌曲太多导致失败
正⽂
解决⽅案(当前版本为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 = il(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 = 'music.163/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: `music.163/#/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 = _at(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,其他平台想修改可以提供⼀个思路:呼出控制台,导⼊歌单后如果卡死会在控制台内新增⼀个报错:
根据报错内容就可以到是哪个⽅法出了问题,再参照上⾯的⽅法进⾏修改