Весь код находится в классе со следующим конструктором
Код: Выделить всё
def __init__(self):
# Load credentials from environment variables
self._spotify_client_id = os.getenv("SPOTIFY_CLIENT_ID")
self._spotify_client_secret = os.getenv("SPOTIFY_CLIENT_SECRET")
self._spotify_redirect_uri = os.getenv("SPOTIFY_REDIRECT_URI")
self._scope = "user-top-read user-read-recently-played user-library-read playlist-read-private playlist-read-collaborative"
# Check if api keys are available
if not self._spotify_client_id or not self._spotify_client_secret:
raise ValueError("Spotify client ID and secret must be set in the environment variables.")
# Authenticate with Spotify using OAuth2
self._sp = spotipy.Spotify(auth_manager=SpotifyOAuth(
client_id=self._spotify_client_id,
client_secret=self._spotify_client_secret,
redirect_uri=self._spotify_redirect_uri,
scope=self._scope,
cache_path= os.path.join(os.getenv("SPOTIFY_CACHE_PATH") , ".cache")
))
#Private variables
self._user_id = ""
self._user_name = ""
self._Playlist_Details = []
self._current_playlist_content = []
self._liked_playlist_content = []
перед запуском get_List_of_playlist() мы запускаем функцию для получите user_id и user_name и назначьте их частным переменным класса, которые инициализируются в конструкторе.
Функция получения user_id выглядит следующим образом:
Код: Выделить всё
def get_user_id(self):
"""
Fetch the current authenticated user's Spotify user ID.
Args:
sp: Spotipy client object.
Returns:
str: The user's Spotify ID.
str: The user's Spotify display name.
"""
try:
user_profile = self._sp.current_user()
# print(f"\n user profile details from response: {user_profile}")
user_id = user_profile.get('id')
user_name = user_profile.get('display_name')
self._user_id = user_id
self._user_name = user_name
return self._user_id,self._user_name
except Exception as e:
print(f"Error fetching user ID: {e}")
return None
Код: Выделить всё
def get_list_of_playlist(self,limit = 20):
"""
Fetch playlists of a specific Spotify user.
Args:
limit (int): Number of playlists to fetch per request.
Returns:
list: A list of playlists with names and IDs.
"""
try:
print(f"\nuser_id : {self._user_id}")
results = self._sp.user_playlists(user=self._user_id, limit=limit)
print(results)
playlists = [
{'name': item['name'], 'id': item['id']}
for item in results['items']
]
print(playlists)
#update class variable
self._Playlist_Details = playlists
return playlists
except Exception as e:
print(f"Error fetching user playlists: {e}")
return []
Код: Выделить всё
[{"name":
,"id":}
{"name":,"id":}
{"name":,"id":}
.
.
.]
Код: Выделить всё
sa.get_user_id()
list_of_playlists = sa.get_list_of_playlist()
print(f"\nLIST OF PLAYLISTS")
list_of_playlist_df = pd.DataFrame(list_of_playlists)
print(list_of_playlist_df)
вывод функции get_List_of_playlist():
Код: Выделить всё
user_id :
{'href': 'https://api.spotify.com/v1/users//playlists?offset=0&limit=20', 'limit': 20, 'next': None, 'offset': 0, 'previous': None, 'total': 0, 'items': []}
[]
LIST OF PLAYLISTS
Empty DataFrame
Columns: []
Index: []
Я столкнулся с проблемой с API, поскольку он не работает. много раз выполнять такие задачи, как получение списка списка воспроизведения.
Это важная функция в моем коде, поскольку она заполняет self._Playlist_Details списком списка воспроизведения, и после этого я извлечет содержимое плейлиста с помощью функции get_playlist_content(self , playlist_id), которая вернет имя playlist_name из переменной self._Playlist_Details, соответствующее предоставленному playlist_id и содержимому списка воспроизведения.
Эти подробности будут переданы в save_user_data_csv(playlist_id), который сохранит содержимое списка воспроизведения в виде файла csv с именем playlist_name и соответствующим ему именем. content.
Функция получения содержимого плейлиста по идентификатору следующая:
Код: Выделить всё
def get_playlist_content(self , playlist_id):
"""
Fetch the contents of a Spotify playlist by ID and return details like
song name, artist name, genre, and album name.
Args:
playlist_id (str): The Spotify playlist ID.
Returns:
list: A list of dictionaries containing song details.
"""
try:
self._results = self._sp.playlist_items(playlist_id, additional_types=('track',))
self._playlist_content = []
self._playlist_name = ""
for playlist in self._Playlist_Details:
if playlist['id'] == playlist_id:
self._playlist_name = playlist['name']
while self._results:
for item in self._results['items']:
track = item['track']
#extract details from track
self._song_name = track['name']
self._artist_name = track['artists'][0]['name']
self._artist_id = track['artists'][0]['id']
self._album_name = track['album']['name']
self._artist_info = self._sp.artist(self._artist_id)
self._genre = ', '.join(self._artist_info['genres']) if self._artist_info['genres'] else 'Unknown'
#append details to self._playlist_content
self._playlist_content.append({
'song_name': self._song_name,
'artist_name': self._artist_name,
'artist_id': self._artist_id,
'genre': self._genre,
'album_name': self._album_name
})
# Get the next page of results if available
self._results = self._sp.next(self._results) if self._results['next'] else None
self._current_playlist_content = self._playlist_content
#print(self._current_playlist_content)
return self._playlist_name , self._playlist_content
except Exception as e:
print(f"Error fetching playlist content: {e}")
return "",[]
Код: Выделить всё
playlist_id = input("\nEnter playlist ID: ")
playlist_name , playlist_content = sa.get_playlist_content(playlist_id=playlist_id)
# print(f"Current playlist content: {sa._current_playlist_content}")
print(f"\nPLAYLIST {playlist_name} CONTENT\n")
playlist_df = pd.DataFrame(playlist_content)
print(playlist_df)
print(f"\n\nSAVING {playlist_name} INTO A CSV FILE\n\n")
sa.save_user_data_csv(playlist_id= playlist_id)
print("\n\nSAVING LIKED SONGS FINISHED")
Код: Выделить всё
Enter playlist ID:
PLAYLIST CONTENT
song_name artist_name artist_id genre album_name
0 Schism TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... Lateralus
1 Forty Six & 2 TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... Ænima
2 The Pot TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... 10,000 Days
3 Sober TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... Undertow
4 Stinkfist TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... Ænima
5 Vicarious TOOL 2yEwvVSSSUkcLeSTNyHKh8 alternative metal, art rock, nu metal, post-gr... 10,000 Days
SAVING INTO A CSV FILE
user_id :
{'href': 'https://api.spotify.com/v1/users//playlists?offset=0&limit=20', 'limit': 20, 'next': None, 'offset': 0, 'previous': None, 'total': 0, 'items': []}
[]
[]
: None
An error occurred: Playlist with ID '' not found.
SAVING LIKED SONGS FINISHED
Мой код может извлекать содержимое плейлиста, но не может получить список плейлиста
для заполнения переменной self._Playlist_Details, которая мне нужно, чтобы функция сохранения CSV работала.
может ли кто-нибудь сказать мне, почему я не могу получить список плейлистов?
я изначально использовал current_user_playlists() функция, но она решила перестать работать аналогичным образом, поэтому я решил использовать функцию user_playlists() Spotipy, но даже она получает нулевой ответ от API Spotify.
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-function
Мобильная версия