65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
import os
|
|
import server
|
|
import folder_paths
|
|
|
|
web = server.web
|
|
|
|
|
|
@server.PromptServer.instance.routes.get("/tangoflux/playaudio")
|
|
async def play_audio(request):
|
|
query = request.rel_url.query
|
|
|
|
filename = query.get("filename", None)
|
|
|
|
if filename is None:
|
|
return web.Response(status=404)
|
|
|
|
if filename[0] == "/" or ".." in filename:
|
|
return web.Response(status=403)
|
|
|
|
filename, output_dir = folder_paths.annotated_filepath(filename)
|
|
|
|
if not output_dir:
|
|
file_type = query.get("type", "output")
|
|
output_dir = folder_paths.get_directory_by_type(file_type)
|
|
|
|
if output_dir is None:
|
|
return web.Response(status=400)
|
|
|
|
subfolder = query.get("subfolder", None)
|
|
if subfolder:
|
|
full_output_dir = os.path.join(output_dir, subfolder)
|
|
if os.path.commonpath((os.path.abspath(full_output_dir), output_dir)) != output_dir:
|
|
return web.Response(status=403)
|
|
output_dir = full_output_dir
|
|
|
|
filename = os.path.basename(filename)
|
|
file_path = os.path.join(output_dir, filename)
|
|
|
|
if not os.path.isfile(file_path):
|
|
return web.Response(status=404)
|
|
|
|
_, ext = os.path.splitext(filename)
|
|
ext = ext.lower()
|
|
|
|
content_types = {
|
|
".wav": "audio/wav",
|
|
".mp3": "audio/mpeg",
|
|
".flac": "audio/flac",
|
|
".aac": "audio/aac",
|
|
".wma": "audio/x-ms-wma",
|
|
}
|
|
|
|
content_type = content_types.get(ext, None)
|
|
|
|
if content_type is None:
|
|
return web.Response(status=400)
|
|
|
|
try:
|
|
with open(file_path, "rb") as file:
|
|
data = file.read()
|
|
except:
|
|
return web.Response(status=500)
|
|
|
|
return web.Response(body=data, content_type=content_type)
|