Node.js 实现网易云歌单自动扩展:从单曲到整张专辑一键生成扩展歌单
Node.js实现网易云歌单自动扩展从单曲到整张专辑一键生成扩展歌单 灵感来源这个功能的灵感源于我平时使用网易云音乐时的体验我们常常会自己创建歌单收集喜欢的单曲但这些单曲背后往往对应整张专辑。每当想一次性沉浸在多张专辑的音乐中时总需要手动去查找、切换非常耗时。于是我想到如果能有一个功能根据已有歌单自动生成包含单曲对应整张专辑的扩展歌单那就舒服了。 实现过程为了实现这个想法我选择了使用开源的网易云 APIhttps://github.com/nooblong/NeteaseCloudMusicApiBackup我编写了脚本全程借助ChatGPT逐步实现功能。 脚本在最后面在配置环境和调试过程中遇到了一些问题也不断碰壁但通过 AI 的帮助逐步解决。最终脚本成功实现了自动扩展歌单的功能并支持生成备份文件。甚至下面的功能描述和部分使用过程也是 AI 帮助我整理和美化的但基础逻辑和核心实现都是我自己完成的。代码已上传github https://github.com/GNChuhuda/netease-expandplaylist功能 全新“歌单扩展”功能上线从精选单曲到完整专辑一次扩展沉浸畅听让音乐体验翻倍 功能亮点自动扩展歌单将每首单曲对应专辑的所有歌曲一键汇聚⏱️省时省力无需手动整理一次生成完整歌单轻松发现更多作品探索整张专辑和更多相关歌曲⚡ 使用步骤超简单读取原歌单快速获取你的收藏单曲拉取专辑歌曲智能抓取每首单曲对应专辑里的全部歌曲创建新歌单一键生成专属扩展歌单➕批量添加歌曲自动添加整张专辑让歌单瞬间丰满生成备份文件支持 JSON/TXT 导出方便保存或分享✨让你的歌单从精选单曲升级为完整专辑盛宴功能展示下面歌单从30首扩展到了416首原始歌单扩展歌单1️⃣ 环境准备安装 Node.js建议版本v22其实16应该是ok的检查版本node-v安装 Git用于克隆仓库git--version2️⃣ 克隆 API 仓库使用nooblong/NeteaseCloudMusicApiBackup自己随便找个D盘创建一个新的文件夹,然后在该文件夹打开powershellshift右键,再运行下面的命令git clone https://github.com/nooblong/NeteaseCloudMusicApiBackup.git cd NeteaseCloudMusicApiBackup3️⃣ 安装依赖并添加新脚本清空旧依赖可选一般可以跳过这步rd/s/q node_modulesdelpackage-lock.jsonr安装依赖还是同一个地方powershell运行指令npm configsetregistry https://registry.npmmirror.com npm config get registry npm install--verbosenpm config get registry只是检查是不是用国内这个镜像⚠️ 碰到的问题及解决方法ECONNRESET / CERT_HAS_EXPIRED→ 使用国内镜像--registryhttps://registry.npmmirror.comEPERM mkdir→ 检查缓存目录权限或改为 D 盘可写目录把文件expandPlaylist添加到这个文件夹中相当于和node.js同一个目录4️⃣ 启动 API 服务node app.js默认监听http://localhost:3000确认终端显示server running at 30005️⃣ 浏览器扫码登录访问http://localhost:3000看到一个界面点第四个功能, 二维码登录用网易云APP扫描二维码并确认登录这里我记得这里按理说应该是会弹到网易云那个界面去二维码登录的如果没有弹出或者出现问题就参考http://localhost:3000/docs/#/?idneteasecloudmusicapi 的说明文档的二维码登录的分步骤走然后访问完/login/qr/create?keyxxx这个接口后网页上会显示qrurl字段把这个url对应网页打开就能弹到网易云扫码登录界面检查登录状态访问http://localhost:3000/login/status返回了一堆信息不是null就行返回 JSON 中包含profile.nickname可以确认是不是自己的账号6️⃣ 获取浏览器 cookie进入网易云音乐首页打开浏览器开发者工具 → Application → Cookies → 找到MUSIC_U或 Network → 任意请求 → Request Headers → Cookie → 找到MUSIC_U这个字段的值需要把这段值修改填充到expandPlaylist.js文件中- 示例 js const COOKIE MUSIC_U你的_cookie_值_here;; ⚠️ 注意cookie 会过期需要重新扫码确保复制时没有换行7️⃣ 改写并运行扩展歌单脚本①expandPlaylist.js需要改的部分//填充cookieconstCOOKIE;//改成你要扩展的原始歌单的 ID这个手机版复制分享歌单链接中可以看到例如13391617669constPLAYLIST_ID1;//扩展新建的歌单名字也可以修改constnewPlaylistName扩展歌单;脚本expandPlaylist.js②运行命令注意由于有一个窗口已经在跑APIapp.js所以需要新开一个powershell窗口运行如下指令node expandPlaylist.js终端显示原歌单数量涉及专辑数量扩展后总歌曲数新歌单 ID批量添加进度8️⃣ 输出结果JSON 文件expanded_playlist.json文本文件expanded_playlist.txt新歌单已在网易云可见并加入所有扩展歌曲脚本源码expandPlaylist.js// expandPlaylist.jsconstaxiosrequire(axios);constfsrequire(fs);// —— 请改成你的浏览器扫码登录后的 cookie —— //constCOOKIE;constAPI_BASEhttp://localhost:3000;// 本地 API 服务// 改成你要扩展的歌单 IDconstPLAYLIST_ID1;asyncfunctionsleep(ms){returnnewPromise(resolvesetTimeout(resolve,ms));}// 创建 axios 实例带上 cookieconstclientaxios.create({baseURL:API_BASE,headers:{Cookie:COOKIE}});asyncfunctionmain(){try{console.log(读取原歌单中...);constplaylistResawaitclient.get(/playlist/track/all,{params:{id:PLAYLIST_ID,limit:1000}});consttracksplaylistRes.data.songs;console.log(原歌单歌曲数${tracks.length});constalbumIdSetnewSet();tracks.forEach(track{if(track.altrack.al.id)albumIdSet.add(track.al.id);});console.log(涉及专辑数${albumIdSet.size});constallSongIdSetnewSet();letindex1;for(constalbumIdofalbumIdSet){console.log([${index}/${albumIdSet.size}] 拉取专辑${albumId});constalbumResawaitclient.get(/album,{params:{id:albumId}});constsongsalbumRes.data.songs||[];songs.forEach(songallSongIdSet.add(song.id));index;awaitsleep(300);// 防止请求太快}console.log(扩展后歌曲总数${allSongIdSet.size});// —— 创建新歌单 —— //constnewPlaylistName扩展歌单;console.log(创建新歌单${newPlaylistName});constcreateResawaitclient.post(/playlist/create,null,{params:{name:newPlaylistName,privacy:0}// privacy: 0 公开, 10 私密});constnewPlaylistIdcreateRes.data.id;console.log(新歌单 ID${newPlaylistId});// —— 批量添加歌曲 —— //constsongIdsArray.from(allSongIdSet);console.log(添加${songIds.length}首歌曲到新歌单...);constchunkSize100;// 网易云接口每次添加不超过 100 首for(leti0;isongIds.length;ichunkSize){constchunksongIds.slice(i,ichunkSize);awaitclient.post(/playlist/tracks,null,{params:{op:add,pid:newPlaylistId,tracks:chunk.join(,)}});console.log(已添加${ichunk.length}/${songIds.length});awaitsleep(500);// 避免接口过快}// —— 保存备份文件 —— //constresult{sourcePlaylistId:PLAYLIST_ID,totalSongs:allSongIdSet.size,newPlaylistId,songIds};fs.writeFileSync(expanded_playlist.json,JSON.stringify(result,null,2));fs.writeFileSync(expanded_playlist.txt,songIds.join(\n));console.log(扩展完成);console.log( - expanded_playlist.json);console.log( - expanded_playlist.txt);}catch(err){console.error(脚本出错,err.response?.data||err.message);}}main();
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429855.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!