From fbfc5f1d5508533454187171024625ec05daa88d Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sun, 19 Apr 2015 15:02:18 +0200 Subject: dirty: Ads --- src/libpiano/response.c | 117 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 90 insertions(+), 27 deletions(-) (limited to 'src/libpiano/response.c') 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 #include #include #include @@ -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: -- cgit v1.2.3