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