完成的结果:我的歌单
- 获取 likelist.json
- 生成 content/music.org
一、获取 likelist.json
使用 GitHub 仓库 Binaryify/NeteaseCloudMusicApi 提供的 API——获取歌单所有歌曲:
接口地址:
/playlist/track/all
调用例子:
/playlist/track/all?id=24381616
id 后的数字是歌单的 id。在浏览器输入 https://music.163.com
,登陆后进入“个人主页”,在“我创建的歌单”下会有“XX喜欢的音乐”,点击后地址栏是这样的: https://music.163.com/#/playlist?id=967686417
。最后的这串数字,就是上面调用例子中需要的数字。
按照文档部署运行在本地后,要先二维码登录,然后才能获取到列表;否则,会提示操作过于频繁之类的话语。我本想部署在在线平台——Vercel 或者腾讯云 Serverless。最后都不能像在本地一样正常工作。http://localhost:3000/playlist/track/all?id=967686417 是我要请求的本地地址,一切正常的话,页面会出现类 JSON 数据,保存到本地就是 likelist.json。
我打算,每隔一段时间,手动获取一次列表。
二、生成 content/music.org
我通过 phind(为开发者服务的 AI 搜索引擎),知道可以用 ejs 这样的模板语言,将类 JSON 数据转为 HTML 网页。
实现代码:
/// music.js
const fs = require('fs')
const ejs = require('ejs')
// http://localhost:3000/playlist/track/all?id=967686417
// 获取我喜欢歌单全部歌曲详情
let songs = []
fs.readFile('./scripts/likelist.json', 'utf8', (err, data) => {
if (err) console.log(err)
const jsonData = JSON.parse(data)
songs = jsonData.songs.map(song => {
if (song.ar.length == 2) {
return {
name: song.name,
artists: `${song.ar[0].name}, ${song.ar[1].name}`
}
}
if (song.ar.length == 3) {
return {
name: song.name,
artists: `${song.ar[0].name}, ${song.ar[1].name}, ${song.ar[2].name}`
}
}
return {
name: song.name,
artists: song.ar[0].name
}
})
// console.log(songs)
ejs.renderFile('./scripts/template.ejs', { songs }, { "rmWhitespace": true }, function (err, org) {
if (err) throw err;
fs.writeFile('./content/music.org', org, function (err) {
if (err) throw err;
console.log('Org-mode file generated!');
});
});
})
/// template.ejs
#+TITLE: 我的歌单
<% for(let i=0; i<songs.length; i++) { %>
- <%= songs[i].name %> - <%= songs[i].artists -%>
<% } %>