【问题标题】:How do i get this code to return all the songs in the playlist using spotipy?我如何获得此代码以使用 spotipy 返回播放列表中的所有歌曲?
【发布时间】:2022-12-14 01:14:41
【问题描述】:

我正在尝试使用 spotipy 从播放列表中的歌曲中获取 spotify 音频功能。但是,我只得到播放列表中最后一首歌曲的数据。我的代码如下所示:

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials 
import time
import numpy as np
import pandas

client_id = 'ID'
client_secret = "Secret" 

#Authentication - without user
client_credentials_manager = SpotifyClientCredentials(client_id=client_id, 
client_secret=client_secret)
sp = spotipy.Spotify(client_credentials_manager = client_credentials_manager) 

playlist_link = "https://open.spotify.com/playlist/3VJlwgnV4IaxGK8uIEZMjV? 
si=ca8c506dd5d04663"
playlist_URI = playlist_link.split("/")[-1].split("?")[0]
track_uris = [x["track"]["uri"] for x in sp.playlist_tracks(playlist_URI)["items"]] 

for track in sp.playlist_tracks(playlist_URI)["items"]:
    #URI
    track_uri = track["track"]["uri"]

    #Track name
    track_name = track["track"]["name"]

    #Main Artist
    artist_uri = track["track"]["artists"][0]["uri"]
    artist_info = sp.artist(artist_uri)

    #Name, popularity, genre
    artist_name = track["track"]["artists"][0]["name"]
    artist_pop = artist_info["popularity"]
    artist_genres = artist_info["genres"]
 
    #Album
    album = track["track"]["album"]["name"]
 
    #Popularity of the track
    track_pop = track["track"]["popularity"]

    result = track_name,  sp.audio_features(track_uri)

    result

我已经填写了 ID,但出于隐私考虑,我在此处将其删除。

【问题讨论】:

  • 当您可能想将结果添加到结构并返回时,您正在 for 循环中返回。你到底想返回什么?
  • 几个问题:循环只运行一次,还是运行多次但输出相同的数据?打印出 track_nametrack_uri 会产生什么结果?
  • @Bob 我想返回播放列表中所有歌曲的音频功能,我想把它放在 pandas 数据框中。
  • @MB 循环只运行一次,我只得到最后一首歌的数据一次。打印曲目名称或 track_uri 也会产生最后一首歌曲的名称或 track_uri。

标签: python spotify spotipy


【解决方案1】:

你的问题没有给我运行代码的必要信息,所以我盲目回答了这个问题。

您没有在 for 循环结束时返回,您可能想将结果添加到结构中并返回它。

下面有(猜到)你想要什么。其他一些 cmet:

  • 将常量大写。
  • 使用函数。
  • 尽量避免全局范围。
  • 构建一个列表并在 for 循环结束时返回它。
  • 删除未使用的导入和变量。
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

CLIENT_ID = 'ID'
CLIENT_SECRET = "Secret"
PLAYLIST_LINK = "https://open.spotify.com/playlist/3VJlwgnV4IaxGK8uIEZMjV?si=ca8c506dd5d04663"

CLIENT_CREDENTIALS_MANAGER = SpotifyClientCredentials(
    client_id=CLIENT_ID, client_secret=CLIENT_SECRET
)
SP = spotipy.Spotify(client_credentials_manager=CLIENT_CREDENTIALS_MANAGER)


def get_playlist_uri(playlist_link):
    return playlist_link.split("/")[-1].split("?")[0]


def get_tracks():
    tracks = []
    playlist_uri = get_playlist_uri(PLAYLIST_LINK)
    for track in SP.playlist_tracks(playlist_uri)["items"]:
        track_uri = track["track"]["uri"]
        track_name = track["track"]["name"]
        result = track_name, SP.audio_features(track_uri)
        tracks.append(result)

    return tracks


the_stuff = get_tracks()

编辑

这作为通知弹出,因为有人认为它有帮助。这是我如何做的更新版本。

from spotipy import Spotify
from spotipy.oauth2 import SpotifyClientCredentials


from typing import NamedTuple, List


class Track(NamedTuple):

    uri: str
    name: str
    features: List[str]

    @classmethod
    def from_spotify(cls, spotify: Spotify, track: Dict) -> 'Track':
        uri: str = track["track"]["uri"]
        return cls(
            uri=uri,
            name=track["track"]["name"],
            features=spotify.audio_features(uri)
        )


def get_playlist_uri(playlist_link: str):
    return playlist_link.split("/")[-1].split("?")[0]


def get_tracks_from_playlist(client: Spotify, playlist_name: str) -> Iterable[Track]:
    for track in client.playlist_tracks(playlist_name)["items"]:
        yield Track.from_spotify(client, track)


if __name__ == "__main__":
    CLIENT_ID = 'ID'
    CLIENT_SECRET = "Secret"
    PLAYLIST_LINK = "https://open.spotify.com/playlist/3VJlwgnV4IaxGK8uIEZMjV?si=ca8c506dd5d04663"

    client = SpotifyClientCredentials(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    spotify = Spotify(client_credentials_manager=client)

    playlist = get_playlist_uri(PLAYLIST_LINK)
    tracks = tuple(get_tracks_from_playlist(spotify, playlist))

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多