Oggi impareremo ad interrogare il database online di iTunes, la famosa libreria digitale online di Apple, con un un semplice programma python.
iTunes è un programma software che funge da lettore multimediale, libreria multimediale, utilità di gestione dei dispositivi mobili e app client per iTunes Store.
Quello che alcuni tra noi ignorano, invece, è che è possibile “interrogare” l’intero database di iTunes alla ricerca di un brano, di un autore, del contenuto di una raccolta o dell’opera omnia di un cantante o di un gruppo con poche righe di Python, e senza dover scaricare il programma.
Vediamo come!
Il primo programma
1 2 3 4 5 6 7 8 9 10 11 12 |
# Demonstrates requests import sys import requests if len(sys.argv) != 2: sys.exit() response = requests.get( "https://itunes.apple.com/search?entity=song&limit=1&term=" + sys.argv[1] ) print(response.json()) |
Il primo programma che useremo per avvicinarci al nostro risultato finale determina l’utilizzo del protocollo http e la chiamata GET attraverso Python.
Come in tutti i protocolli che si rispettino, abbiamo una chiamata ed una risposta; il modulo “requests” ci offre tutti i metodi necessari per tale colloquio.
Abbiamo anche importato il modulo sys. In tal modo possiamo immettere il nome di una canzone o di un artista (riga 6) e inserirli come chiave di ricerca nella request (riga 10).
La richiesta è infatti una GET che richiama un webserver di ricerca. L’indirizzo richiede (search) un parametro (?) di tipo song, limitato ad un solo elemento (limit=1) e la cui chiave di ricerca corrisponda al parametro immesso da riga di comando.
A riga 12 stampiamo la risposta ottenuta dalle API di iTunes, in formato JSON.
Di seguito una risposta di esempio.
1 2 3 |
>>> %Run itunes0.py "Eros Ramazzotti" {'resultCount': 1, 'results': [{'wrapperType': 'track', 'kind': 'song', 'artistId': 217015, 'collectionId': 1440841656, 'trackId': 1440841775, 'artistName': 'Andrea Bocelli', 'collectionName': 'Sogno', 'trackName': 'Nel cuore lei (feat. Eros Ramazzotti)', 'collectionCensoredName': 'Sogno', 'trackCensoredName': 'Nel cuore lei (feat. Eros Ramazzotti)', 'artistViewUrl': 'https://music.apple.com/us/artist/andrea-bocelli/217015?uo=4', 'collectionViewUrl': 'https://music.apple.com/us/album/nel-cuore-lei-feat-eros-ramazzotti/1440841656?i=1440841775&uo=4', 'trackViewUrl': 'https://music.apple.com/us/album/nel-cuore-lei-feat-eros-ramazzotti/1440841656?i=1440841775&uo=4', 'previewUrl': 'https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview125/v4/7a/e9/ab/7ae9abaf-ac0a-edf2-e4b6-525c73c5dfd2/mzaf_12260641464525599954.plus.aac.p.m4a', 'artworkUrl30': 'https://is4-ssl.mzstatic.com/image/thumb/Music125/v4/39/3d/51/393d5174-74a2-8888-160b-22f34c7f6359/00602547185815.rgb.jpg/30x30bb.jpg', 'artworkUrl60': 'https://is4-ssl.mzstatic.com/image/thumb/Music125/v4/39/3d/51/393d5174-74a2-8888-160b-22f34c7f6359/00602547185815.rgb.jpg/60x60bb.jpg', 'artworkUrl100': 'https://is4-ssl.mzstatic.com/image/thumb/Music125/v4/39/3d/51/393d5174-74a2-8888-160b-22f34c7f6359/00602547185815.rgb.jpg/100x100bb.jpg', 'collectionPrice': 11.99, 'trackPrice': 1.29, 'releaseDate': '1999-01-01T12:00:00Z', 'collectionExplicitness': 'notExplicit', 'trackExplicitness': 'notExplicit', 'discCount': 1, 'discNumber': 1, 'trackCount': 14, 'trackNumber': 9, 'trackTimeMillis': 223167, 'country': 'USA', 'currency': 'USD', 'primaryGenreName': 'Pop', 'isStreamable': True}]} >>> |
Il secondo programma
Il protocollo funziona, otteniamo una risposta ma… l’impaginazione non ci soddisfa. Siamo umani, e non vogliamo faticare troppo a leggere le informazioni.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Demonstrates json import json import sys import requests if len(sys.argv) != 2: sys.exit() response = requests.get( "https://itunes.apple.com/search?entity=song&limit=1&term=" + sys.argv[1] ) print(json.dumps(response.json(), indent=2)) |
Quel che possiamo fare per rendere più leggibile la ricerca è importare il modulo json. Modifichiamo la riga 13, filtrando la risposta attraverso il metodo json.dumps() e richiedendo una indentazione di due spazi per la visualizzazione.
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 |
>>> %Run itunes1.py "Just the two of us" { "resultCount": 1, "results": [ { "wrapperType": "track", "kind": "song", "artistId": 485819, "collectionId": 281139330, "trackId": 281139574, "artistName": "Grover Washington, Jr.", "collectionName": "Anthology", "trackName": "Just the Two of Us", "collectionCensoredName": "Anthology", "trackCensoredName": "Just the Two of Us (feat. Bill Withers)", "artistViewUrl": "https://music.apple.com/us/artist/grover-washington-jr/485819?uo=4", "collectionViewUrl": "https://music.apple.com/us/album/just-the-two-of-us-feat-bill-withers/281139330?i=281139574&uo=4", "trackViewUrl": "https://music.apple.com/us/album/just-the-two-of-us-feat-bill-withers/281139330?i=281139574&uo=4", "previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview112/v4/63/be/2a/63be2a37-f92a-87a5-0340-458bbbc0523b/mzaf_8925514191817967882.plus.aac.p.m4a", "artworkUrl30": "https://is3-ssl.mzstatic.com/image/thumb/Features114/v4/e0/5d/27/e05d2750-3d0d-5215-add9-09c150b6bfe1/dj.yiwpfisn.jpg/30x30bb.jpg", "artworkUrl60": "https://is3-ssl.mzstatic.com/image/thumb/Features114/v4/e0/5d/27/e05d2750-3d0d-5215-add9-09c150b6bfe1/dj.yiwpfisn.jpg/60x60bb.jpg", "artworkUrl100": "https://is3-ssl.mzstatic.com/image/thumb/Features114/v4/e0/5d/27/e05d2750-3d0d-5215-add9-09c150b6bfe1/dj.yiwpfisn.jpg/100x100bb.jpg", "collectionPrice": 9.99, "trackPrice": 1.29, "releaseDate": "1980-01-01T12:00:00Z", "collectionExplicitness": "notExplicit", "trackExplicitness": "notExplicit", "discCount": 1, "discNumber": 1, "trackCount": 10, "trackNumber": 6, "trackTimeMillis": 438493, "country": "USA", "currency": "USD", "primaryGenreName": "Jazz", "isStreamable": true } ] } |
Ora il record che abbiamo ottenuto è decisamente più leggibile. Non solo: in questo modo possiamo anche selezionare tutti e soli i campi che ci interessano, ed eliminare la noiosa limitazione ad un unico record estratto da iTunes…
Il terzo programma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Iterating over JSON import json import sys import requests if len(sys.argv) != 2: sys.exit() response = requests.get( "https://itunes.apple.com/search?entity=song&term=" + sys.argv[1] ) o = response.json() for result in o["results"]: print(result["trackName"], " - ", result["collectionName"], " - ", result["artistName"]) #, " - ", result["trackViewUrl"]) |
A riga 11 del terzo programma abbiamo eliminalo la limitazione ad un unico record. Abbiamo inoltre copiato la risposta in una lista di dizionari (o) che andremo ad iterare ulla chiave results (vedi output precedente). Inoltre limiteremo la stampa a tre sole chiavi di ciascun record estratto, ovvero treack name, collection name e artist name.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>> %Run itunes2.py "Grover Washington Jr" Grover Washington Jr. - Art for Sale - Count Bass D I Can't Help It - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Snake Eyes - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Knuckhead - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. It Feels So Good - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Do Dat - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. No Tears (In the End) - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Inner City Blues (Make Me Wanna Holler) - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. A Secret Place - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Mister Magic - 20th Century Masters - The Millennium Collection: The Best of Grover Washington, Jr. - Grover Washington, Jr. Just the Two of Us - Anthology - Grover Washington, Jr. Just the Two of Us - Winelight - Grover Washington, Jr. & Bill Withers Just the Two of Us - The Best Of Bill Withers: Lean On Me - Grover Washington, Jr. with Bill Withers [... Un sacco di titoli eliminati per evitare confusione... ] Black Frost - Ultimate Collection - Grover Washington, Jr. - Grover Washington, Jr. Bright Moments - Ultimate Collection - Grover Washington, Jr. - Grover Washington, Jr. Mister Magic - Ultimate Collection - Grover Washington, Jr. - Grover Washington, Jr. |
Considerazioni finali
Con una decina di righe di Python siamo riusciti ad estarre informazioni da un database esterno (iTunes) che esponeva un servizio web per la ricerca.
Il prossimo passo potrebbe essere quello di aggiungere questa funzionalità ai nostri programmi, o al nostro db musicale personale. E’ possibile aggiungere ulteriori filtri per raffinare la nostra ricerca.
Piccola chicca: provate a togliere il commento dalla riga 15 del terzo proramma: otterrete il relativo link che punta direttamente alla canzone su iTunes.
Join our groups on Telegram…