Public/Timestamps/Get-SubtitleDuration.ps1
|
function Get-SubtitleDuration { <# .SYNOPSIS Returns duration statistics for a SubtitleFile. .DESCRIPTION Reports: total span (first start to last end), average entry duration, shortest and longest entry durations, and total display time. .PARAMETER InputObject A SubtitleFile object. .EXAMPLE Import-SubtitleFile 'movie.srt' | Get-SubtitleDuration #> [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [SubtitleFile] $InputObject ) process { if ($InputObject.Entries.Count -eq 0) { return [PSCustomObject]@{ EntryCount = 0 FirstStart = [TimeSpan]::Zero LastEnd = [TimeSpan]::Zero TotalSpan = [TimeSpan]::Zero TotalDisplayTime = [TimeSpan]::Zero AverageDuration = [TimeSpan]::Zero ShortestDuration = [TimeSpan]::Zero LongestDuration = [TimeSpan]::Zero } } $sorted = $InputObject.Entries | Sort-Object Start $firstStart = $sorted[0].Start $lastEnd = ($sorted | Sort-Object End | Select-Object -Last 1).End $durations = $sorted | ForEach-Object { $_.End - $_.Start } $totalMs = ($durations | Measure-Object -Property TotalMilliseconds -Sum).Sum $avgMs = $totalMs / $durations.Count $minMs = ($durations | Measure-Object -Property TotalMilliseconds -Minimum).Minimum $maxMs = ($durations | Measure-Object -Property TotalMilliseconds -Maximum).Maximum return [PSCustomObject]@{ EntryCount = $InputObject.Entries.Count FirstStart = $firstStart LastEnd = $lastEnd TotalSpan = $lastEnd - $firstStart TotalDisplayTime = [TimeSpan]::FromMilliseconds($totalMs) AverageDuration = [TimeSpan]::FromMilliseconds($avgMs) ShortestDuration = [TimeSpan]::FromMilliseconds($minMs) LongestDuration = [TimeSpan]::FromMilliseconds($maxMs) } } } |