Fixing WebVTT Times with Python

See Python: Tips and Tricks for similar articles.

Every once in a while, we need to make an edit to a video for which we already have closed captioning. If the edit affects the length of the video; for example, if we removed or added a segment to the video; then we will also need to edit the WebVTT file. Doing so manually is a pain, so I created a short Python function for handling this.

Here is the function:

from datetime import datetime, timedelta
    
def fix_vtt_times(vtt_input, seconds):
    """Fixes times in WebVTT by adding the passed-in seconds to all the timestamps.

    Args:
        vtt_input (str): The text of the WebVTT
        seconds (float): The seconds to add. Use negative number to subtract.
    """
    td = timedelta(seconds=seconds)
    dt_format = "%H:%M:%S.%f"
    vtt_output = ""

    for line in vtt_input.splitlines():

        if "-->" not in line:
            # This line doesn't have times. Just append it as is.
            vtt_output += line + "\n"
            continue

        start, end = line.split(" --> ")
        start = start.strip()
        end = end.strip()

        start_time_fixed = datetime.strptime(start, dt_format) + td
        end_time_fixed = datetime.strptime(end, dt_format) + td

        start_time = start_time_fixed.strftime(dt_format)
        end_time = end_time_fixed.strftime(dt_format)

        vtt_output += f"{start_time} --> {end_time}\n"

    return vtt_output

To use it, pass in the portion of the WebVTT content that you need to update and the number of seconds to add (or subtract). For example:

vtt = """00:00:46.750 --> 00:00:51.760
This is the result of launching our file in the Chrome browser.

00:00:51.760 --> 00:00:56.830
Notice that h1 renders a larger font in h2,

00:00:56.830 --> 00:01:01.420
and h2 renders a larger font than h3, and so on"""

seconds=-6.3

fixed_text = fix_vtt_times(vtt, seconds)

After running this, fixed_text will contain:

00:00:40.450000 --> 00:00:45.460000
This is the result of launching our file in the Chrome browser.

00:00:45.460000 --> 00:00:50.530000
Notice that h1 renders a larger font in h2,

00:00:50.530000 --> 00:00:55.120000
and h2 renders a larger font than h3, and so on

Notice that all the timestamps have had 6.3 seconds subtracted from them.