summaryrefslogtreecommitdiff
path: root/src/libpiano/response.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libpiano/response.c')
-rw-r--r--src/libpiano/response.c117
1 files changed, 90 insertions, 27 deletions
diff --git a/src/libpiano/response.c b/src/libpiano/response.c
index 7f0cee0..a920c07 100644
--- a/src/libpiano/response.c
+++ b/src/libpiano/response.c
@@ -23,6 +23,7 @@ THE SOFTWARE.
#include "../config.h"
+#include <stdio.h>
#include <json.h>
#include <string.h>
#include <assert.h>
@@ -34,7 +35,12 @@ THE SOFTWARE.
#include "crypt.h"
static char *PianoJsonStrdup (json_object *j, const char *key) {
- return strdup (json_object_get_string (json_object_object_get (j, key)));
+ json_object * const o = json_object_object_get (j, key);
+ if (o != NULL) {
+ return strdup (json_object_get_string (o));
+ } else {
+ return NULL;
+ }
}
static void PianoJsonParseStation (json_object *j, PianoStation_t *s) {
@@ -70,6 +76,39 @@ static void PianoStrpcat (char * restrict dest, const char * restrict src,
*dest = '\0';
}
+static bool audioMapSelect (json_object * const map,
+ const PianoAudioQuality_t quality, PianoSong_t * const song) {
+ assert (map != NULL);
+ assert (quality != PIANO_AQ_UNKNOWN);
+ assert (song != NULL);
+
+ /* get audio url based on selected quality */
+ static const char *qualityMap[] = {"", "lowQuality", "mediumQuality",
+ "highQuality"};
+ assert (quality < sizeof (qualityMap)/sizeof (*qualityMap));
+ static const char *formatMap[] = {"", "aacplus", "mp3"};
+
+ json_object * const item =
+ json_object_object_get (map, qualityMap[quality]);
+
+ if (item == NULL) {
+ /* requested quality is not available */
+ return false;
+ }
+
+ const char *encoding = json_object_get_string (
+ json_object_object_get (item, "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 (item, "audioUrl");
+ return true;
+}
+
/* parse xml response and update data structures/return new data structure
* @param piano handle
* @param initialized request (expects responseData to be a NUL-terminated
@@ -230,34 +269,10 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
return PIANO_RET_OUT_OF_MEMORY;
}
- if (json_object_object_get (s, "artistName") == NULL) {
- free (song);
- continue;
- }
-
/* 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);
-
+ json_object * const map = json_object_object_get (s, "audioUrlMap");
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 {
+ if (!audioMapSelect (map, reqData->quality, song)) {
/* requested quality is not available */
ret = PIANO_RET_QUALITY_UNAVAILABLE;
free (song);
@@ -273,6 +288,7 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
song->stationId = PianoJsonStrdup (s, "stationId");
song->coverArt = PianoJsonStrdup (s, "albumArtUrl");
song->detailUrl = PianoJsonStrdup (s, "songDetailUrl");
+ song->adToken = PianoJsonStrdup (s, "adToken");
song->fileGain = json_object_get_double (
json_object_object_get (s, "trackGain"));
song->length = json_object_get_int (
@@ -610,6 +626,53 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) {
}
break;
}
+
+ case PIANO_REQUEST_GET_AD_METADATA: {
+ PianoRequestDataGetAdMetadata_t *reqData = req->data;
+
+ assert (reqData != NULL);
+ assert (reqData->song != NULL);
+ assert (reqData->quality != PIANO_AQ_UNKNOWN);
+
+ json_object *token = json_object_object_get (result,
+ "adTrackingTokens");
+ if (token != NULL) {
+ reqData->retTokenCount = json_object_array_length (token);
+ reqData->retToken = malloc (reqData->retTokenCount *
+ sizeof (*reqData->retToken));
+ for (size_t i = 0; i < reqData->retTokenCount; i++) {
+ json_object * const t = json_object_array_get_idx (token,
+ i);
+ assert (t != NULL);
+ reqData->retToken[i] = strdup (json_object_get_string (t));
+ printf ("added tracking token %s\n", reqData->retToken[i]);
+ }
+ } else {
+ reqData->retTokenCount = 0;
+ reqData->retToken = NULL;
+ }
+
+ PianoSong_t * const song = reqData->song;
+ json_object * const map = json_object_object_get (result, "audioUrlMap");
+ if (map != NULL) {
+ if (!audioMapSelect (map, reqData->quality, song)) {
+ /* requested quality is not available */
+ ret = PIANO_RET_QUALITY_UNAVAILABLE;
+ break;
+ }
+ }
+ song->artist = PianoJsonStrdup (result, "companyName");
+ song->title = PianoJsonStrdup (result, "title");
+ song->album = strdup ("");
+ song->fileGain = json_object_get_double (
+ json_object_object_get (result, "trackGain"));
+ break;
+ }
+
+ case PIANO_REQUEST_REGISTER_AD: {
+ printf ("req->responseData: %s\n", req->responseData);
+ break;
+ }
}
cleanup: