summaryrefslogtreecommitdiff
path: root/src/libpiano/response.c
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2012-06-06 21:13:43 +0200
committerLars-Dominik Braun <lars@6xq.net>2012-06-09 15:43:43 +0200
commit524abb97453f2140fcd3a7fa66d9d43851af19e1 (patch)
tree814e33a0d04137332f5a341721f96d4f8cccc9e2 /src/libpiano/response.c
parentb32348d88f700f4a3b5fb3a95f7ee40336952230 (diff)
downloadpianobar-524abb97453f2140fcd3a7fa66d9d43851af19e1.tar.gz
pianobar-524abb97453f2140fcd3a7fa66d9d43851af19e1.tar.bz2
pianobar-524abb97453f2140fcd3a7fa66d9d43851af19e1.zip
piano: Select quality instead of audio format
Pandora limited the audio formats we can request explicitly. Don’t rely on this and use the formats available with the given partner credentials. Closes #271.
Diffstat (limited to 'src/libpiano/response.c')
-rw-r--r--src/libpiano/response.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/libpiano/response.c b/src/libpiano/response.c
index 73b223a..659ed2d 100644
--- a/src/libpiano/response.c
+++ b/src/libpiano/response.c
@@ -228,6 +228,7 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
assert (req->responseData != NULL);
assert (reqData != NULL);
+ assert (reqData->quality != PIANO_AQ_UNKNOWN);
json_object *items = json_object_object_get (result, "items");
assert (items != NULL);
@@ -245,7 +246,37 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
continue;
}
- song->audioUrl = PianoJsonStrdup (s, "additionalAudioUrl");
+ /* get audio url based on selected quality */
+ static const char *qualityMap[] = {"", "lowQuality", "mediumQuality",
+ "highQuality"};
+ assert (reqData->quality < sizeof (qualityMap)/sizeof (*qualityMap));
+ static const char *formatMap[] = {"", "aacplus", "mp3"};
+ json_object *map = json_object_object_get (s, "audioUrlMap");
+ assert (map != NULL);
+
+ if (map != NULL) {
+ map = json_object_object_get (map, qualityMap[reqData->quality]);
+
+ if (map != NULL) {
+ const char *encoding = json_object_get_string (
+ json_object_object_get (map, "encoding"));
+ assert (encoding != NULL);
+ for (size_t k = 0; k < sizeof (formatMap)/sizeof (*formatMap); k++) {
+ if (strcmp (formatMap[k], encoding) == 0) {
+ song->audioFormat = k;
+ break;
+ }
+ }
+ song->audioUrl = PianoJsonStrdup (map, "audioUrl");
+ } else {
+ /* requested quality is not available */
+ ret = PIANO_RET_QUALITY_UNAVAILABLE;
+ free (song);
+ PianoDestroyPlaylist (playlist);
+ goto cleanup;
+ }
+ }
+
song->artist = PianoJsonStrdup (s, "artistName");
song->album = PianoJsonStrdup (s, "albumName");
song->title = PianoJsonStrdup (s, "songName");
@@ -255,7 +286,6 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
song->detailUrl = PianoJsonStrdup (s, "songDetailUrl");
song->fileGain = json_object_get_double (
json_object_object_get (s, "trackGain"));
- song->audioFormat = reqData->format;
switch (json_object_get_int (json_object_object_get (s,
"songRating"))) {
case 1:
@@ -665,6 +695,7 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
}
}
+cleanup:
json_object_put (j);
return ret;