【问题标题】:MusicKitJS: Can't play songs from user's libraryMusicKitJS:无法播放用户库中的歌曲
【发布时间】:2026-01-16 01:25:01
【问题描述】:

所以我正在试验上周发布的 Apple 的 MusicKit JS (https://developer.apple.com/documentation/musickitjs)。我在播放从库端点获取的歌曲时遇到问题,据我所知,这是因为 id 格式。

如果我使用他们的文档示例并将队列设置为 ID 为 1025210938 的专辑,则歌曲播放正常。但是,当从用户的 iCloud 库(即 /v1/me/library/albums 或在 musickitjs 案例中为 music.api.library.albums())获取歌曲时,我得到一个看起来像 l.uUZAkT3 的 id,而当我尝试播放它们时,它们不会做任何事情。

也许更熟悉 Apple Music API 的一般工作原理或使用过 iOS 版 MusicKit 的人可以告诉我为什么会这样,或者如何为用户的图书馆项目获取可用的 ID。

【问题讨论】:

  • 这首歌是露骨的吗?我无法让 MusicKitJS 播放任何 contentRating 为显式的内容。
  • @tomwilson 我可以使用第一种类型的 id 播放显式和非显式歌曲。不玩第二种。
  • 嗯,我设法从我的图书馆播放东西:music.api.library.albums().then((albums) => { music.setQueue({album: albums[0].id }).then(() => { music.play() }) });
  • 非常感谢!我需要then() 上的setQueue,否则它不起作用。在 setQueue 之后直接调用 play 不起作用。奇怪的是它适用于目录中的歌曲,但我想这是有道理的,因为它已经有它需要的 ID,但不确定。
  • 如果我尝试使用以下方法不起作用:music.api.library.songs().then(songs => { music.setQueue({song:songs[0].id})。然后(() => { music.play() }) });

标签: javascript apple-music apple-musickit


【解决方案1】:

大部分 MusicKit JS 都是基于 Promises 的。 setQueue 方法是这些基于 Promise 的方法之一。

特别是setQueue 可以为您获取数据,如果您还没有方便的 API 数据响应。

为了确保数据可以使用,您需要在已解析的 Promise 中执行任何播放功能。

MusicKit.getInstance().setQueue({ album: 'l.abc123'}).then(function(queue) {
    MusicKit.getInstance().play();
});

MusicKit.getInstance().api.library.albums().then(function(albums) {
    MusicKit.getInstance().setQueue(albums[0]).then(function(queue) {
        MusicKit.getInstance().play();
    });
});

【讨论】:

  • MusicKitJS 文档不完整,在 v3 beta 中我不能强制它在队列或歌曲数组中设置整个播放列表。你知道正确的语法吗?例如我尝试`music.setQueue({playlist:'p.kkQrFRr11lQ'}).then((queue)=>{ music.play(); }) `