File size: 3,208 Bytes
dc61d50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import os
from utils.create_subtitles import hex_to_ffmpeg_color, create_subtitles
from utils.transcribe_audio import transcribe_audio
from utils.video_to_audio import extract_audio
import subprocess


def generate_rumble_clips(customization_options, output_directory="./data/rumble/clips"):
	customization_options['font_color'] = hex_to_ffmpeg_color(customization_options['font_color'])
	audio_file_path = "./data/rumble/audio.mp3"
	subtitle_file = "./data/rumble/subtitles.srt"

	clips = []

	for idx, clip in enumerate(customization_options['clips']):
		# Generate the clip
		video_clip_path = cut_video(customization_options['video_url'], clip.start, clip.end, output_directory, idx)
		clip.clip_link = video_clip_path
		clips.append(clip)

		# Generate the subtitles
		extract_audio(video_clip_path, audio_file_path)
		transcription = transcribe_audio(audio_file_path)
		create_subtitles(transcription, subtitle_file)

		# Add the subtitle to the video
		subtitle_video_clip = add_subtitle(video_clip_path, subtitle_file, customization_options)

		# Add the text to the video
		video_with_text = add_text_to_video(subtitle_video_clip, customization_options)

		video_sped_up = speed_up_video(video_with_text)
		clip.clip_link = video_sped_up
	
	return clips


def cut_video(input_url, start_time, end_time, output_directory, idx):
	output_filepath = os.path.join(output_directory, f'output_clip_{idx}.mp4')

	command = [
		'ffmpeg',
		'-i', input_url,
		'-ss', start_time,
		'-to', end_time,
		'-y', output_filepath
	]

	subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

	return output_filepath


def add_subtitle(video_path, subtitle_file, customization_options):
	output_filepath = video_path.replace('.mp4', '_with_subtitle.mp4')

	subtitle_cmd = [
		"ffmpeg",
		"-i", video_path,
		"-vf", f"subtitles={subtitle_file}:force_style='Fontsize={customization_options['font_size']},PrimaryColour={customization_options['font_color']},Fontname={customization_options['font_family']},MarginV=50'",
		"-c:a", "copy",
		'-y', output_filepath
	]

	subprocess.run(subtitle_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

	return output_filepath


def add_text_to_video(video_path, customization_options):
	output_filepath = video_path.replace('.mp4', '_with_text.mp4')

	text_cmd = [
		"ffmpeg",
		"-i", video_path,
		'-vf', f'drawtext=text=\'{customization_options["credit"]}\':fontcolor=white:fontsize={customization_options["credit_size"]}:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=h-text_h-10',
		"-c:a", "copy",
		'-y', output_filepath
	]

	subprocess.run(text_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

	return output_filepath


def speed_up_video(video_path):
    output_filepath = video_path.replace('.mp4', '_sped_up.mp4')

    speed_up_cmd = [
        "ffmpeg",
        "-i", video_path,
        "-filter:v", "setpts=0.66*PTS",  # Speed up by 1.5x (1/1.5 = 0.6666)
        "-filter:a", "atempo=1.5",  # Speed up audio as well
        "-c:v", "libx264", "-c:a", "aac",
        "-strict", "experimental",
        "-y", output_filepath
    ]

    subprocess.run(speed_up_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    return output_filepath