Files
MeBox/web/src/utils/playbackRate.ts
T
2026-09-15 00:00:35 +08:00

32 lines
1.2 KiB
TypeScript

export const PLAYBACK_RATE_OPTIONS = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3] as const
export const MIN_PLAYBACK_RATE = PLAYBACK_RATE_OPTIONS[0]
export const MAX_PLAYBACK_RATE = PLAYBACK_RATE_OPTIONS[PLAYBACK_RATE_OPTIONS.length - 1]
export function normalizePlaybackRate(value: unknown): number {
const parsed = Number(value)
if (!Number.isFinite(parsed)) return 1
let closest: number = PLAYBACK_RATE_OPTIONS[0]
let closestDistance = Number.POSITIVE_INFINITY
for (const option of PLAYBACK_RATE_OPTIONS) {
const distance = Math.abs(option - parsed)
if (distance < closestDistance) {
closest = option
closestDistance = distance
}
}
return closest
}
export function stepPlaybackRate(current: unknown, direction: 1 | -1): number {
const normalized = normalizePlaybackRate(current)
const index = PLAYBACK_RATE_OPTIONS.indexOf(normalized as (typeof PLAYBACK_RATE_OPTIONS)[number])
const next = Math.min(PLAYBACK_RATE_OPTIONS.length - 1, Math.max(0, index + direction))
return PLAYBACK_RATE_OPTIONS[next]
}
export function formatPlaybackRate(rate: unknown): string {
const normalized = normalizePlaybackRate(rate)
return `${Number.isInteger(normalized) ? normalized.toFixed(0) : String(normalized)}x`
}