diff --git a/render_utils.py b/render_utils.py index b099714..8a39d7e 100644 --- a/render_utils.py +++ b/render_utils.py @@ -116,6 +116,28 @@ def shift_clips(data, offset): return data +def ass_timestamp(seconds): + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + secs = seconds % 60 + + whole_seconds = int(secs) + centiseconds = int(round((secs - whole_seconds) * 100)) + + # Handle centisecond rollover (e.g., 59.999 → 60.00) + if centiseconds == 100: + whole_seconds += 1 + centiseconds = 0 + if whole_seconds == 60: + whole_seconds = 0 + minutes += 1 + if minutes == 60: + minutes = 0 + hours += 1 + + return f"{hours}:{minutes:02d}:{whole_seconds:02d}.{centiseconds:02d}" + + def ass_encode(subs, options): if "lang" in options: langs = options["lang"].split(",") @@ -158,8 +180,8 @@ Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text" ] for sub in subs: - start = ox.format_timecode(sub["in"]).rstrip("0") - stop = ox.format_timecode(sub["out"]).rstrip("0") + start = ass_timestamp(sub["in"]) + stop = ass_timestamp(sub["out"]) for lang in reversed(langs): value = sub["values"][lang] event = f"Dialogue: 0,{start},{stop},{lang},,0,0,0,,{value}"