[GH-ISSUE #1105] Issue with sp.track(track_id) function freezing code execution #657

Closed
opened 2026-02-28 00:00:35 +03:00 by kerem · 3 comments
Owner

Originally created by @JosepVargasf on GitHub (May 9, 2024).
Original GitHub issue: https://github.com/spotipy-dev/spotipy/issues/1105

Hello everyone.

I am encountering an issue while using the sp.track(track_id) function in my code. Whenever I execute this function, my code freezes, seemingly awaiting a response from Spotify that never arrives. I suspect there might be a delay or lack of response from Spotify's end. Could someone provide assistance or guidance on how to resolve this issue?

`from .escribir_metadata import escribir_metadata

def obtener_genero_cancion(spotify, track_id):
# Obtener los detalles de la pista
track_data = spotify.track(track_id)

# Inicializar una lista para almacenar los géneros de los artistas
artist_genres = []

# Obtener los géneros de cada artista asociado a la canción
for artist in track_data["artists"]:
    artist_data = spotify.artist(artist["id"])
    artist_genres.extend(artist_data["genres"])

# Contar la frecuencia de cada género
genre_counts = {}
for genre in artist_genres:
    genre_counts[genre] = genre_counts.get(genre, 0) + 1

# Obtener el género más común
if genre_counts:
    common_genre = max(genre_counts, key=genre_counts.get)
else:
    common_genre = None

return common_genre

def obtener_metadata(sp, funcion_opciones):

opciones = funcion_opciones(["Carpeta", "Playlist"])
lista_total_a_analizar = []

for opcion in opciones:
    print("Ejecutando:", opcion)
    if opcion == "Carpeta":
        from Data_general.obtencion_uris_canciones_desde_libreria import obtencion_uris_canciones_desde_libreria
        from Data_general.obtencion_libreria_personal import canciones_de_mi_librería, mi_libreria
        lista_total_a_analizar, canciones_no_encontradas = obtencion_uris_canciones_desde_libreria(canciones_de_mi_librería, [], sp)
        print("No se han encontrado las siguientes canciones:", canciones_no_encontradas)
        print("Se han encontrado las siguientes canciones:", lista_total_a_analizar)
    


    elif opcion == "Playlist":
        from Data_general.obtener_lista_total import lista_total, sp
        lista_total_a_analizar = lista_total
        print("Se han encontrado las siguientes canciones:", lista_total_a_analizar)

lista_canciones_con_metadata = []


for song in lista_total_a_analizar:
    print("Obteniendo metadata de", song[0])
    track_name = song[0]
    track_id = song[1]
    print(f'Nombre: {track_name}\nId: {track_id}')
    track_data = sp.track(track_id)
    print("Obtenida la data de", song[0])
    audio_features = sp.audio_features(track_id)
    print("Obtenido el las features de audio de", song[0])
    try:
        release_year = track_data["album"]["release_date"][:4]  # Extraer año de la fecha de lanzamiento
        print("Obtenido el año de", track_name)
    except KeyError:
        release_year = None  # Manejar de forma elegante la falta de fecha de lanzamiento
    album_name = track_data["album"]["name"]
    print("Obtenido el album de", track_name)
    popularity = track_data["popularity"]
    print("Obtenida la popularidad de", track_name)
    danceability = audio_features[0]["danceability"]
    print("Obtenida la danceabilidad de", track_name)
    energy = audio_features[0]["energy"]
    print("Obtenida la energia de", track_name)
    bpm = audio_features[0]["tempo"]
    print("Obtenido el tempo de", track_name)
    
    # # Obtener el género del álbum
    # album_id = track_data["album"]["id"]
    # album_data = sp.album(album_id)
    # album_genres = album_data["genres"]
    # print(album_data)
    # # Si hay varios géneros, selecciona el primero de la lista
    # if album_genres:
    #     album_genre = album_genres[0]
    # else:
    #    album_genre = None
    
    genero = obtener_genero_cancion(sp,track_id)
    print("Obtenido el genero de", track_name)
    if genero == None:
        genero = " "

    lista_canciones_con_metadata.append({
        "nombre": track_name, 
        "Bpm": bpm,
        "año": release_year,
        "album": album_name,
        "genero": genero,  # Agregar el género del álbum
        "popularidad": popularity,
        "Bailable": danceability,
        "Energía": energy
    })
    print("Escrita!")

print(lista_canciones_con_metadata)

escirbir_metadata = funcion_opciones(["Si", "No"])
for opcion in escirbir_metadata:
    if opcion == "Si":
        escribir_metadata(lista_canciones_con_metadata, mi_libreria)
    else:
        print("Chao")`
Originally created by @JosepVargasf on GitHub (May 9, 2024). Original GitHub issue: https://github.com/spotipy-dev/spotipy/issues/1105 <!--- Please make sure you've: - read the FAQ https://github.com/plamere/spotipy/blob/master/FAQ.md - read the documentation https://spotipy.readthedocs.io/en/latest/ - searched older issues If your question is about code, please share the code you are using ---> Hello everyone. I am encountering an issue while using the sp.track(track_id) function in my code. Whenever I execute this function, my code freezes, seemingly awaiting a response from Spotify that never arrives. I suspect there might be a delay or lack of response from Spotify's end. Could someone provide assistance or guidance on how to resolve this issue? `from .escribir_metadata import escribir_metadata def obtener_genero_cancion(spotify, track_id): # Obtener los detalles de la pista track_data = spotify.track(track_id) # Inicializar una lista para almacenar los géneros de los artistas artist_genres = [] # Obtener los géneros de cada artista asociado a la canción for artist in track_data["artists"]: artist_data = spotify.artist(artist["id"]) artist_genres.extend(artist_data["genres"]) # Contar la frecuencia de cada género genre_counts = {} for genre in artist_genres: genre_counts[genre] = genre_counts.get(genre, 0) + 1 # Obtener el género más común if genre_counts: common_genre = max(genre_counts, key=genre_counts.get) else: common_genre = None return common_genre def obtener_metadata(sp, funcion_opciones): opciones = funcion_opciones(["Carpeta", "Playlist"]) lista_total_a_analizar = [] for opcion in opciones: print("Ejecutando:", opcion) if opcion == "Carpeta": from Data_general.obtencion_uris_canciones_desde_libreria import obtencion_uris_canciones_desde_libreria from Data_general.obtencion_libreria_personal import canciones_de_mi_librería, mi_libreria lista_total_a_analizar, canciones_no_encontradas = obtencion_uris_canciones_desde_libreria(canciones_de_mi_librería, [], sp) print("No se han encontrado las siguientes canciones:", canciones_no_encontradas) print("Se han encontrado las siguientes canciones:", lista_total_a_analizar) elif opcion == "Playlist": from Data_general.obtener_lista_total import lista_total, sp lista_total_a_analizar = lista_total print("Se han encontrado las siguientes canciones:", lista_total_a_analizar) lista_canciones_con_metadata = [] for song in lista_total_a_analizar: print("Obteniendo metadata de", song[0]) track_name = song[0] track_id = song[1] print(f'Nombre: {track_name}\nId: {track_id}') track_data = sp.track(track_id) print("Obtenida la data de", song[0]) audio_features = sp.audio_features(track_id) print("Obtenido el las features de audio de", song[0]) try: release_year = track_data["album"]["release_date"][:4] # Extraer año de la fecha de lanzamiento print("Obtenido el año de", track_name) except KeyError: release_year = None # Manejar de forma elegante la falta de fecha de lanzamiento album_name = track_data["album"]["name"] print("Obtenido el album de", track_name) popularity = track_data["popularity"] print("Obtenida la popularidad de", track_name) danceability = audio_features[0]["danceability"] print("Obtenida la danceabilidad de", track_name) energy = audio_features[0]["energy"] print("Obtenida la energia de", track_name) bpm = audio_features[0]["tempo"] print("Obtenido el tempo de", track_name) # # Obtener el género del álbum # album_id = track_data["album"]["id"] # album_data = sp.album(album_id) # album_genres = album_data["genres"] # print(album_data) # # Si hay varios géneros, selecciona el primero de la lista # if album_genres: # album_genre = album_genres[0] # else: # album_genre = None genero = obtener_genero_cancion(sp,track_id) print("Obtenido el genero de", track_name) if genero == None: genero = " " lista_canciones_con_metadata.append({ "nombre": track_name, "Bpm": bpm, "año": release_year, "album": album_name, "genero": genero, # Agregar el género del álbum "popularidad": popularity, "Bailable": danceability, "Energía": energy }) print("Escrita!") print(lista_canciones_con_metadata) escirbir_metadata = funcion_opciones(["Si", "No"]) for opcion in escirbir_metadata: if opcion == "Si": escribir_metadata(lista_canciones_con_metadata, mi_libreria) else: print("Chao")`
kerem 2026-02-28 00:00:35 +03:00
  • closed this issue
  • added the
    question
    label
Author
Owner

@dieser-niko commented on GitHub (May 9, 2024):

The freezing effect is due to the urllib library being triggered by a rate limit. urllib basically waits until the rate limit is gone.

If you want to throw an error instead, you can pass retries=0 to the Spotify init function like this:

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials

sp = spotipy.Spotify(retries=0,
                     auth_manager=SpotifyClientCredentials(client_id="YOUR_APP_CLIENT_ID",
                                                           client_secret="YOUR_APP_CLIENT_SECRET"))

results = sp.search(q='weezer', limit=20)
for idx, track in enumerate(results['tracks']['items']):
    print(idx, track['name'])
<!-- gh-comment-id:2103092077 --> @dieser-niko commented on GitHub (May 9, 2024): The freezing effect is due to the urllib library being triggered by a rate limit. urllib basically waits until the rate limit is gone. If you want to throw an error instead, you can pass `retries=0` to the Spotify init function like this: ```python3 import spotipy from spotipy.oauth2 import SpotifyClientCredentials sp = spotipy.Spotify(retries=0, auth_manager=SpotifyClientCredentials(client_id="YOUR_APP_CLIENT_ID", client_secret="YOUR_APP_CLIENT_SECRET")) results = sp.search(q='weezer', limit=20) for idx, track in enumerate(results['tracks']['items']): print(idx, track['name']) ```
Author
Owner

@dieser-niko commented on GitHub (May 17, 2024):

Closing as the problem seems to have been solved.

<!-- gh-comment-id:2117415788 --> @dieser-niko commented on GitHub (May 17, 2024): Closing as the problem seems to have been solved.
Author
Owner

@dieser-niko commented on GitHub (Jan 3, 2025):

Hi @JosepVargasf, just a quick heads up, we have released a new version (2.25.0) that prints a warning when a limit is reached. I'm not sure if you're still using retries=0, but if not, this change will warn you when you reach a limit.

<!-- gh-comment-id:2569217563 --> @dieser-niko commented on GitHub (Jan 3, 2025): Hi @JosepVargasf, just a quick heads up, we have released a new version (2.25.0) that prints a warning when a limit is reached. I'm not sure if you're still using `retries=0`, but if not, this change will warn you when you reach a limit.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/spotipy#657
No description provided.