如何使用pylast调用Last.fm API获取热门曲目?
解决方法
1. 正确使用pylast获取Last.fm Top100曲目
pylast中对应Last.fm chart.getTopTracks API的方法是get_top_tracks(),而非你尝试的chart_get_top_tracks()。正确实现代码如下:
import pylast API_KEY = "你的API密钥" API_SECRET = "你的API密钥" # 初始化Last.fm网络对象 network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET) # 获取Top100热门曲目,limit参数指定返回数量 top_tracks = network.get_top_tracks(limit=100) # 遍历曲目,提取名称和艺术家信息 for track in top_tracks: track_name = track.item.name artist_name = track.item.artist.name print(f"{artist_name} - {track_name}")
返回的top_tracks是包含TopItem对象的列表,每个TopItem的item属性为Track对象,可直接获取曲目名和艺术家信息。
2. 将Last.fm曲目转换为Spotify URI
要添加到Spotify播放列表,需先通过Spotify API搜索对应曲目并获取URI。假设你已用spotipy初始化Spotify客户端,可添加如下逻辑:
import spotipy from spotipy.oauth2 import SpotifyOAuth # 初始化Spotify客户端(需确保权限包含播放列表修改) sp = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id="你的Spotify客户端ID", client_secret="你的Spotify客户端密钥", redirect_uri="你的重定向URI", scope="playlist-modify-public playlist-modify-private" )) def get_spotify_uri(track_name, artist_name): # 优先精确匹配艺术家+曲目名 results = sp.search(q=f"track:{track_name} artist:{artist_name}", type="track", limit=1) if results["tracks"]["items"]: return results["tracks"]["items"][0]["uri"] # 精确匹配失败时,尝试仅搜索曲目名 results = sp.search(q=f"track:{track_name}", type="track", limit=1) if results["tracks"]["items"]: return results["tracks"]["items"][0]["uri"] return None # 收集所有有效Spotify URI spotify_uris = [] for track in top_tracks: uri = get_spotify_uri(track.item.name, track.item.artist.name) if uri: spotify_uris.append(uri)
3. 更新Spotify播放列表
结合你已实现的playlist_add_items()方法(或直接使用Spotipy的playlist_replace_items避免重复曲目)更新播放列表:
PLAYLIST_ID = "你的Spotify播放列表ID" # 清空旧曲目(可选,确保播放列表仅保留最新Top100) sp.playlist_replace_items(PLAYLIST_ID, []) # 添加新曲目(Spotify API单次最多支持100个项目,刚好匹配需求) if spotify_uris: sp.playlist_add_items(PLAYLIST_ID, spotify_uris)
4. 实现每10分钟自动更新
使用schedule库实现定时任务,保持播放列表实时更新:
import schedule import time def update_playlist(): # 整合完整流程:获取Top100 -> 转换URI -> 更新播放列表 top_tracks = network.get_top_tracks(limit=100) spotify_uris = [] for track in top_tracks: uri = get_spotify_uri(track.item.name, track.item.artist.name) if uri: spotify_uris.append(uri) if spotify_uris: sp.playlist_replace_items(PLAYLIST_ID, spotify_uris) print("播放列表已完成更新") # 设置每10分钟执行一次更新任务 schedule.every(10).minutes.do(update_playlist) # 启动定时任务循环 while True: schedule.run_pending() time.sleep(1)
注意事项
- 确保Last.fm和Spotify的API密钥、权限配置正确,避免因权限不足报错。
- 部分Last.fm曲目可能未在Spotify收录,可根据需求调整搜索策略或跳过无效条目。
- 若需后台运行脚本,可使用Linux的
nohup或Windows的任务计划程序。
内容的提问来源于stack exchange,提问作者zcythe
相关产品推荐
相关产品推荐

