From c68c1a3c8261919e1ffbbd2ea103d3a199e159de Mon Sep 17 00:00:00 2001 From: rahim Date: Mon, 6 Apr 2026 22:07:09 -0700 Subject: [PATCH] feat(core): add sub-1x playback rates to defaults (#1231) --- .../tests/playback-rate-button-core.test.ts | 17 ++++++++++++----- .../src/dom/store/features/playback-rate.ts | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts b/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts index 9532a409..192137c8 100644 --- a/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts +++ b/packages/core/src/core/ui/playback-rate-button/tests/playback-rate-button-core.test.ts @@ -6,7 +6,7 @@ import { PlaybackRateButtonCore } from '../playback-rate-button-core'; function createMediaState(overrides: Partial = {}): MediaPlaybackRateState { return { - playbackRates: [1, 1.2, 1.5, 1.7, 2], + playbackRates: [0.25, 0.5, 0.75, 1, 1.2, 1.5, 1.7, 2], playbackRate: 1, setPlaybackRate: vi.fn(), ...overrides, @@ -96,7 +96,7 @@ describe('PlaybackRateButtonCore', () => { const core = new PlaybackRateButtonCore(); const media = createMediaState({ playbackRate: 2 }); core.cycle(media); - expect(media.setPlaybackRate).toHaveBeenCalledWith(1); + expect(media.setPlaybackRate).toHaveBeenCalledWith(0.25); }); it('advances through the middle of the list', () => { @@ -108,9 +108,9 @@ describe('PlaybackRateButtonCore', () => { it('finds the first rate greater than current when not in list', () => { const core = new PlaybackRateButtonCore(); - const media = createMediaState({ playbackRate: 0.75 }); + const media = createMediaState({ playbackRate: 0.3 }); core.cycle(media); - expect(media.setPlaybackRate).toHaveBeenCalledWith(1); + expect(media.setPlaybackRate).toHaveBeenCalledWith(0.5); }); it('finds the next greater rate when between list values', () => { @@ -124,7 +124,14 @@ describe('PlaybackRateButtonCore', () => { const core = new PlaybackRateButtonCore(); const media = createMediaState({ playbackRate: 3 }); core.cycle(media); - expect(media.setPlaybackRate).toHaveBeenCalledWith(1); + expect(media.setPlaybackRate).toHaveBeenCalledWith(0.25); + }); + + it('cycles through sub-1x rates', () => { + const core = new PlaybackRateButtonCore(); + const media = createMediaState({ playbackRate: 0.25 }); + core.cycle(media); + expect(media.setPlaybackRate).toHaveBeenCalledWith(0.5); }); it('does nothing when disabled', () => { diff --git a/packages/core/src/dom/store/features/playback-rate.ts b/packages/core/src/dom/store/features/playback-rate.ts index 8437f29d..6bb5a01f 100644 --- a/packages/core/src/dom/store/features/playback-rate.ts +++ b/packages/core/src/dom/store/features/playback-rate.ts @@ -3,7 +3,7 @@ import { listen } from '@videojs/utils/dom'; import type { MediaPlaybackRateState } from '../../../core/media/state'; import { definePlayerFeature } from '../../feature'; -const DEFAULT_RATES: readonly number[] = [1, 1.2, 1.5, 1.7, 2]; +const DEFAULT_RATES: readonly number[] = [0.25, 0.5, 0.75, 1, 1.2, 1.5, 1.7, 2]; export const playbackRateFeature = definePlayerFeature({ name: 'playbackRate',