videoflix/backend/video_app/tasks.py

90 lines
No EOL
3.2 KiB
Python

import shutil
import subprocess
import ffmpeg
import os
from django.conf import settings
def convert_video_to_hls(source, resolution, model_id):
"""
Converts a video to the HLS format
"""
resolution_after_x = resolution.split('x')[1] if 'x' in resolution else resolution
target_dir = os.path.join(settings.VIDEO_DIR, str(model_id))
os.makedirs(target_dir, exist_ok=True)
base_filename = os.path.basename(source).split(".")[0]
target = os.path.join(target_dir, f'{base_filename}_{resolution_after_x}p')
ffmpeg_path = shutil.which("ffmpeg")
cmd = [
ffmpeg_path,
'-i', source,
'-s', resolution,
'-c:v', 'libx264',
'-crf', '23',
'-c:a', 'aac',
'-strict', '-2',
'-hls_time', '10',
'-hls_playlist_type', 'vod',
'-hls_segment_filename', os.path.join(target_dir, f'{base_filename}_{resolution_after_x}p_%03d.ts'),
f'{target}.m3u8'
]
subprocess.run(cmd, capture_output=True, text=True)
def delete_original_video(source):
"""
Deletes the original MP4 file.
"""
try:
os.remove(source)
except OSError as e:
print(f"Error deleting original file: {e}")
def create_thumbnails(instance, model_id):
"""
Creates high-resolution and low-resolution thumbnails from a video file.
"""
video_file_path = instance.file_path.path
thumbnail_dir = os.path.join(settings.THUMBNAIL_DIR, str(model_id))
base_filename = os.path.splitext(os.path.basename(video_file_path))[0]
thumbnail_1080p_filename = base_filename + '_1080p.jpg'
thumbnail_1080p_path = os.path.join(thumbnail_dir, thumbnail_1080p_filename)
thumbnail_480_filename = base_filename + '_480p.jpg'
thumbnail_480_path = os.path.join(thumbnail_dir, thumbnail_480_filename)
if not os.path.exists(thumbnail_dir):
os.makedirs(thumbnail_dir)
try:
# Generate the image thumbnails
ffmpeg.input(video_file_path, ss=1).output(thumbnail_1080p_path, vf='scale=1920:-1', vframes=1).run(overwrite_output=True)
ffmpeg.input(video_file_path, ss=1).output(thumbnail_480_path, vf='scale=720:-1', vframes=1).run(overwrite_output=True)
# Create the 10-second video thumbnail
create_video_thumbnail(video_file_path, thumbnail_dir, base_filename)
except ffmpeg._run.Error as e:
error_message = e.stderr.decode() if e.stderr else "Unknown ffmpeg error"
print(f"An error has occurred: {error_message}")
def create_video_thumbnail(video_file_path, thumbnail_dir, base_filename):
"""
Creates a 10-second video thumbnail from a video file without audio.
"""
video_thumbnail_filename = base_filename + '_video-thumbnail.mp4'
video_thumbnail_path = os.path.join(thumbnail_dir, video_thumbnail_filename)
try:
ffmpeg.input(video_file_path, ss=1, t=10).output(
video_thumbnail_path,
vf='scale=1280:-1',
vcodec='libx264',
an=None # Disable audio
).run(overwrite_output=True)
except ffmpeg._run.Error as e:
error_message = e.stderr.decode() if e.stderr else "Unknown ffmpeg error"
print(f"An error has occurred: {error_message}")