通过浏览器开发者工具中的JavaScript导出Yandex Music播放列表
开发者经常需要从Yandex Music提取曲目列表,以便转移到其他服务、备份或进行分析。虽然没有官方导出功能,但一个JavaScript脚本通过模拟滚动解决了这个问题。它在浏览器控制台中运行,考虑了虚拟化列表的特性:曲目动态加载,DOM中仅包含可见部分。
该脚本收集艺术家、标题和时长数据,导出为TXT或CSV格式。对于包含数千首曲目的播放列表,整个过程只需几秒钟。
准备与执行
- 在Yandex Music中打开目标播放列表。
- 启动开发者工具(F12)并切换到控制台选项卡。
- 将脚本粘贴到控制台并执行。
- 滚动播放列表至末尾——脚本将捕获所有曲目。
- 运行命令
finalizeCapture()以完成操作。 - 通过提供的链接下载文件。
// 将此代码粘贴到控制台
let tracks = [];
const observer = new MutationObserver(() => {
const items = document.querySelectorAll('[data-testid="track-row"]');
items.forEach(item => {
if (!item.dataset.captured) {
const artist = item.querySelector('[data-testid="artist-name"]')?.textContent.trim();
const title = item.querySelector('[data-testid="track-title"]')?.textContent.trim();
const duration = item.querySelector('[data-testid="track-duration"]')?.textContent.trim();
if (artist && title) {
tracks.push({artist, title, duration});
item.dataset.captured = 'true';
}
}
});
});
observer.observe(document.body, {childList: true, subtree: true});
window.finalizeCapture = () => {
observer.disconnect();
const data = tracks.map(t => `${t.artist} - ${t.title}${t.duration ? ` (${t.duration})` : ''}`).join('\n');
const blob = new Blob([data], {type: 'text/plain'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'playlist.txt';
a.click();
console.log(`捕获了 ${tracks.length} 首曲目`);
};
此代码使用MutationObserver来跟踪DOM中的新元素。选择器已适配Yandex Music的当前结构——如果发生变化,请检查它们。
输出格式与示例
- TXT:简单的字符串列表
艺术家 - 标题或包含时长。 - CSV:列
艺术家,标题,时长,便于导入电子表格。
电子音乐播放列表的TXT示例:
Daft Punk - One More Time
The Weeknd - Blinding Lights
Justice - D.A.N.C.E.
CSV版本:
Daft Punk,One More Time,4:02
The Weeknd,Blinding Lights,3:20
Justice,D.A.N.C.E.,4:00
虚拟化列表需要手动滚动:脚本不自动滚动以避免被阻止。对于大型播放列表,使用滚轮事件或Page Down键。
技术实现细节
虚拟化列表(例如基于react-window或类似技术)仅渲染可见行,以节省内存。标准的 querySelectorAll 将捕获20–50首曲目,其余部分被隐藏。
脚本关键组件:
- MutationObserver:响应滚动期间DOM节点的添加。
- Dataset标志:防止重复(
item.dataset.captured)。 - Blob和URL.createObjectURL:无需服务器即可生成可下载文件。
- data-testid选择器:稳定,在SPA中不太可能更改。
对于CSV,添加转换:
const csv = tracks.map(t => `${t.artist},"${t.title}",${t.duration || ''}`).join('\n');
处理标题中的引号转义以确保CSV正确。
生产环境的可能改进
- 自动滚动:
setInterval(() => window.scrollBy(0, 500), 100)并添加暂停。 - JSON导出:
JSON.stringify(tracks, null, 2)。 - 专辑支持:类似的选择器用于 /artist/ 和 /album/。
- 过滤器:通过曲目ID排除重复项。
- 浏览器扩展:带有按钮UI的内容脚本。
在不同播放列表上测试——播客或现场录音的结构可能有所不同。
关键要点
- 该脚本仅在浏览器中运行,无需API或扩展。
- 考虑虚拟化列表——仅在滚动期间收集曲目。
- TXT/CSV导出已准备好导入Spotify、Apple Music等平台。
- 易于修改:添加曲目ID或封面艺术。
- 对分析有用:按流派、时长统计。
— Editorial Team
暂无评论。