diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2015-08-10 10:36:03 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2015-08-10 10:40:50 +0200 |
commit | 3a196f51581ffca2d2a902e83a9b69ac4702316c (patch) | |
tree | e19c3474e46ab4da4c9f08a24f0082cc3290c7e8 /src/libpiano | |
parent | bf814cabd1e9913d6153b65f97ad851be3da9b29 (diff) | |
download | pianobar-windows-3a196f51581ffca2d2a902e83a9b69ac4702316c.tar.gz pianobar-windows-3a196f51581ffca2d2a902e83a9b69ac4702316c.tar.bz2 pianobar-windows-3a196f51581ffca2d2a902e83a9b69ac4702316c.zip |
Add feature to change Pandora settings
Currently exposed settings: Username, password and explicit content
filter. New key for settings is ‘!’, changeable with “act_settings”.
Fixes issues #524 and #506.
Diffstat (limited to 'src/libpiano')
-rw-r--r-- | src/libpiano/piano.h | 19 | ||||
-rw-r--r-- | src/libpiano/request.c | 41 | ||||
-rw-r--r-- | src/libpiano/response.c | 12 |
3 files changed, 72 insertions, 0 deletions
diff --git a/src/libpiano/piano.h b/src/libpiano/piano.h index 28a2b45..f0ba4cf 100644 --- a/src/libpiano/piano.h +++ b/src/libpiano/piano.h @@ -148,6 +148,11 @@ typedef struct { PianoSong_t *feedback; } PianoStationInfo_t; +typedef struct { + char *username; + bool explicitContentFilter; +} PianoSettings_t; + typedef enum { /* 0 is reserved: memset (x, 0, sizeof (x)) */ PIANO_REQUEST_LOGIN = 1, @@ -170,6 +175,8 @@ typedef enum { PIANO_REQUEST_GET_STATION_INFO = 20, PIANO_REQUEST_DELETE_FEEDBACK = 21, PIANO_REQUEST_DELETE_SEED = 22, + PIANO_REQUEST_GET_SETTINGS = 23, + PIANO_REQUEST_CHANGE_SETTINGS = 24, } PianoRequestType_t; typedef struct PianoRequest { @@ -245,6 +252,18 @@ typedef struct { PianoStation_t *station; } PianoRequestDataDeleteSeed_t; +typedef enum { + PIANO_UNDEFINED = 0, + PIANO_FALSE = 1, + PIANO_TRUE = 2, +} PianoTristate_t; + +typedef struct { + char *currentUsername, *newUsername; + char *currentPassword, *newPassword; + PianoTristate_t explicitContentFilter; +} PianoRequestDataChangeSettings_t; + /* pandora error code offset */ #define PIANO_RET_OFFSET 1024 typedef enum { diff --git a/src/libpiano/request.c b/src/libpiano/request.c index cad0907..95ac2d0 100644 --- a/src/libpiano/request.c +++ b/src/libpiano/request.c @@ -402,6 +402,47 @@ PianoReturn_t PianoRequest (PianoHandle_t *ph, PianoRequest_t *req, break; } + case PIANO_REQUEST_GET_SETTINGS: { + method = "user.getSettings"; + break; + } + + case PIANO_REQUEST_CHANGE_SETTINGS: { + PianoRequestDataChangeSettings_t *reqData = req->data; + assert (reqData != NULL); + assert (reqData->currentPassword != NULL); + assert (reqData->currentUsername != NULL); + + json_object_object_add (j, "userInitiatedChange", + json_object_new_boolean (true)); + json_object_object_add (j, "currentUsername", + json_object_new_string (reqData->currentUsername)); + json_object_object_add (j, "currentPassword", + json_object_new_string (reqData->currentPassword)); + + if (reqData->explicitContentFilter != PIANO_UNDEFINED) { + json_object_object_add (j, "isExplicitContentFilterEnabled", + json_object_new_boolean ( + reqData->explicitContentFilter == PIANO_TRUE)); + } + +#define changeIfSet(field) \ + if (reqData->field != NULL) { \ + json_object_object_add (j, #field, \ + json_object_new_string (reqData->field)); \ + } + + changeIfSet (newUsername); + changeIfSet (newPassword); + +#undef changeIfSet + + req->secure = true; + + method = "user.changeSettings"; + break; + } + /* "high-level" wrapper */ case PIANO_REQUEST_RATE_SONG: { /* love/ban song */ diff --git a/src/libpiano/response.c b/src/libpiano/response.c index b530f3a..542ef00 100644 --- a/src/libpiano/response.c +++ b/src/libpiano/response.c @@ -411,6 +411,7 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) { case PIANO_REQUEST_BOOKMARK_ARTIST: case PIANO_REQUEST_DELETE_FEEDBACK: case PIANO_REQUEST_DELETE_SEED: + case PIANO_REQUEST_CHANGE_SETTINGS: /* response unused */ break; @@ -508,6 +509,17 @@ PianoReturn_t PianoResponse (PianoHandle_t *ph, PianoRequest_t *req) { break; } + case PIANO_REQUEST_GET_SETTINGS: { + PianoSettings_t * const settings = req->data; + + assert (settings != NULL); + + settings->explicitContentFilter = json_object_get_boolean ( + json_object_object_get (result, "isExplicitContentFilterEnabled")); + settings->username = PianoJsonStrdup (result, "username"); + break; + } + case PIANO_REQUEST_GET_STATION_INFO: { /* get station information (seeds and feedback) */ PianoRequestDataGetStationInfo_t *reqData = req->data; |