(
seconds: number,
options: { fractionalDigits?: number; trimZeroFraction?: boolean } = {},
)
| 129 | } |
| 130 | |
| 131 | function formatTimecode( |
| 132 | seconds: number, |
| 133 | options: { fractionalDigits?: number; trimZeroFraction?: boolean } = {}, |
| 134 | ): string { |
| 135 | const safeSeconds = Number.isFinite(seconds) ? Math.max(0, seconds) : 0; |
| 136 | const fractionalDigits = Math.max(0, options.fractionalDigits ?? 0); |
| 137 | const precisionFactor = 10 ** fractionalDigits; |
| 138 | const totalTicks = |
| 139 | fractionalDigits > 0 |
| 140 | ? Math.round(safeSeconds * precisionFactor) |
| 141 | : Math.floor(safeSeconds); |
| 142 | const totalSeconds = |
| 143 | fractionalDigits > 0 |
| 144 | ? Math.floor(totalTicks / precisionFactor) |
| 145 | : totalTicks; |
| 146 | const hours = Math.floor(totalSeconds / 3600); |
| 147 | const minutes = Math.floor((totalSeconds % 3600) / 60); |
| 148 | const remainingSeconds = totalSeconds % 60; |
| 149 | const paddedSeconds = String(remainingSeconds).padStart(2, "0"); |
| 150 | const fraction = fractionalDigits > 0 ? totalTicks % precisionFactor : 0; |
| 151 | |
| 152 | const baseTimecode = |
| 153 | hours > 0 |
| 154 | ? `${hours}:${String(minutes).padStart(2, "0")}:${paddedSeconds}` |
| 155 | : `${String(minutes).padStart(2, "0")}:${paddedSeconds}`; |
| 156 | |
| 157 | if ( |
| 158 | fractionalDigits <= 0 || |
| 159 | (options.trimZeroFraction === true && fraction === 0) |
| 160 | ) { |
| 161 | return baseTimecode; |
| 162 | } |
| 163 | |
| 164 | return `${baseTimecode}.${String(fraction).padStart(fractionalDigits, "0")}`; |
| 165 | } |
| 166 | |
| 167 | function formatCommentTimecode(seconds: number): string { |
| 168 | return formatTimecode(seconds, { |
no outgoing calls
no test coverage detected