Spotify er en fantastisk musik tjeneste, og jeg har personligt stor glæde af den hver eneste dag, hvor jeg lytter til musik på arbejdet via deres desktop application, og i træningscentret via deres android app.
Som udvikler er man jo altid nysgerrig, når man opdager en service har en API, så da jeg opdagede at spotify havde dette, skulle jeg selvfølgelig lege. Spotify har faktisk flere APIer, men kun en som du kan tilgå via web, Spotify Metadata API, hvor du kan søge i spotifys kæmpe musik katalog, og det er denne API vi kigger på her.
class.spotify.php
Ønsker du bare nemt at kunne slå op i Spotify Metadata API har jeg skrevet en klasse til dette som du kan finde her:
Søg i Spotify med PHP class.spotify.php
Spotify Metadata API
APIen har to muligheder, “lookup” og “search”, i lookup kan du hente informationer omkring et album, en kunstner eller et track udfra en given spotify URI, mens du i search kan søge efter et album, en kunstner eller et track.
Spotify API tilgåes gennem helt almindelige URL kald, fx kan vi søge på en sang ved at kalde:
http://ws.spotify.com/search/1/track?q=the+river
APIen vil så returnere resultater på denne søgestreng. Som standard returnerer APIen data i XML format, men den kan også returnere i json format ved at tilføje .json efter metode kaldet:
http://ws.spotify.com/search/1/track.json?q=the+river
Personligt foretrækker jeg altid json til denne type opgaver, da det er super nemt at arbejde med i PHP.
I første omgang kigger vi på hvordan man bruger search delen af spotify metadata api.
Søg i Spotify Metadata Api med PHP
Når du skal søge i Spotify APIen, er der 3 muligheder, du kan søge på et tracknavn, en kunstner eller et album.
Hvis du vil søge efter kunstneren Bruce Springsteen frem kalder vi simpelthen url’en http://ws.spotify.com/search/1/artist.json?q=bruce+springsteen fra PHP med file_get_contents() og json decoder resultatet:
1 2 3 4 5 6 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/search/1/artist.json?q=bruce+springsteen');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
?> |
Resultatet af dette bliver et associativt array opbygget sådan her:
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 |
Array
(
[info] => Array
(
[num_results] => 19
[limit] => 100
[offset] => 0
[query] => bruce springsteen
[type] => artist
[page] => 1
)
[artists] => Array
(
[0] => Array
(
[href] => spotify:artist:3eqjTLE0HfPfh78zjh6TqT
[name] => Bruce Springsteen
[popularity] => 0.62997
)
[1] => Array
(
[href] => spotify:artist:7EER70XxNNq6XKw6xzDjGZ
[name] => Bruce Springsteen & The E Street Band
[popularity] => 0.45179
)
)
) |
APIen returnerer max 100 resultater pr kald, men du kan selv crawle dybere ved at sende parameteren “page” med i kaldet. Dette er dog sjældent nødvendigt da resultaterne er sorteret i forhold til popularitet.
Arrayet kan vi let løbe igennem i php med foreach, og således liste alle søgeresultater:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/search/1/artist.json?q=bruce+springsteen');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['info']['num_results']) && $results['info']['num_results']>0) {
echo '<h1>'.$results['info']['num_results']. ' resultater på kunstneren bruce springsteen</h1>';
//gennemløb resultater
foreach ($results['artists'] as $artist) {
echo '<b>'.$artist['name']. ' - '.$artist['href']. ' - Popularitet: '.$artist['popularity'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Hvis vi i stedet vil søge på et sangnavn, skal vi sådan set bare skifte URL ud, og så ellers bruge samme fremgangsmåde på det data vi modtager retur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/search/1/track.json?q=the+river');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['info']['num_results']) && $results['info']['num_results']>0) {
echo '<h1>'.$results['info']['num_results']. ' resultater på tracket The River</h1>';
//gennemløb resultater
foreach ($results['tracks'] as $track) {
//tjek om der står dk eller worldwide i territories
if (!preg_match('/\bdk|worldwide\b/i',$track['album']['availability']['territories'])) continue;
echo $track['artists'][0]['name'].' - '.$track['name']. ' - '.$track['href'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Hvis vi skal bruge musikken i DK er det vigtigt lige at tjekke om DK eller “worldwide” indgår i “territories” under album/availability – ellers vil musikken ikke kunne afspilles i danmark.
Vi kan også søge på et album:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/search/1/album.json?q=the+rising');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['info']['num_results']) && $results['info']['num_results']>0) {
echo '<h1>'.$results['info']['num_results']. ' resultater på albummet The Rising</h1>';
//gennemløb resultater
foreach ($results['albums'] as $album) {
//tjek om der står dk eller worldwide i territories
if (!preg_match('/\bdk|worldwide\b/i',$album['availability']['territories'])) continue;
echo $album['artists'][0]['name'].' - '.$album['name']. ' - '.$album['href'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Track eller album med specifik kunstner
Hvis vi vil søge efter et track eller et album med en specifik kunstner, så kan vi tilføje artist:navnet til vores søgestreng, vil vi fx finde Bruce Springsteen – The Rising kan vi gøre det sådan her:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/search/1/album.json?q=the+rising+artist:bruce+springsteen');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['info']['num_results']) && $results['info']['num_results']>0) {
echo '<h1>'.$results['info']['num_results']. ' resultater på albummet The Rising</h1>';
//gennemløb resultater
foreach ($results['albums'] as $album) {
//tjek om der står dk eller worldwide i territories
if (!preg_match('/\bdk|worldwide\b/i',$album['availability']['territories'])) continue;
echo $album['artists'][0]['name'].' - '.$album['name']. ' - '.$album['href'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Du kan læse mere om Avancerede søgninger i API dokumentationen her
Hent info med lookup
Hvis vi ønsker yderligere informationer om en kunstner, track eller album, kan vi hente dette igennem api’en med metoden lookup. Her kræver det at vi har en given spotify uri som vi kan søge på (denne kunne være fundet igennem søgningen i forrige kapitel).
Ønsker vi fx at vide mere om Bruce Springsteen kan vi kalde http://ws.spotify.com/lookup/1/.json?uri=spotify:artist:3eqjTLE0HfPfh78zjh6TqT Dette giver os dog ikke rigtigt noget brugbart, blot at der findes en kunstner med navn Bruce Springsteen. Heldigvis kan “lookup” lidt mere end det, vi kan nemlig medsende parameteren “extra” som kan være enten album eller albumdetail på kunstnerniveau og på den måde får vi alle albums af Bruce Springsteen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/lookup/1/.json?uri=spotify:artist:3eqjTLE0HfPfh78zjh6TqT&extras=album');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['artist']['albums']) && count($results['artist']['albums'])>0) {
echo '<h1>Bruce springsteens albums</h1>';
//gennemløb resultater
foreach ($results['artist']['albums'] as $i=>$album) {
$album = $album['album'];
//tjek om der står dk eller worldwide i territories
if (!preg_match('/\bdk|worldwide\b/i',$album['availability']['territories'])) continue;
echo $album['name']. ' - '.$album['href'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Hvis vi i stedet slår et album op kan vi som ekstra medsende track eller trackdetails og så får vi alle tracks for det givne album ud:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/lookup/1/.json?uri=spotify:album:75kN1qUWvE10QcnpE6nEsM&extras=track');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['album'])) {
echo '<h1>'.$results['album']['artist'].' - '.$results['album']['name'].'</h1>
<p>Albummet er fra: '.$results['album']['released'].' og indeholder '.count($results['album']['tracks']).' tracks</p>
';
foreach ($results['album']['tracks'] as $trackNum=>$track) {
echo ($trackNum+1).': '.$track['name']. ' - '.$track['href'].'<br><hr>';
}
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Og sidst men ikke mindst kan vi gøre det samme med tracks hvis vi ønsker information om hvilket album en sang er på:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php
//hent data fra spotify
$data = file_get_contents('http://ws.spotify.com/lookup/1/.json?uri=spotify:track:0L5pgyAg5kEO69Wn0PpS2Q');
//json decode data og omdan til associativt array
$results = json_decode($data,1);
//check om der rent faktisk er resultater
if (isset($results['track'])) {
echo '<h1>'.$results['track']['artist'].' - '.$results['track']['name'].'</h1>
<p>Sangen er med '.$results['track']['artists'][0]['name'].' fra: '.$results['track']['album']['name'].' og er nr '.$results['track']['track-number'].' på albummet</p>
';
} else {
echo '<h1>Fandt ingen resultater</h1>';
}
?> |
Hvad kan Spotify Metadata API bruges til
Hvis du har en musik side, kunne man passende linke til musikken på spotify, og vil man automatisere denne process, ja så må man igennem Spotify Metadata API.
Selv har jeg brugt det til at skabe en Playliste over alt P3 Musik i Spotify – her går jeg ind og ser på hvad P3 Spiller, og så bruger jeg Spotify Metadata API til at finde den tilsvarende sang på spotify, og på den måde kan jeg lave et stort arkiv over alt p3 musikken uge for uge.
Hvis andre skulle have lyst til at lave noget lignende med P3, så fandt jeg frem til et XML feed som de bruger til deres “Now Playing”, i dette feed kan du finde, den sidste sang, den nuværende sang og den næste sang der vil blive spillet:
http://www.dr.dk/playlister/feeds/nownext/nownext.drxml?cid=P3
Pingback: Søg i Spotify med PHP spotify klasse - class.spotify.php