如何使用Spotipy获取专辑的流派与分类信息
解决方案
问题原因
- Spotify API 中
artist_albums接口返回的是精简专辑对象,本身不携带genre字段 sp.albums批量查询返回的专辑对象genres字段平台填充率较低,很多非热门专辑都会返回空值,这是平台侧的正常情况
可行实现方案
优先取专辑自身标注的流派,无标注时 fallback 到艺术家所属流派(对于Talking Heads这类整体风格统一的乐队,流派匹配准确率很高),修改后的代码如下:
import spotipy from spotipy.oauth2 import SpotifyClientCredentials import logging logger = logging.getLogger('artist_albums') logging.basicConfig(level='INFO') # 初始化Spotipy客户端,需要提前配置自己的Spotify开发者密钥 sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials( client_id="你的CLIENT_ID", client_secret="你的CLIENT_SECRET" )) def get_artist(name): results = sp.search(q='artist:' + name, type='artist') items = results['artists']['items'] if len(items) > 0: return items[0] else: return None def get_album_genres(album_id, artist_genres): # 先取专辑自身的流派 album_detail = sp.album(album_id) album_genres = album_detail.get('genres', []) # 专辑流派为空则用艺术家流派兜底 if not album_genres: album_genres = artist_genres return album_genres def show_artist_albums_with_genres(artist): albums = [] results = sp.artist_albums(artist['id'], album_type='album') albums.extend(results['items']) while results['next']: results = sp.next(results) albums.extend(results['items']) seen = set() albums.sort(key=lambda album: album['name'].lower()) # 提前拿艺术家流派作为兜底 artist_genres = artist.get('genres', []) res = [] for album in albums: name = album['name'] if name not in seen: genres = get_album_genres(album['id'], artist_genres) logger.info(f'ALBUM: {name}, GENRES: {",".join(genres)}') seen.add(name) res.append({ "album_name": name, "genres": genres }) return res artist = get_artist("Talking Heads") albums_with_genres = show_artist_albums_with_genres(artist)
额外说明
如果需要更精准的单专辑流派,可以遍历专辑下所有音轨,调用sp.audio_features接口提取音频特征,通过特征聚类匹配对应流派,不过实现复杂度较高,对于风格统一的艺术家没有必要使用。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

