First functions

This commit is contained in:
Lucas
2024-11-14 10:14:57 +01:00
parent a4e264e255
commit 44bedf7253
8 changed files with 30737 additions and 13 deletions

143
__init__.py Executable file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python3
import json
from spotify import authentify, get_tracks_bpm, get_playlist_tracks_with_metadata, get_original_release_year
import spotipy
SCOPE = "user-library-read playlist-read-private playlist-modify-private"
CLIENT_ID = "1ad3f973e5924940bec0bcbf1adf7475"
CLIENT_SECRET = "e0601efe11ee4e31b27b255c06d70a38"
def main():
api = authentify(CLIENT_ID, CLIENT_SECRET, SCOPE)
# print(get_tracks_bpm(api,["229hxLehs5xb5EQirOxOqC","0sQfjbECEGyfnrgUS7sbZK"]))
print(get_original_release_year(api,"229hxLehs5xb5EQirOxOqC"))
if __name__ == "__main__":
main()
# # Fonction pour récupérer toutes les playlists d'un utilisateur, hors celles qu'il a créées
# def get_favorited_playlists_not_owned_by_user(user_id):
# playlists = []
# results = api.current_user_playlists()
# # Parcours de toutes les playlists
# while results:
# for playlist in results['items']:
# # Vérifie si le propriétaire de la playlist est différent de l'utilisateur
# if playlist['owner']['id'] == user_id:
# playlists.append({
# 'name': playlist['name'],
# 'owner': playlist['owner']['display_name'],
# 'url': playlist['external_urls']['spotify']
# })
# # Récupération de la page suivante si elle existe
# results = api.next(results) if results['next'] else None
# return playlists
# # Exécution et affichage des playlists récupérées
# playlists = get_favorited_playlists_not_owned_by_user(user_id)
# print("Playlists aimées mais non créées par l'utilisateur :")
# for playlist in playlists:
# print(f"{playlist['name']}")
# # Remplacez par les noms de vos playlists
# nom_playlists = ["Films","Arabia","Pop Rock","Electrance","Dance Old","Salsa","Reggaeton","Drum&Bass","Asia","Bachata","Dance Old FR","Africa","Française Old","Italia Old","Italia New","Classique","Dance New","Dessins Animés","Electro House","Folk","Humour","Latino","Métal","Pop FR","Pop EN","Pop","Rap","Rap FR","R&B","R&B FR","Reggae","Rock FR","Rock fast","Rock slow","Electro Techno","Trap slow","Trap speed","Disco Soul","Swing"]
# # Fonction pour obtenir l'ID d'une playlist par son nom en parcourant toutes les playlists de l'utilisateur
# def get_playlist_id(nom):
# playlists = []
# results = api.current_user_playlists()
# playlists.extend(results['items'])
# # Pagination pour récupérer toutes les playlists si l'utilisateur en a plus de 50
# while results['next']:
# results = api.next(results)
# playlists.extend(results['items'])
# # Recherche de la playlist par nom
# for playlist in playlists:
# if playlist['name'] == nom:
# return playlist['id']
# print(f"Playlist '{nom}' non trouvée.")
# return None
# # Fonction pour récupérer tous les morceaux d'une playlist
# def obtenir_morceaux_playlist(playlist_id):
# morceaux = []
# results = api.playlist_tracks(playlist_id, offset=0)
# morceaux.extend(results['items'])
# # Pagination pour obtenir tous les morceaux si plus de 100
# while results['next']:
# results = api.next(results)
# morceaux.extend(results['items'])
# return morceaux
# # Récupérer les morceaux par playlist et détecter les doublons
# morceaux_par_playlist = {}
# morceaux_doublons = {}
# for nom in nom_playlists:
# playlist_id = get_playlist_id(nom)
# if playlist_id:
# morceaux = obtenir_morceaux_playlist(playlist_id)
# for morceau in morceaux:
# titre = morceau['track']['name']
# artiste = morceau['track']['artists'][0]['name']
# identifiant = f"{titre} - {artiste}"
# if identifiant in morceaux_par_playlist:
# morceaux_par_playlist[identifiant].append(nom)
# morceaux_doublons[identifiant] = morceaux_par_playlist[identifiant]
# else:
# morceaux_par_playlist[identifiant] = [nom]
# # Afficher les morceaux qui sont dans plusieurs playlists
# print("Chansons présentes dans plusieurs playlists :")
# for morceau, playlists in morceaux_doublons.items():
# print(f"{morceau} est dans les playlists : {', '.join(playlists)}")
# if not morceaux_doublons:
# print("Aucun doublon trouvé.")
# # Récupérer toutes les pistes d'une playlist
# def get_playlist_tracks(playlist_id):
# tracks = []
# results = api.playlist_items(playlist_id)
# tracks.extend(results['items'])
# while results['next']:
# results = api.next(results)
# tracks.extend(results['items'])
# return [track['track']['id'] for track in tracks if track['track']]
# # Supprimer les pistes spécifiées d'une playlist
# def remove_tracks_from_playlist(playlist_id, track_ids):
# if track_ids:
# api.playlist_remove_all_occurrences_of_items(playlist_id, track_ids)
# # Identifiants des playlists
# playlist_a_trier_id = get_playlist_id("A trier")
# playlist_everything_id = get_playlist_id("[$Everything] save")
# if playlist_a_trier_id and playlist_everything_id:
# # Obtenir les pistes de chaque playlist
# a_trier_tracks = set(get_playlist_tracks(playlist_a_trier_id))
# everything_tracks = set(get_playlist_tracks(playlist_everything_id))
# # Trouver les doublons
# duplicate_tracks = list(a_trier_tracks.intersection(everything_tracks))
# # Supprimer les doublons de la playlist "A trier"
# if duplicate_tracks:
# remove_tracks_from_playlist(playlist_a_trier_id, duplicate_tracks)
# print(f"{len(duplicate_tracks)} chansons en doublon supprimées de la playlist 'A trier'.")
# else:
# print("Aucun doublon trouvé.")
# else:
# print("Erreur : une ou plusieurs playlists n'ont pas été trouvées.")

