Public/Timestamps/Split-SubtitleFile.ps1
|
function Split-SubtitleFile { <# .SYNOPSIS Splits a SubtitleFile into multiple files by time range or entry count. .DESCRIPTION Use -AtTime to split at a specific timestamp (entries before go to first output, entries at or after go to second output). Use -ChunkSize to split into equal-sized chunks. .PARAMETER InputObject A SubtitleFile object. .PARAMETER AtTime A TimeSpan at which to split the file into two parts. .PARAMETER ChunkSize Number of entries per chunk (splits into N/ChunkSize files). .EXAMPLE $parts = Import-SubtitleFile 'long.srt' | Split-SubtitleFile -AtTime '01:00:00' $parts[0] | Export-SubtitleFile -Path 'part1.srt' $parts[1] | Export-SubtitleFile -Path 'part2.srt' .EXAMPLE Import-SubtitleFile 'movie.srt' | Split-SubtitleFile -ChunkSize 100 #> [CmdletBinding(DefaultParameterSetName = 'AtTime')] [OutputType('SubtitleFile[]')] param( [Parameter(Mandatory, ValueFromPipeline)] [SubtitleFile] $InputObject, [Parameter(Mandatory, ParameterSetName = 'AtTime')] [TimeSpan] $AtTime, [Parameter(Mandatory, ParameterSetName = 'ChunkSize')] [int] $ChunkSize ) process { $results = [System.Collections.Generic.List[SubtitleFile]]::new() if ($PSCmdlet.ParameterSetName -eq 'AtTime') { $before = @($InputObject.Entries | Where-Object { $_.Start -lt $AtTime }) $after = @($InputObject.Entries | Where-Object { $_.Start -ge $AtTime }) foreach ($group in @($before, $after)) { $chunk = [SubtitleFile]::new() $chunk.Format = $InputObject.Format $chunk.Encoding = $InputObject.Encoding $chunk.Header = $InputObject.Header $chunk.Entries = $group # Re-index $i = 1 foreach ($e in $chunk.Entries) { $e.Index = $i++ } $results.Add($chunk) } } else { $allEntries = $InputObject.Entries $total = $allEntries.Count for ($start = 0; $start -lt $total; $start += $ChunkSize) { $sliceEnd = [Math]::Min($start + $ChunkSize, $total) - 1 $slice = $allEntries[$start..$sliceEnd] $chunk = [SubtitleFile]::new() $chunk.Format = $InputObject.Format $chunk.Encoding = $InputObject.Encoding $chunk.Header = $InputObject.Header $chunk.Entries = $slice $i = 1 foreach ($e in $chunk.Entries) { $e.Index = $i++ } $results.Add($chunk) } } return $results.ToArray() } } |