import dotenv
from flask import Flask, Response, jsonify, request
from flask_cors import CORS
from flask_socketio import SocketIO, emit
from .room import Room
from .song import Song, init_db
# from .song_fetch import *
dotenv.load_dotenv()
app = Flask(__name__)
app.config["SECRET_KEY"] = "your_secret_key"
socketio = SocketIO(app)
CORS(app)
ROOMS: dict[int, Room] = {
1234: Room(
1234,
(0.0, 1.0),
"Test Room",
None,
{"Rock", "Metal"},
{},
[],
[Song(mbid="test", title="
", artist="", tags=["Metal"], image_id="img-id", youtube_id="yt-id")],
playing_idx=1,
)
} # { room_id: room, ... }
def error(msg: str, status: int = 400) -> Response:
res = jsonify({"success": False, "error": msg})
res.status_code = status
return res
@app.get("/api/join")
def join():
room_id = request.args.get("room")
code = request.args.get("code")
if room_id is None:
return error("Missing room id")
if (room := ROOMS.get(int(room_id))) is None:
return error("Invalid room")
if room.pin is not None and room.pin != code:
return error("Invalid code")
return {"success": True, "ws": f"/ws/{room_id}"}
@app.get("/api/queue")
def queue():
if (room_id := request.args.get("room")) is None:
return error("Missing room id")
if (room := ROOMS.get(int(room_id))) is None:
return error("Invalid room")
return {"success": True, "queue": room.playing}
@app.post("/api/queue/next")
def queue_next():
if (room_id := request.args.get("room")) is None:
return error("Missing room id")
if (room := ROOMS.get(int(room_id))) is None:
return error("Invalid room")
room.playing_idx += 1
if room.playing_idx >= len(room.playing):
## queue ended
# room.renew_queue()
emit("update_songs", {"songs": [1, 2, 3]}, broadcast=True, namespace="/")
return {"success": True, "ended": True, "index": room.playing_idx, "queue": []}
return {"success": True, "ended": False, "index": room.playing_idx}
init_db()
if __name__ == "__main__":
socketio.run(app, debug=True)