First functions
This commit is contained in:
143
__init__.py
Executable file
143
__init__.py
Executable 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.")
|
||||||
BIN
__pycache__/spotify.cpython-312.pyc
Normal file
BIN
__pycache__/spotify.cpython-312.pyc
Normal file
Binary file not shown.
13
hello.py
13
hello.py
@@ -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
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
spotipy==2.24.0
|
||||||
30450
response.json
Normal file
30450
response.json
Normal file
File diff suppressed because one or more lines are too long
42
response2.json
Normal file
42
response2.json
Normal 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
85
spotify.py
Normal 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
16
test_spotify.py
Normal 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()
|
||||||
Reference in New Issue
Block a user