Binary file not shown.

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env python3
import spotipy
from spotipy.oauth2 import SpotifyOAuth
scope = "user-library-read"
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id="1ad3f973e5924940bec0bcbf1adf7475",client_secret="e0601efe11ee4e31b27b255c06d70a38",redirect_uri="http://127.0.0.1:8888",scope=scope))
results = sp.current_user_saved_tracks()
for idx, item in enumerate(results['items']):
track = item['track']
print(idx, track['artists'][0]['name'], " - ", track['name'])

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
spotipy==2.24.0

30450
response.json Normal file

File diff suppressed because one or more lines are too long

42
response2.json Normal file
View File

@@ -0,0 +1,42 @@
[
{
"danceability": 0.666,
"energy": 0.557,
"key": 3,
"loudness": -7.011,
"mode": 1,
"speechiness": 0.0303,
"acousticness": 0.465,
"instrumentalness": 0,
"liveness": 0.0936,
"valence": 0.138,
"tempo": 126.037,
"type": "audio_features",
"id": "229hxLehs5xb5EQirOxOqC",
"uri": "spotify:track:229hxLehs5xb5EQirOxOqC",
"track_href": "https://api.spotify.com/v1/tracks/229hxLehs5xb5EQirOxOqC",
"analysis_url": "https://api.spotify.com/v1/audio-analysis/229hxLehs5xb5EQirOxOqC",
"duration_ms": 198253,
"time_signature": 4
},
{
"danceability": 0.63,
"energy": 0.823,
"key": 8,
"loudness": -6.425,
"mode": 1,
"speechiness": 0.0433,
"acousticness": 0.485,
"instrumentalness": 0.593,
"liveness": 0.0982,
"valence": 0.493,
"tempo": 175.093,
"type": "audio_features",
"id": "0sQfjbECEGyfnrgUS7sbZK",
"uri": "spotify:track:0sQfjbECEGyfnrgUS7sbZK",
"track_href": "https://api.spotify.com/v1/tracks/0sQfjbECEGyfnrgUS7sbZK",
"analysis_url": "https://api.spotify.com/v1/audio-analysis/0sQfjbECEGyfnrgUS7sbZK",
"duration_ms": 158120,
"time_signature": 4
}
]

85
spotify.py Normal file
View File

@@ -0,0 +1,85 @@
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import json
import requests
"""
User functions
"""
def authentify(client_id,client_secret,scope):
api = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id="1ad3f973e5924940bec0bcbf1adf7475",client_secret="e0601efe11ee4e31b27b255c06d70a38",redirect_uri="http://127.0.0.1:8888",scope=scope))
return api
def get_user_id(api):
return api.current_user()['id']
"""
Tracks functions
"""
def get_original_release_year(api, track_id):
response = api.track(track_id)
title = response['artists'][0]['name']
artist = ['name']
url = "https://musicbrainz.org/ws/2/recording/"
params = {
"query": f"{title} AND artist:{artist}",
"fmt": "json"
}
response = requests.get(url, params=params)
data = response.json()
# Traitement de la première date de sortie si disponible
if data['recordings']:
release_date = data['recordings'][0]['first-release-date']
return release_date[:4] # Renvoie uniquement l'année
return None
# Max 100 tracks
def get_tracks_bpm(api,tracks):
response = api.audio_features(tracks)
tempos = ['{:.1f}'.format(track["tempo"]) for track in response]
return tempos
"""
Playlists functions
"""
def get_playlist_data(api, playlist_id):
response = api.playlist_tracks(playlist_id)
def get_playlist_tracks_with_metadata(api, playlist_id):
results = api.playlist_tracks(playlist_id)
tracks = results['items']
for idx, item in enumerate(tracks):
track = item['track']
track_name = track['name']
artist_name = track['artists'][0]['name']
album_id = track['album']['id']
# Récupération de l'année de sortie via l'album
album_info = api.album(album_id)
release_year = album_info['release_date'][:4]
# Récupération du BPM via les caractéristiques audio
track_features = api.audio_analysis(track['id'])[0]
bpm = track_features['tempo']
# Affichage des informations
print(f"{idx + 1}: {track_name} by {artist_name} | Year: {release_year} | BPM: {bpm}")
def get_playlist_id(api, nom):
playlists = []
results = api.current_user_playlists()
playlists.extend(results['items'])
# Pagination pour récupérer toutes les playlists si l'utilisateur en a plus de 50
while results['next']:
results = api.next(results)
playlists.extend(results['items'])
# Recherche de la playlist par nom
for playlist in playlists:
if playlist['name'] == nom:
return playlist['id']
print(f"Playlist '{nom}' non trouvée.")
return None

16
test_spotify.py Normal file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env python3
import unittest
from spotify import authentify
class TestMathUtils(unittest.TestCase):
"""Teste l'authentifciation"""
def test_authentify(self):
refapi = 0 # To finish
scope = "user-library-read playlist-read-private playlist-modify-private"
client_id="1ad3f973e5924940bec0bcbf1adf7475"
client_secret="e0601efe11ee4e31b27b255c06d70a38"
self.assertEqual(authentify(client_id, client_secret, scope), refapi)
if __name__ == '__main__':
unittest.main()