diff --git a/backend/requirements.txt b/backend/requirements.txt index 57b0b9d..5eae02e 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -2,4 +2,6 @@ Flask==3.1.0 flask-cors flask-socketio dotenv -requests \ No newline at end of file +requests +qrcode +Pillow \ No newline at end of file diff --git a/backend/src/app.py b/backend/src/app.py index 2024da5..e3352f9 100644 --- a/backend/src/app.py +++ b/backend/src/app.py @@ -8,6 +8,7 @@ from .connect import get_connection from .room import Room from .song import Song, init_db, get_song_by_title_artist, add_song_in_db from .song_fetch import lastfm_query_search, download_song_mp3 +from .qrcode_gen import generate_qr from typing import Any @@ -174,5 +175,22 @@ def add_song(): return {"artist": info.artist, "title": info.title, "tags": info.tags, "image_id": info.img_id} +@app.get("/api/room/qrcode") +def room_qrcode(): + if (room_id := request.args.get("room")) is None: + return error("Missing room id") + + if (pin := request.args.get("pin")) is not None: + pin = int(pin) + + stream = generate_qr( + base_uri="https://chillbox.leoinvents.com", + room_id=int(room_id), + pin=pin, + ) + + return Response(stream, content_type="image/jpeg") + + if __name__ == "__main__": socketio.run(app, debug=True) diff --git a/backend/src/qrcode_gen.py b/backend/src/qrcode_gen.py new file mode 100644 index 0000000..e4caffe --- /dev/null +++ b/backend/src/qrcode_gen.py @@ -0,0 +1,32 @@ +import qrcode +import urllib.parse +from io import BytesIO + + +def create_login_url(base_uri: str, room_id: int, pin: int | None) -> str: + parsed = urllib.parse.urlparse(base_uri) + + params = { + "room": room_id, + } + + if pin is not None: + params["pin"] = pin + + parsed = parsed._replace(path="join", query=urllib.parse.urlencode(params)) + + return urllib.parse.urlunparse(parsed) + + +def generate_qr(base_uri: str, room_id: int, pin: int | None) -> BytesIO: + url = create_login_url(base_uri, room_id, pin) + + qr = qrcode.make(url) + + out = BytesIO() + + qr.save(out, format="jpeg") + + out.seek(0) + + return out