File size: 1,611 Bytes
98cfa00
a412151
9c6e6f5
a412151
5bbf36c
a412151
 
67bad4d
f852696
a412151
 
 
 
 
9c6e6f5
a412151
f6f0a6c
9c6e6f5
a412151
 
 
 
9c6e6f5
bd5c806
a412151
 
 
 
 
9c6e6f5
a412151
 
 
9c6e6f5
a412151
9c6e6f5
 
a412151
9c6e6f5
a412151
9c6e6f5
a412151
 
 
9c6e6f5
a412151
 
 
 
 
 
 
 
9c6e6f5
a412151
9c6e6f5
a412151
 
 
 
 
 
9c6e6f5
a412151
 
 
9c6e6f5
a412151
 
9c6e6f5
a412151
9c6e6f5
a412151
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
import os
import subprocess
import uuid
from utils.logger import logger

OUTPUT_DIR = "jobs"
os.makedirs(OUTPUT_DIR, exist_ok=True)


def render_subtitles(
    video_path: str,
    srt_text: str,
    output_path: str | None = None,
):
    """
    Universal subtitle renderer for V7.

    Supports:
    - API render
    - UI render
    - Batch jobs
    - Worker queue
    """

    if output_path is None:
        output_path = os.path.join(
            OUTPUT_DIR,
            f"{uuid.uuid4()}_render.mp4"
        )

    # --------------------------------------------------
    # Write SRT file
    # --------------------------------------------------

    srt_path = output_path.replace(".mp4", ".srt")

    with open(srt_path, "w", encoding="utf-8") as f:
        f.write(srt_text)

    logger.info(f"[RENDER] SRT saved → {srt_path}")

    # --------------------------------------------------
    # FFmpeg Subtitle Burn
    # --------------------------------------------------

    cmd = [
        "ffmpeg",
        "-y",
        "-i", video_path,
        "-vf", f"subtitles={srt_path}",
        "-c:a", "copy",
        output_path,
    ]

    logger.info("[RENDER] Running ffmpeg render")

    process = subprocess.run(
        cmd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )

    if process.returncode != 0:
        logger.error(process.stderr)
        raise Exception("FFmpeg render failed")

    if not os.path.exists(output_path):
        raise Exception("Rendered file missing")

    logger.info(f"[RENDER] Output → {output_path}")

    return output_path