From 696423423194acf28fda781b855cfe2d717baebf Mon Sep 17 00:00:00 2001 From: ThisBirchWood Date: Wed, 29 Jan 2025 00:59:05 +0000 Subject: [PATCH] UPDATE: Added functionality that updates database on stream start and on stream end. Adds new stream to database --- nginx/nginx.conf | 1 + web_server/blueprints/streams.py | 26 ++++++++++++++++++++++++-- web_server/database/app.db | Bin 73728 -> 73728 bytes web_server/database/database.py | 18 ++++++++++++++++-- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 1ea292d..a5d45b5 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -16,6 +16,7 @@ rtmp { push rtmp://127.0.0.1:1935/hls-live; on_publish http://web_server:5000/publish_stream; + on_publish_done http://web_server:5000/end_stream; } diff --git a/web_server/blueprints/streams.py b/web_server/blueprints/streams.py index cb490ad..a4b43f7 100644 --- a/web_server/blueprints/streams.py +++ b/web_server/blueprints/streams.py @@ -3,6 +3,7 @@ from utils.stream_utils import streamer_live_status, streamer_most_recent_stream from utils.user_utils import get_user_id from blueprints.utils import login_required from database.database import Database +from datetime import datetime stream_bp = Blueprint("stream", __name__) @@ -171,6 +172,8 @@ def stream_thumbnail_snapshot(streamer_id): """ return + +## RTMP Server Routes @stream_bp.route("/publish_stream", methods=["POST"]) def publish_stream(): """ @@ -181,13 +184,22 @@ def publish_stream(): # Check if stream key is valid db = Database() db.create_connection() - user_info = db.fetchone("""SELECT user_id, username + user_info = db.fetchone("""SELECT user_id, username, current_stream_title, current_selected_category_id FROM users WHERE stream_key = ?""", (stream_key,)) if not user_info: return "Unauthorized", 403 + # Insert stream into database + db.execute("""INSERT INTO streams (user_id, title, category_id, start_time, isLive) + VALUES (?, ?, ?, ?, ?)""", (user_info["user_id"], + user_info["current_stream_title"], + 1, + datetime.now(), + 1)) + + return redirect(f"/{user_info['username']}") @stream_bp.route("/end_stream", methods=["POST"]) @@ -195,4 +207,14 @@ def end_stream(): """ Ends a stream """ - return + db = Database() + db.create_connection() + user_info = db.fetchone("""SELECT user_id FROM users WHERE stream_key = ?""", (request.form.get("name"),)) + + if not user_info: + return "Unauthorized", 403 + + # Set stream to not live + db.execute("""UPDATE streams SET isLive = 0 WHERE user_id = ? AND isLive = 1""", (user_info["user_id"],)) + + return "Stream ended", 200 diff --git a/web_server/database/app.db b/web_server/database/app.db index 57ecae5d350e9f9283aca56549b1cb4466651e34..35a9f1d71144497d4497bac76adee369c2855c16 100644 GIT binary patch delta 1514 zcmah|&u<$=6rS0cjk9r`=Ln&y4k%+q93s`u{;-Kt38_^H>8}VRbLoMqi+5}Gu47NA$J?wyDVV zHf28GZ4SaHiJOTV#c71VDi|ekjJcEYn%f%$Qeo%5uD`m{I2ZbT z(UYPbMk4SxrO3v_aNxNKf@gT*jNj=7_)TK{9iAuiFFQzgdWo)i!}Vb_45SMG%KQ$|}!8lDwb`r*~;hMRQ7hU-bO=Eht663dfgi&lnzDoWmP z`)-u@apJd-0mHW2pCq8i9b{O$HVDE<5hPtH(9*yYVOwB(wRuG*qm29lo{)JO`c+nb zom!$B!`N?K2vJl|MYX_h%QOm9Zjy)Jw2|nnh`Vki)h62RCNd^cB*VUps|s7BaN?ZX z(*l|&3yUkra^5l4FON6=yoFD)&_{U4+W%~PZQ!>AULtkeri^1h?B6Q#;;ari0$;(0 z5Woq@;l+DAJF;|x&}B!%r~aR1+NNEvm{!HE3(G!Xn)soQbdzKAlA}#)ls~(i!+u9t zs#*2#kbS<)(g}(aOxgX^?a|>#O<478A3MW!;0r#+TgvCX2UG8)S=R>i6VFGl_{j7x}HM-%5|Q;8E5HRW15aIhIZ>_dTR~{{D~(0 z1mD5|PJa%s!h{R!g0+uOIliMXEkMJR delta 92 zcmZoTz|wGlWr8&0!HF`?j0ZO+EaBhG67WZUQG&pv1P(U-8z8t@P~j{;p9W)bNl|KI uZZRtZ1B3MDm;TZQAf@^f1K2mSZ}`i{>=g(KIl(eAOHX(q9RQI diff --git a/web_server/database/database.py b/web_server/database/database.py index 0fa5ff9..a617752 100644 --- a/web_server/database/database.py +++ b/web_server/database/database.py @@ -30,7 +30,21 @@ class Database: result = self.cursor.fetchone() return self.convert_to_list_dict(result) - + + def execute(self, query: str, parameters=None) -> None: + """ + Executes a command (e.g., INSERT, UPDATE, DELETE) and commits the changes. + """ + try: + if parameters: + self.cursor.execute(query, parameters) + else: + self.cursor.execute(query) + self.commit_data() + except Exception as e: + print(f"Error executing command: {e}") + raise + def convert_to_list_dict(self, result): """ Converts a query result to a list of dictionaries @@ -47,7 +61,7 @@ class Database: else: # for fetchall or fetchmany return [dict(zip(columns, row)) for row in result] - + def commit_data(self): try: self._conn.commit()