Extension/Subtitler.RoughDraft.Extension.ps1

<#
.SYNOPSIS
    Creates subtitles.
.DESCRIPTION
    Creates VTT and SRT subtitles.
.EXAMPLE
    New-Media -SubtitleContent "a", "b" -SubtitleStartTime "00:00:01","00:01:01" -SubtitleEndTime "00:01:00", "00:02:00" -OutputPath .\test.srt
#>

[Management.Automation.Cmdlet("New", "Media")]
[ComponentModel.Inheritance("NotInherited")]
param(
# An array of subtitles.
# Each element represents a single subtitle
[Parameter(Mandatory)]
[string[]]
$SubtitleContent,

# An array of subtitle start times.
# Each element represents the starting time of each subtitle.
[Parameter(Mandatory)]
[Timespan[]]
$SubtitleStartTime,

# An array of subtitle end times.
# Each element represents the end time of each subtitle.
[Parameter(Mandatory)]
[Timespan[]]
$SubtitleEndTime,

# The subtitle locale. Only valid when the -OutputPath is a VTT
# If not provided, this will be automatically detected.
[string]
$SubtitleLocale,

[Parameter(Mandatory)]
[string]
$OutputPath
)

begin {
    $subtitleFileContent = [Text.StringBuilder]::new()
    $subtitleCount = 0
}

process {
    $validSubtitleExtensions = "srt", "vtt"
    if ($OutputPath -notmatch "\.(?<ext>$($validSubtitleExtensions -join '|'))$") {
        Write-Error "-OutputPath '$OutputPath' must be one of the following extensions: $validSubtitleExtensions "
        return
    }

    $subtitleExtensionType = $Matches.ext


    if ($subtitleExtensionType -eq 'vtt') {
        if (-not $SubtitleLocale) {
            $SubtitleLocale = Get-Culture | 
                Select-Object -ExpandProperty TwoLetterISOLanguageName
        }

        $null = $subtitleFileContent.AppendLine("WEBVTT")
        $null = $subtitleFileContent.AppendLine("Kind: captions")
        $null = $subtitleFileContent.AppendLine("Language: $subtitleLocale")
        $null = $subtitleFileContent.AppendLine()
    }

    for ($index = 0 ; $index -lt $SubtitleContent.Length; $index++) {
        $subtitleCount++
        $subtitleStart = $SubtitleStartTime[$index]
        if (-not $subtitleStart) { continue }
        $subtitleEnd = $SubtitleEndTime[$index]
        if (-not $subtitleEnd) { continue }
        $subStart = $subtitleStart.ToString()
        if (-not $subStart.Contains('.')) { 
            $subStart += '.000'
        }             
        if ($subStart.Length -lt 12) {
            $subStart = $subStart.PadRight(12 - $subStart.Length, '0')
        }
        $subEnd = $subtitleStart.ToString()
        if (-not $subEnd.Contains('.')) { 
            $subEnd += '.000'
        }             
        if ($subEnd.Length -lt 12) {
            $subEnd = $subStart.PadRight(12 - $subStart.Length, '0')
        }
        switch ($subtitleExtensionType) {
            vtt {
                $null = $subtitleFileContent.AppendLine("$subStart --> $subEnd")
                $null = $subtitleFileContent.AppendLine($SubtitleContent[$index])
                $subtitleFileContent.AppendLine()
            }
            srt {    
                $null = $subtitleFileContent.AppendLine($subtitleCount)
                $null = $subtitleFileContent.AppendLine("$($subStart.Replace('.', ',')) --> $($subEnd.Replace('.', ','))")
                $null = $subtitleFileContent.AppendLine($SubtitleContent[$index])
                $subtitleFileContent.AppendLine()
            }
        }        
    }
}

end {
    $subtitleFileContent | Set-Content -Path $OutputPath
}