Attenzione
A partire dal 27 novembre 2024 il progetto non è più attivo e mantenuto.
Per delle fantomatiche questioni inerenti alla “sicurezza della piattaforma” 🤨, Spotify ha deciso di stilare una serie di regole che determinano un nuovo modo di fruire alcune delle più importanti API messe a disposizione degli sviluppatori. L’ottavo punto in lista parla, nello specifico, delle playlist che vengono create e mantenute direttamente da Spotify che, post-introduzione delle nuove regole, hanno reso inutilizzabile l’endpoint che permette di ottenere le informazioni necessarie, tra le altre cose, per la creazione della copia della New Music Friday (Italia e Dance) settimanale.
Ne ho parlato in un articolo dedicato, che trovi qui: Spotify Save New Music Friday: it’s time to say goodbye.
Da quando ho messo in piedi gli script che salvano una copia della New Music Friday Italia ogni venerdì (e nel frattempo mettono in coda le tracce nuove in una playlist che le raccoglierà tutte per il corso del 2022, e in seguito per i futuri anni), ci ho rimesso mano una sola volta per mettere a posto un potenziale problema dovuto all’orario di avvio del processo programmato su GitHub. Funziona, tutto fila liscio e io sono un bimbo contento per questa piccola stupidata.
Oggi (è domenica e il pupo sta facendo il pisolo pomeridiano) però sono tornato sull’argomento dopo aver letto l’articolo di Michele sullo Spotify Code, cosa che avevo già visto in passato ma al quale non mi ero particolarmente interessato. Si tratta di un codice che viene letto dall’applicazione di Spotify (su smartphone o tablet) e che ti porta immediatamente alla playlist affinché tu possa salvarla o ascoltarla immediatamente. C’è un sito web ufficiale che risponde all’indirizzo spotifycodes.com ma apparentemente non ci sono API che permettono la creazione automatica del codice. Ho quindi sbirciato su GitHub nel repository ufficiale (anche se archiviato) e ho trovato un metodo comunque funzionante che passa tramite URL secco (valido fino a quando non decideranno di modificarlo).
Spotify Codes: questione di URL
Tutto parte da questo intervento: github.com/spotify/web-api/issues/519#issuecomment-618114678. Si capisce chiaramente che modificando parte di quell’indirizzo si otterrà l’immagine del codice desiderata, puntata alla playlist che si vuole, nel formato desiderato (dell’immagine) e con colori modificabili. Una rapida analisi al codice della pagina conferma il tutto:
E allora la modifica è presto fatta anche lato codice:
def get_spoticode(nmfiplaylisttoday): base_url = 'https://scannables.scdn.co/uri/plain/png/bdd74/black/640/spotify:playlist:' spoti_url = ''.join([base_url, nmfiplaylisttoday]) print("Spotify Code:",spoti_url) return spoti_url
La funzione non fa altro che ottenere l’URL completo che punta all’immagine (Spotify Code) della playlist di backup generata al venerdì. Il colore di sfondo è quello del mio logo (#bdd74
) e quello del logo Spotify / codice è il nero, la grandezza dell’immagine sarà di 640px di larghezza. Inizialmente avevo pensato di includere qui nel codice il necessario per scaricare l’immagine nella cartella dello script e permettere quindi upload ovunque si voglia (github.com/gioxx/spotify-save-new-music-friday/commit/6a55d848d2d97aa2d1ebaaebc8fad0a02243fc8e), poi mi è venuta la malsana idea di associare questa cosa a Twitter e quindi:
- prevedere che l’azione GitHub mandi sul mio account Twitter un aggiornamento di stato quando sarà disponibile la nuova copia di New Music Friday Italia.
- Che nell’aggiornamento di stato su Twitter compaia anche la cover-art della playlist (oltre all’immagine dello Spotify Code).
E quindi, due le modifiche necessarie: una funzione per ottenere il JSON degli URL diretti alla copertina della playlist e un’altra che scarichi entrambe le immagini passandogli i parametri in maniera diretta (ID della playlist e nome del file da salvare). La prima stava facendomi diventare più scemo del dovuto perché mi stavo perdendo in un bicchiere d’acqua, ho poi corretto il tiro ed ecco servito il risultato funzionante:
def get_playlistcover(access_token, nmfiplaylisttoday): url = "https://api.spotify.com/v1/playlists/%s/images" % nmfiplaylisttoday headers = { "Content-Type": "application/json", "Authorization": "Bearer %s" % access_token } response = requests.get(url, headers=headers) return response.json()
La seconda invece l’avevo già messa in piedi tramite urllib.request
:
def downloadart(arturl, filename): response = urllib.request.urlretrieve(arturl, filename) return response
A questo punto basterà andare ad aggiungere le chiamate a queste funzioni dopo essere riusciti a fare un corretto backup della playlist (dopo il print("Playlist backup complete")
per capirci):
nmf_spoticode = get_spoticode(nmfiplaylisttoday) nmf_cover = get_playlistcover(access_token, nmfiplaylisttoday)[0]['url'] downloadart(nmf_spoticode,"nmf_spoticode.png") downloadart(nmf_cover,"nmf_cover.png")
Le modifiche riguardano attualmente il solo script relativo al backup della New Music Friday (quindi nmf.py
) e non credo serva fare tutto questo anche per l’altro che si occupa di aggiungere in coda le tracce settimanalmente nella playlist unica annuale.
Come pubblicare su Twitter
Lo faccio tramite GitHub Actions, ho scelto il codice di SnowCait perché permette anche di aggiungere facilmente immagini oltre al testo del tweet, l’ideale per fare l’upload dello Spotify Code e della copertina della playlist. Il codice è quello che ho usato al primo commit di test (github.com/gioxx/spotify-save-new-music-friday/commit/79f9b40b5c9884d6212100189fd4c64ac85f5008) e richiede che tra i Secrets del repository tu vada ad aggiungere le chiavi necessarie per la pubblicazione su Twitter (TWITTER_CONSUMER_API_KEY
, TWITTER_CONSUMER_API_SECRET_KEY
, TWITTER_ACCESS_TOKEN
e TWITTER_ACCESS_TOKEN_SECRET
), io in seguito ho giusto ritoccato i nomi dei file da caricare e il testo del tweet per arrivare all’attuale (all’atto della pubblicazione di questo articolo):
- name: Tweet NMF id: tweet uses: snow-actions/tweet@v1.1.1 env: CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }} CONSUMER_API_SECRET_KEY: ${{ secrets.TWITTER_CONSUMER_API_SECRET_KEY }} ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} with: status: | La #playlist New Music Friday Italia di oggi è ora disponibile! Inquadra il codice con l'applicazione #Spotify per andare ad ascoltarla :-) | #NewMusicFridayItalia #NewMusicFriday media_paths: | nmf_cover.png nmf_spoticode.png
Già testato, è funzionante e percorre l’intero stack: dalla creazione della playlist di backup al download del materiale grafico e pubblicazione del tweet sul mio account (anche se ora ho fatto pulizia). Potrai vederlo in azione già a partire da venerdì 18 febbraio prossimo. Io intanto ho già aggiornato il file README del progetto ma manca la parte relativa al tweet, vedrò di integrarla quanto prima.
Se hai dubbi, l’area commenti è giusto un colpo di scroll più in basso, usala :-)
#StaySafe
L'articolo potrebbe non essere aggiornato
Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)