feat: webserver: set and delete playlists

Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
2025-12-20 19:23:39 +01:00
parent e2ca9e5139
commit 3213ec8f66
2 changed files with 35 additions and 0 deletions

View File

@@ -297,6 +297,9 @@ class BTreeDB(IPlaylistDB):
key = key.encode() key = key.encode()
return self.db.get(b'settings/' + key, self.DEFAULT_SETTINGS[key]).decode() 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): def validate(self, dump=False):
""" """
Validate the structure of the playlist database. Validate the structure of the playlist database.

View File

@@ -16,6 +16,7 @@ app = None
nfc = None nfc = None
playlist_db = None playlist_db = None
def start_webserver(config_, app_): def start_webserver(config_, app_):
global server, config, app, nfc, playlist_db global server, config, app, nfc, playlist_db
server = asyncio.create_task(webapp.start_server(port=80)) server = asyncio.create_task(webapp.start_server(port=80))
@@ -96,6 +97,8 @@ async def playlist_get(request, tag):
return 'invalid tag', 400 return 'invalid tag', 400
playlist = playlist_db.getPlaylistForTag(tag.encode()) playlist = playlist_db.getPlaylistForTag(tag.encode())
if playlist is None:
return None, 404
return { return {
'shuffle': playlist.__dict__.get('shuffle'), 'shuffle': playlist.__dict__.get('shuffle'),
@@ -104,6 +107,35 @@ async def playlist_get(request, tag):
for p in playlist.getPaths()], for p in playlist.getPaths()],
} }
@webapp.route('/api/v1/playlist/<tag>', 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/<tag>', 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']) @webapp.route('/api/v1/audiofiles', methods=['GET'])
async def audiofiles_get(request): async def audiofiles_get(request):
audiofiles = set() audiofiles = set()