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="<artist placeholder>", 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)