FEAT: VoDs accessible from browser, named as {vod_id}.mp4

This commit is contained in:
2025-02-12 14:01:38 +00:00
parent 571cb9c0f5
commit 45a586748d
4 changed files with 17 additions and 5 deletions

View File

@@ -100,6 +100,14 @@ http {
expires -1d; expires -1d;
} }
# The vods location
location ~ ^/stream/(.+)/vods/(.+\.mp4)$ {
alias /stream_data/$1/vods/$2;
# The vods should not be cacheable
expires -1d;
}
location ~ ^/\?token=.*$ { location ~ ^/\?token=.*$ {
proxy_pass http://frontend:5173; proxy_pass http://frontend:5173;
proxy_http_version 1.1; proxy_http_version 1.1;

View File

@@ -237,6 +237,8 @@ def end_stream():
stream_length, stream_length,
0)) 0))
vod_id = db.get_last_insert_id()
# Set user as not streaming # Set user as not streaming
db.execute("""UPDATE users db.execute("""UPDATE users
SET is_live = 0 SET is_live = 0
@@ -245,6 +247,6 @@ def end_stream():
# Get username # Get username
username = user_info["username"] username = user_info["username"]
combine_ts_stream.delay(path_manager.get_stream_path(username), path_manager.get_vods_path(username)) combine_ts_stream.delay(path_manager.get_stream_path(username), path_manager.get_vods_path(username), vod_id)
return "Stream ended", 200 return "Stream ended", 200

View File

@@ -28,13 +28,12 @@ def update_thumbnail(stream_file, thumbnail_file, sleep_time) -> None:
sleep(sleep_time) sleep(sleep_time)
@shared_task @shared_task
def combine_ts_stream(stream_path, vods_path): def combine_ts_stream(stream_path, vods_path, vod_file_name):
""" """
Combines all ts files into a single vod, and removes the ts files Combines all ts files into a single vod, and removes the ts files
""" """
ts_files = [f for f in listdir(stream_path) if f.endswith(".ts")] ts_files = [f for f in listdir(stream_path) if f.endswith(".ts")]
ts_files.sort() ts_files.sort()
print(ts_files)
# Create temp file listing all ts files # Create temp file listing all ts files
with open(f"{stream_path}/list.txt", "w") as f: with open(f"{stream_path}/list.txt", "w") as f:
@@ -42,7 +41,6 @@ def combine_ts_stream(stream_path, vods_path):
f.write(f"file '{ts_file}'\n") f.write(f"file '{ts_file}'\n")
# Concatenate all ts files into a single vod # Concatenate all ts files into a single vod
file_name = datetime.now().strftime("%d-%m-%Y-%H-%M-%S") + ".mp4"
vod_command = [ vod_command = [
"ffmpeg", "ffmpeg",
@@ -54,7 +52,7 @@ def combine_ts_stream(stream_path, vods_path):
f"{stream_path}/list.txt", f"{stream_path}/list.txt",
"-c", "-c",
"copy", "copy",
f"{vods_path}/{file_name}" f"{vods_path}/{vod_file_name}.mp4"
] ]
subprocess.run(vod_command) subprocess.run(vod_command)

View File

@@ -54,6 +54,10 @@ class Database:
print(f"Database error: {e}") print(f"Database error: {e}")
raise raise
def get_last_insert_id(self) -> int:
"""Get the ID of the last inserted row."""
return self.cursor.lastrowid if self.cursor else None
def convert_to_list_dict(self, result): def convert_to_list_dict(self, result):
"""Convert query result to a list of dictionaries.""" """Convert query result to a list of dictionaries."""
if not result: if not result: