File size: 3,367 Bytes
b1baa61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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