返回首页

Yandex Music 播放列表导出 JS 脚本

本文描述了通过 DevTools 导出 Yandex Music 播放列表的 JavaScript 脚本。考虑虚拟化列表,在滚动时收集曲目到 TXT/CSV。全代码、示例和改进建议,针对开发者。

Yandex Music 曲目导出:10 秒 JS 脚本
Advertisement 728x90

通过浏览器开发者工具中的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的当前结构——如果发生变化,请检查它们。

Google AdInline article slot

输出格式与示例

  • 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键。

Google AdInline article slot

技术实现细节

虚拟化列表(例如基于react-window或类似技术)仅渲染可见行,以节省内存。标准的 querySelectorAll 将捕获20–50首曲目,其余部分被隐藏。

脚本关键组件:

  • MutationObserver:响应滚动期间DOM节点的添加。
  • Dataset标志:防止重复(item.dataset.captured)。
  • Blob和URL.createObjectURL:无需服务器即可生成可下载文件。
  • data-testid选择器:稳定,在SPA中不太可能更改。

对于CSV,添加转换:

Google AdInline article slot
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

Advertisement 728x90

继续阅读