xyphron / server.py
dragxd's picture
Add mini web player with UI and streaming for /play command
410048c
import os
import uvicorn
from fastapi import FastAPI
from fastapi.responses import HTMLResponse, StreamingResponse, JSONResponse, FileResponse
from DragMusic.core import nowplaying
app = FastAPI(docs_url=None, redoc_url="/")
@app.get("/status")
def hello():
return {"message": "running"}
def get_audio_stream(file_path):
def iterfile():
with open(file_path, mode="rb") as file_like:
yield from file_like
return iterfile
@app.get("/", response_class=HTMLResponse)
def mini_web_player():
html_path = os.path.join(os.path.dirname(__file__), "DragMusic", "web", "player.html")
if not os.path.exists(html_path):
# fallback to old inline HTML if file missing
return "<h2>Mini Web Player</h2><p>UI file missing.</p>"
return FileResponse(html_path, media_type="text/html")
@app.get("/current")
def get_current_song():
song = nowplaying.get_current_song()
if song:
return JSONResponse(content=song)
return JSONResponse(content={"error": "No song playing"}, status_code=404)
@app.get("/stream")
def stream_audio():
song = nowplaying.get_current_song()
if not song or not song.get("path") or not os.path.exists(song["path"]):
return JSONResponse(content={"error": "No song playing or file missing"}, status_code=404)
file_path = song["path"]
return StreamingResponse(get_audio_stream(file_path)(), media_type="audio/mpeg")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)