Spaces:
Sleeping
Sleeping
| 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 | |