From 3213ec8f66ee58f4cce796907c029ef222d60ef5 Mon Sep 17 00:00:00 2001 From: Matthias Blankertz Date: Sat, 20 Dec 2025 19:23:39 +0100 Subject: [PATCH] feat: webserver: set and delete playlists Signed-off-by: Matthias Blankertz --- software/src/utils/playlistdb.py | 3 +++ software/src/webserver.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/software/src/utils/playlistdb.py b/software/src/utils/playlistdb.py index 649be86..b7de2ca 100644 --- a/software/src/utils/playlistdb.py +++ b/software/src/utils/playlistdb.py @@ -297,6 +297,9 @@ class BTreeDB(IPlaylistDB): key = key.encode() return self.db.get(b'settings/' + key, self.DEFAULT_SETTINGS[key]).decode() + def deletePlaylistForTag(self, tag: bytes): + self._deletePlaylist(tag) + def validate(self, dump=False): """ Validate the structure of the playlist database. diff --git a/software/src/webserver.py b/software/src/webserver.py index 68fe185..5fd3a9b 100644 --- a/software/src/webserver.py +++ b/software/src/webserver.py @@ -16,6 +16,7 @@ app = None nfc = None playlist_db = None + def start_webserver(config_, app_): global server, config, app, nfc, playlist_db server = asyncio.create_task(webapp.start_server(port=80)) @@ -96,6 +97,8 @@ async def playlist_get(request, tag): return 'invalid tag', 400 playlist = playlist_db.getPlaylistForTag(tag.encode()) + if playlist is None: + return None, 404 return { 'shuffle': playlist.__dict__.get('shuffle'), @@ -104,6 +107,35 @@ async def playlist_get(request, tag): for p in playlist.getPaths()], } + +@webapp.route('/api/v1/playlist/', methods=['PUT']) +async def playlist_put(request, tag): + if not is_hex(tag): + return 'invalid tag', 400 + + playlist = request.json + if 'persist' in playlist and \ + playlist['persist'] not in ['no', 'track', 'offset']: + return "Invalid 'persist' setting", 400 + if 'shuffle' in playlist and \ + playlist['shuffle'] not in ['no', 'yes']: + return "Invalid 'shuffle' setting", 400 + + playlist_db.createPlaylistForTag(tag.encode(), + (fsroot + path.encode() for path in playlist.get('paths', [])), + playlist.get('persist', 'track').encode(), + playlist.get('shuffle', 'no').encode()) + return '', 204 + + +@webapp.route('/api/v1/playlist/', methods=['DELETE']) +async def playlist_delete(request, tag): + if not is_hex(tag): + return 'invalid tag', 400 + playlist_db.deletePlaylistForTag(tag.encode()) + return '', 204 + + @webapp.route('/api/v1/audiofiles', methods=['GET']) async def audiofiles_get(request): audiofiles = set()