diff --git a/README_JSON_API.md b/README_JSON_API.md index 01da66fa..f2d9238d 100644 --- a/README_JSON_API.md +++ b/README_JSON_API.md @@ -746,6 +746,7 @@ curl -X PUT "http://localhost:3689/api/queue/items/2" | GET | [/api/library](#library-information) | Get library information | | GET | [/api/library/playlists](#list-playlists) | Get a list of playlists | | GET | [/api/library/playlists/{id}](#get-a-playlist) | Get a playlist | +| PUT | [/api/library/playlists/{id}](#update-a-playlist) | Update a playlist attribute | | DELETE | [/api/library/playlists/{id}](#delete-a-playlist) | Delete a playlist | | GET | [/api/library/playlists/{id}/tracks](#list-playlist-tracks) | Get list of tracks for a playlist | | PUT | [/api/library/playlists/{id}/tracks](#update-playlist-tracks) | Update play count of tracks for a playlist | @@ -899,6 +900,59 @@ curl -X GET "http://localhost:3689/api/library/playlists/1" ``` +### Update a playlist + +Update attributes of a specific playlists in your library + +**Endpoint** + +```http +PUT /api/library/playlists/{id} +``` + +**Path parameters** + +| Parameter | Value | +| --------------- | -------------------- | +| id | Playlist id | + +**Query parameters** + +| Parameter | Value | +| --------------- | ----------------------------------------------------------- | +| query_limit | For RSS feeds, this sets how many podcasts to retrieve | + + +**Example** + +```shell +curl -X PUT "http://localhost:3689/api/library/playlists/25?query_limit=20" +``` + + +### Delete a playlist + +Delete a playlist, e.g. a RSS feed + +**Endpoint** + +```http +DELETE /api/library/playlists/{id} +``` + +**Path parameters** + +| Parameter | Value | +| --------------- | -------------------- | +| id | Playlist id | + +**Example** + +```shell +curl -X DELETE "http://localhost:3689/api/library/playlists/25" +``` + + ### List playlist tracks Lists the tracks in a playlists diff --git a/src/httpd_jsonapi.c b/src/httpd_jsonapi.c index c16f1329..6d8dddc7 100644 --- a/src/httpd_jsonapi.c +++ b/src/httpd_jsonapi.c @@ -3226,7 +3226,7 @@ jsonapi_reply_library_playlists(struct httpd_request *hreq) } static int -jsonapi_reply_library_playlist(struct httpd_request *hreq) +jsonapi_reply_library_playlist_get(struct httpd_request *hreq) { uint32_t playlist_id; json_object *reply = NULL; @@ -3275,6 +3275,55 @@ jsonapi_reply_library_playlist(struct httpd_request *hreq) return HTTP_OK; } +static int +playlist_attrib_query_limit_set(int playlist_id, const char *param) +{ + struct playlist_info *pli; + int query_limit; + int ret; + + ret = safe_atoi32(param, &query_limit); + if (ret < 0) + return -1; + + pli = db_pl_fetch_byid(playlist_id); + if (!pli) + return -1; + + pli->query_limit = query_limit; + + ret = db_pl_update(pli); + + free_pli(pli, 0); + + return ret; +} + +static int +jsonapi_reply_library_playlist_put(struct httpd_request *hreq) +{ + uint32_t playlist_id; + const char *param; + int ret; + + ret = safe_atou32(hreq->uri_parsed->path_parts[3], &playlist_id); + if (ret < 0) + { + DPRINTF(E_LOG, L_WEB, "Could not parse playlist id to integer\n"); + return HTTP_BADREQUEST; + } + + if ((param = evhttp_find_header(hreq->query, "query_limit"))) + ret = playlist_attrib_query_limit_set(playlist_id, param); + else + ret = -1; + + if (ret < 0) + return HTTP_BADREQUEST; + + return HTTP_OK; +} + static int jsonapi_reply_library_playlist_tracks(struct httpd_request *hreq) { @@ -4094,7 +4143,8 @@ static struct httpd_uri_map adm_handlers[] = { EVHTTP_REQ_POST, "^/api/queue/save$", jsonapi_reply_queue_save}, { EVHTTP_REQ_GET, "^/api/library/playlists$", jsonapi_reply_library_playlists }, - { EVHTTP_REQ_GET, "^/api/library/playlists/[[:digit:]]+$", jsonapi_reply_library_playlist }, + { EVHTTP_REQ_GET, "^/api/library/playlists/[[:digit:]]+$", jsonapi_reply_library_playlist_get }, + { EVHTTP_REQ_PUT, "^/api/library/playlists/[[:digit:]]+$", jsonapi_reply_library_playlist_put }, { EVHTTP_REQ_GET, "^/api/library/playlists/[[:digit:]]+/tracks$", jsonapi_reply_library_playlist_tracks }, { EVHTTP_REQ_PUT, "^/api/library/playlists/[[:digit:]]+/tracks", jsonapi_reply_library_playlist_tracks_put_byid}, // { EVHTTP_REQ_POST, "^/api/library/playlists/[[:digit:]]+/tracks$", jsonapi_reply_library_playlists_tracks },