Spotify javascript API - 在播放列表中获取歌曲的类型

Posted

技术标签:

【中文标题】Spotify javascript API - 在播放列表中获取歌曲的类型【英文标题】:Spotify javascript API - getting the genre of a song in a playlist 【发布时间】:2017-05-04 14:12:45 【问题描述】:

我目前正在使用非常酷的应用程序 Exportify (https://github.com/watsonbox/exportify) 将 Spotify 播放列表导出为 CSV。

我的 javascript 知识很糟糕,但我目前正在尝试包含每个曲目的流派,但我无法检索它。

我假设:

我必须通过艺术家了解流派。 播放列表 API 返回一个简单的艺术家对象,该对象只能获取 ID,而不是流派 (https://developer.spotify.com/web-api/get-playlists-tracks/) 要获得流派,我必须使用艺术家 ID (https://developer.spotify.com/web-api/object-model/#artist-object-full) 进一步查找艺术家

我可以通过添加获取艺术家ID

item.track.artists.map(function (artist) 
  return artist.id
).join(', '),

exportify.js 文件中的以下代码。

var tracks = responses.map(function (response) 
  return response.items.map(function (item) 
    return [
      item.track.uri,
      item.track.id,
      item.track.name,
      item.track.artists.map(function (artist) 
        return artist.name
      ).join(', '),
      item.track.artists.map(function (artist) 
        return artist.id
      ).join(', '),
      item.track.album.name,
      item.track.disc_number,
      item.track.track_number,
      item.track.duration_ms,
      item.added_by == null ? '' : item.added_by.uri,
      item.added_at
    ].map(function (track) 
      return '"' + track + '"';
    )
  );
);

谁能告诉我如何根据艺术家 ID 获取艺术家流派并将其添加为另一列?

谢谢

克里斯

【问题讨论】:

【参考方案1】:

在 Spotify 中使用“获取艺术家”端点:

https://developer.spotify.com/web-api/get-artist/

调用此端点将为您提供给定艺术家 ID 的艺术家的流派。

【讨论】:

【参考方案2】:

正如 Potray 所说,您可以连接到端点 getArtist。更具体地说,返回的 JSON 将有一个流派键。流派键直接指向流派数组。

response.genres 将访问这个数组。

您可以在RapidAPI here. 上进行测试,我已专门将您链接到 getArtist 端点。在这里你可以填写artist_id,点击测试,然后查看示例响应。 RapidAPI 还会生成一个代码 sn-p,因此您可以直接将 API 调用复制并粘贴到您自己的代码中。

在这里,我使用 Red Hot Chili Peppers artist_id "0L8ExT028jH3ddEcZwqJJ5" 测试 getArtist 端点:

您会注意到流派数组包含 5 个项目:['alternative rock', 'funk metal', 'funk rock', 'permanent wave', 'rock']

如果您直接点击右侧响应的 CODE 并登录,您将能够访问代码 sn-p,并将其直接粘贴到您的代码中。一个例子是:

【讨论】:

【参考方案3】:

请注意,此处引用的类型与您在大多数 api 中实际遇到的类型不匹配(例如,不匹配 track.artist.genres

https://developer.spotify.com/console/get-available-genre-seeds/

这个问题很突出: https://github.com/spotify/web-api/issues/410

【讨论】:

【参考方案4】:

我实现了! P>

下面是来自https://github.com/pavelkomarov/exportify/blob/master/exportify.js 的函数,它可以进行所有必要的 API 查询。我的apiCall 函数也在那个文件中。它的使用fetch P>

    首先,我从播放列表中发出请求,请求歌曲块。 然后我将这些消息聚合到一个数据表和一组艺术家中。 然后我使用艺术家集合来查询流派信息。 然后我将其加入数据并写入 csv。

因为这一切都发生在网络上,所以每个新步骤都必须包含在 .then() 中,这取决于之前的对象是否得到解决。值得庆幸的是,近年来 JavaScript 在这方面变得更加优雅。 https://eloquentjavascript.net/11_async.html

实时应用程序生活在here。我还创建了a notebook 来分析输出。

csvData(access_token, playlist) 
    // Make asynchronous API calls for 100 songs at a time, and put the results (all Promises) in a list.
    let requests = [];
    for (let offset = 0; offset < playlist.tracks.total; offset = offset + 100) 
        requests.push(utils.apiCall(playlist.tracks.href.split('?')[0] + '?offset=' + offset + '&limit=100',
                access_token));
    

    // "returns a single Promise that resolves when all of the promises passed as an iterable have resolved"
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
    let artist_hrefs = new Set();
    let data_promise = Promise.all(requests).then(responses => 
        return responses.map(response =>  // apply to all responses
            return response.items.map(song =>  // appy to all songs in each response
                song.track.artists.forEach(a =>  artist_hrefs.add(a.href) );
                return [song.track.uri, '"'+song.track.name.replace(/"/g,'')+'"', '"'+song.track.album.name.replace(/"/g,'')+'"',
                    song.track.duration_ms, song.track.popularity, song.track.album.release_date,
                    '"'+song.track.artists.map(artist =>  return artist.name ).join(',')+'"',
                    song.added_by.uri, song.added_at]
            );
        );
    );

    // Make queries on all the artists, because this json is where genre information lives. Unfortunately this
    // means a second wave of traffic.
    let genre_promise = data_promise.then(() => 
        let artists_promises = Array.from(artist_hrefs).map(href => utils.apiCall(href, access_token));
        return Promise.all(artists_promises).then(responses => 
          let artist_genres = ;
          responses.forEach(artist =>  artist_genres[artist.name] = artist.genres.join(','); );
          return artist_genres;
        );
    );

    // join genres to the table, label the columns, and put all data in a single csv string
    return Promise.all([data_promise, genre_promise]).then(values => 
        [data, artist_genres] = values;

        data = data.flat();
        data.forEach(row => 
            artists = row[6].substring(1, row[6].length-1).split(','); // strip the quotes
            deduplicated_genres = new Set(artists.map(a => artist_genres[a]).join(",").split(",")); // join and split and take set
            row.push('"'+Array.from(deduplicated_genres).filter(x => x != "").join(",")+'"'); // remove empty strings
        );
        data.unshift(["Spotify URI", "Track Name", "Album Name", "Duration (ms)",
            "Popularity", "Release Date", "Artist Name(s)", "Added By", "Added At", "Genres"]);

        csv = '';
        data.forEach(row =>  csv += row.join(",") + "\n" );
        return csv;
    );
,

【讨论】:

以上是关于Spotify javascript API - 在播放列表中获取歌曲的类型的主要内容,如果未能解决你的问题,请参考以下文章

从前端 JavaScript 代码获取 Spotify API 访问令牌

Spotify javascript API - 在播放列表中获取歌曲的类型

允许前端 JavaScript POST 请求到 https://accounts.spotify.com/api/token 端点

在 Spotify API Javascript + 添加到服务器中搜索曲目

setImage 不使用 Spotify Apps API 在 JavaScript 中显示新图像

使用 Spotify API 播放全长歌曲