* Fix pylint warnings across all 24 Python files in web_server - Add module, class, and function docstrings (C0114, C0115, C0116) - Fix import ordering: stdlib before third-party before local (C0411) - Replace wildcard imports with explicit named imports (W0401) - Remove trailing whitespace and add missing final newlines (C0303, C0304) - Replace dict() with dict literals (R1735) - Remove unused imports and variables (W0611, W0612) - Narrow broad Exception catches to specific exceptions (W0718) - Replace f-string logging with lazy % formatting (W1203) - Fix variable naming: UPPER_CASE for constants, snake_case for locals (C0103) - Add pylint disable comments for necessary global statements (W0603) - Fix no-else-return, simplifiable-if-expression, singleton-comparison - Fix bad indentation in stripe.py (W0311) - Add encoding="utf-8" to open() calls (W1514) - Add check=True to subprocess.run() calls (W1510) - Register Celery task modules via conf.include * Update `package-lock.json` add peer dependencies
88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
"""Async tasks for stream thumbnail updates, VOD creation, and image conversion."""
|
|
|
|
import subprocess
|
|
from os import listdir
|
|
|
|
from celery import shared_task
|
|
from utils.stream_utils import (
|
|
generate_thumbnail, get_streamer_live_status,
|
|
get_custom_thumbnail_status, remove_hls_files, get_video_duration
|
|
)
|
|
from utils.path_manager import PathManager
|
|
|
|
path_manager = PathManager()
|
|
|
|
@shared_task
|
|
def update_thumbnail(user_id, stream_file, thumbnail_file, sleep_time, second_capture=0) -> None:
|
|
"""
|
|
Updates the thumbnail of a stream periodically
|
|
"""
|
|
|
|
# Check if stream is still live and custom thumbnail has not been set
|
|
if (get_streamer_live_status(user_id)['is_live']
|
|
and not get_custom_thumbnail_status(user_id)['custom_thumbnail']):
|
|
print("Updating thumbnail...")
|
|
generate_thumbnail(stream_file, thumbnail_file)
|
|
update_thumbnail.apply_async(
|
|
(user_id, stream_file, thumbnail_file, sleep_time, second_capture),
|
|
countdown=sleep_time)
|
|
else:
|
|
print(f"Stopping thumbnail updates for stream of {user_id}")
|
|
|
|
@shared_task
|
|
def combine_ts_stream(stream_path, vods_path, vod_file_name, thumbnail_file) -> None:
|
|
"""
|
|
Combines all ts files into a single vod, and removes the ts files
|
|
"""
|
|
vod_file_path = f"{vods_path}/{vod_file_name}.mp4"
|
|
|
|
ts_files = [f for f in listdir(stream_path) if f.endswith(".ts")]
|
|
ts_files.sort()
|
|
|
|
# Create temp file listing all ts files
|
|
with open(f"{stream_path}/list.txt", "w", encoding="utf-8") as f:
|
|
for ts_file in ts_files:
|
|
f.write(f"file '{ts_file}'\n")
|
|
|
|
# Concatenate all ts files into a single vod
|
|
|
|
vod_command = [
|
|
"ffmpeg",
|
|
"-f",
|
|
"concat",
|
|
"-safe",
|
|
"0",
|
|
"-i",
|
|
f"{stream_path}/list.txt",
|
|
"-c",
|
|
"copy",
|
|
vod_file_path
|
|
]
|
|
|
|
subprocess.run(vod_command, check=True)
|
|
|
|
# Remove HLS files, even if user is not streaming
|
|
remove_hls_files(stream_path)
|
|
|
|
# Get video duration and choose middle frame as thumbnail
|
|
video_duration = get_video_duration(vod_file_path)
|
|
second_capture = video_duration // 2
|
|
|
|
# Generate thumbnail for vod
|
|
generate_thumbnail(vod_file_path, thumbnail_file, second_capture)
|
|
|
|
@shared_task
|
|
def convert_image_to_png(image_path, png_path):
|
|
"""
|
|
Converts an image to a png
|
|
"""
|
|
image_command = [
|
|
"ffmpeg",
|
|
"-y",
|
|
"-i",
|
|
image_path,
|
|
png_path
|
|
]
|
|
|
|
subprocess.run(image_command, check=True)
|