如何使用Spotipy获取此代码以返回播放列表中的所有歌曲?

发布于 2025-01-21 03:01:05 字数 1403 浏览 5 评论 0原文

我正在尝试使用Spotipy中的播放列表中的歌曲中获得Spotify Audiofeatures。但是,我只在播放列表中获取最后一首歌的数据。我的代码看起来像这样:

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,但我在此处将其删除以进行隐私。

I am trying to get the spotify audiofeatures from the songs in a playlist using spotipy. However, I only get the data of the last song in the playlist. My code looks like this:

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

I have filled in the ID's but I removed them here for privacy.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原野 2025-01-28 03:01:05

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

您不会在 for 循环结束时返回,并且您可能希望将结果添加到结构中并返回该结果。

下面已经(猜到)你想要什么了。其他评论:

  • 将常数大写。
  • 使用函数。
  • 尝试完全避免全局范围。
  • 构建一个列表并在 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):
    # this should use url_parse or something...
    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))

Your question didn't give me the necessary information to run the code, so I have answered this blind.

You are not returning at the end of the for loop and you probably want to add the results to a structure and return that.

The below has (guessed) what you want. Few other comments:

  • Capitalise your constants.
  • Use functions.
  • Try to avoid global scope entirely.
  • Build a list and at the end of the for loop return it.
  • Remove unused imports and variables.
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()

Edit

This popped up as a notification as someone thought it was helpful. Here is a more updated version of how I would do it.

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):
    # this should use url_parse or something...
    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))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文