artishow-api / playlistGeneration.py
Wassleboss's picture
Deploy Clean Final
b1baa61
import pandas as pd
import requests
import time
df_audio = pd.read_csv('df_audio.csv')
def extract_id(filename):
try:
return int(filename.split('_')[0])
except (IndexError, ValueError):
return None
df_audio['id'] = df_audio['filename'].apply(extract_id)
df_audio.dropna(subset=['id'], inplace=True)
df_audio['id'] = df_audio['id'].astype(int)
def has_deezer_preview(track_id: int) -> bool:
try:
response = requests.get(f"https://api.deezer.com/track/{track_id}", timeout=5)
response.raise_for_status()
data = response.json()
if 'preview' in data and data['preview']:
print(f"✅ ID {track_id}: Preview trouvée.")
return True
else:
print(f"❌ ID {track_id}: Pas de preview.")
return False
except requests.exceptions.RequestException as e:
print(f"🔥 Erreur API pour l'ID {track_id}: {e}")
return False
except KeyError:
print(f"❌ ID {track_id}: Réponse invalide ou morceau non trouvé sur Deezer.")
return False
def find_valid_tracks(candidate_df: pd.DataFrame, num_required: int) -> list:
valid_ids = []
shuffled_candidates = candidate_df.sample(frac=1)
for _, row in shuffled_candidates.iterrows():
track_id = int(row['id'])
if has_deezer_preview(track_id):
valid_ids.append(track_id)
time.sleep(0.1)
if len(valid_ids) == num_required:
break
return valid_ids
def playlist_generator_music(genre: str, mood: str):
filtered_df = df_audio[
(df_audio['genre'].str.lower() == genre.lower()) &
(df_audio['mood'].str.lower().str.contains(mood.lower()))
]
print(f"\n--- Recherche de 8 morceaux pour '{genre} {mood}' ---")
print(f"{len(filtered_df)} candidats potentiels trouvés avec le genre et le mood.")
final_playlist = find_valid_tracks(filtered_df, num_required=8)
if len(final_playlist) < 8:
needed = 8 - len(final_playlist)
print(f"\nPas assez de morceaux valides. Il en manque {needed}. Élargissement de la recherche...")
genre_df = df_audio[
(df_audio['genre'].str.lower() == genre.lower()) &
(~df_audio['id'].isin(final_playlist))
]
print(f"{len(genre_df)} candidats supplémentaires trouvés avec seulement le genre.")
if not genre_df.empty:
extra_ids = find_valid_tracks(genre_df, num_required=needed)
final_playlist.extend(extra_ids)
if not final_playlist:
print(f"Aucun morceau valide trouvé pour le genre '{genre}' et le mood '{mood}'.")
print(f"\n✅ Playlist finale générée avec {len(final_playlist)} morceaux.")
return final_playlist
def playlist_generator_mood(mood: str):
filtered_df = df_audio[
df_audio['mood'].str.lower().str.contains(mood.lower())
]
print(f"\n--- Recherche de 8 morceaux pour le mood '{mood}' ---")
print(f"{len(filtered_df)} candidats potentiels trouvés.")
if filtered_df.empty:
print(f"Aucun morceau trouvé pour le mood '{mood}'.")
return []
final_playlist = find_valid_tracks(filtered_df, num_required=8)
print(f"\n✅ Playlist finale générée avec {len(final_playlist)} morceaux.")
return final_playlist