File size: 2,538 Bytes
3b25c9f
1b8b58c
3b25c9f
 
 
 
 
 
 
 
 
 
4f772d6
 
3b25c9f
 
 
 
 
 
 
d0c0836
 
 
 
 
 
 
 
3b25c9f
b6093b0
8cdcb92
b6093b0
 
8cdcb92
 
2dcfc88
d0c0836
8cdcb92
3b25c9f
1b8b58c
8cdcb92
1b8b58c
2dcfc88
8cdcb92
3b25c9f
d0c0836
3b25c9f
 
2dcfc88
8cdcb92
d0c0836
3b25c9f
 
d0c0836
3b25c9f
 
2dcfc88
3b25c9f
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
from moviepy.editor import VideoFileClip, CompositeVideoClip, TextClip
import os

def parse_srt(srt_file):
    """Parse the SRT file and return a list of (start, end, text) for each subtitle."""
    with open(srt_file, "r", encoding='utf-8') as file:
        lines = file.readlines()
    i = 0
    subtitles = []
    while i < len(lines):
        if lines[i].strip().isdigit():
            timing_str = lines[i+1].strip().split(" --> ")
            start = timing_str[0]
            end = timing_str[1]
            text = lines[i+2].strip()
            subtitles.append((start, end, text))
            i += 4
        else:
            i += 1
    return subtitles

def filter_caption_width(caption_mode:str):
    if caption_mode == 'desktop':
        caption_width_ratio = 0.5
        caption_height_ratio = 0.8
    elif caption_mode == 'mobile':
        caption_width_ratio = 0.2
        caption_height_ratio = 0.7
    return caption_width_ratio, caption_height_ratio

def subtitler(video_file:str,
            srt_path:str,
            output_file:str,
            fontsize:int,
            font: str,
            bg_color:str,
            text_color:str,
            caption_mode:str
            ):
    """Add subtitles from an SRT file to a video."""
    video_file = os.path.abspath(video_file)
    srt_path = os.path.abspath(srt_path)
    output_file = os.path.abspath(output_file)
    clip = VideoFileClip(filename=video_file, target_resolution=None)
    subtitles = parse_srt(srt_path)
    subtitle_clips = []
    caption_width_ratio, caption_height_ratio = filter_caption_width(caption_mode)
    for start, end, text in subtitles:
        # Create TextClip with specified styling
        # To get a list of possible color and font values run: print(TextClip.list("font"), '\n\n', TextClip.list("color"))
        txt_clip = TextClip(text, fontsize=fontsize, color=text_color, font=font, method='caption',
                            bg_color=bg_color, align='center', size=(clip.w*caption_width_ratio, None))
        txt_clip = txt_clip.set_position(('center', 'bottom')).set_duration(clip.duration).set_start(start).set_end(end)
        subtitle_x_position = 'center'
        subtitle_y_position = clip.h * caption_height_ratio
        text_position = (subtitle_x_position, subtitle_y_position)                    
        subtitle_clips.append(txt_clip.set_position(text_position))
    video = CompositeVideoClip(size=None, clips=[clip] + subtitle_clips)
    video.write_videofile(output_file, codec='libx264', audio_codec='aac')