- Reset the app idle timer when interacting with the webapp, so that the device does not turn off while the web ui is used. - Handle denying put/post while playback is active centrally in the before_request handler, so that it does not need to be copy/pasted into every request handler. Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
80 lines
2.0 KiB
Python
80 lines
2.0 KiB
Python
'''
|
|
SPDX-License-Identifier: MIT
|
|
Copyright (c) 2024-2025 Stefan Kratochwil <Kratochwil-LA@gmx.de>
|
|
'''
|
|
|
|
import asyncio
|
|
|
|
from microdot import Microdot, send_file
|
|
|
|
webapp = Microdot()
|
|
server = None
|
|
config = None
|
|
app = None
|
|
|
|
|
|
def start_webserver(config_, app_):
|
|
global server, config, app
|
|
server = asyncio.create_task(webapp.start_server(port=80))
|
|
config = config_
|
|
app = app_
|
|
|
|
|
|
@webapp.before_request
|
|
async def before_request_handler(request):
|
|
if request.method in ['PUT', 'POST'] and app.is_playing():
|
|
return "Cannot write to device while playback is active", 503
|
|
app.reset_idle_timeout()
|
|
|
|
|
|
@webapp.route('/')
|
|
async def index(request):
|
|
print("wohoo, a guest :)")
|
|
print(f" app: {request.app}")
|
|
print(f" client: {request.client_addr}")
|
|
print(f" method: {request.method}")
|
|
print(f" url: {request.url}")
|
|
print(f" headers: {request.headers}")
|
|
print(f" cookies: {request.cookies}")
|
|
return "TonberryPico says 'Hello World!'"
|
|
|
|
|
|
@webapp.route('/api/v1/filesystem', methods=['POST'])
|
|
async def filesystem_post(request):
|
|
# curl -X POST -d "burp" http://192.168.4.1/api/v1/filesystem
|
|
print(request)
|
|
return {'success': False}
|
|
|
|
|
|
@webapp.route('/api/v1/playlist', methods=['POST'])
|
|
async def playlist_post(request):
|
|
print(request)
|
|
return {'success': False}
|
|
|
|
|
|
@webapp.route('/api/v1/config', methods=['GET'])
|
|
async def config_get(request):
|
|
return config.get_config()
|
|
|
|
|
|
@webapp.route('/api/v1/config', methods=['PUT'])
|
|
async def config_put(request):
|
|
try:
|
|
config.set_config(request.json)
|
|
except ValueError as ex:
|
|
return str(ex), 400
|
|
return '', 204
|
|
|
|
|
|
@webapp.route('/index.html', methods=['GET'])
|
|
async def index_get(request):
|
|
return send_file('/frontend/index.html.gz', content_type='text/html', compressed='gzip')
|
|
|
|
|
|
@webapp.route('/static/<path:path>')
|
|
async def static(request, path):
|
|
if '..' in path:
|
|
# directory traversal is not allowed
|
|
return 'Not found', 404
|
|
return send_file('/frontend/static/' + path, max_age=86400)
|