feat: implement smart speed UI and state persistence

This commit is contained in:
Jonathan Baldie 2026-05-01 21:36:59 +01:00
parent 4299fdce59
commit fa2460868e
7 changed files with 150 additions and 2 deletions

View file

@ -17,6 +17,18 @@
<div class="flex items-center mb-4">
<ui-select-input v-model="playbackRateIncrementDecrement" :label="$strings.LabelPlaybackRateIncrementDecrement" menuMaxHeight="250px" :items="playbackRateIncrementDecrementValues" @input="setPlaybackRateIncrementDecrementAmount" />
</div>
<div v-if="!isCasting" class="w-full h-px bg-white/10 my-6"></div>
<div v-if="!isCasting" class="flex items-center mb-4">
<ui-toggle-switch v-model="enableSmartSpeed" @input="setEnableSmartSpeed" />
<div class="pl-4">
<span>{{ $strings.LabelEnableSmartSpeed || 'Enable Smart Speed' }}</span>
</div>
</div>
<div v-if="!isCasting" class="flex items-center mb-4" :class="{'opacity-50 pointer-events-none': !enableSmartSpeed}">
<ui-select-input v-model="smartSpeedRatio" :label="$strings.LabelSmartSpeedRatio || 'Smart Speed Compression Ratio'" menuMaxHeight="250px" :items="smartSpeedRatioValues" @input="setSmartSpeedRatio" />
</div>
</div>
</modals-modal>
</template>
@ -40,7 +52,17 @@ export default {
jumpForwardAmount: 10,
jumpBackwardAmount: 10,
playbackRateIncrementDecrementValues: [0.1, 0.05],
playbackRateIncrementDecrement: 0.1
playbackRateIncrementDecrement: 0.1,
enableSmartSpeed: false,
smartSpeedRatio: 2.5,
smartSpeedRatioValues: [
{ text: '1.5x', value: 1.5 },
{ text: '2.0x', value: 2.0 },
{ text: '2.5x', value: 2.5 },
{ text: '3.0x', value: 3.0 },
{ text: '4.0x', value: 4.0 },
{ text: '5.0x', value: 5.0 }
]
}
},
computed: {
@ -51,6 +73,9 @@ export default {
set(val) {
this.$emit('input', val)
}
},
isCasting() {
return this.$store.state.globals.isCasting || false
}
},
methods: {
@ -69,11 +94,24 @@ export default {
this.playbackRateIncrementDecrement = val
this.$store.dispatch('user/updateUserSettings', { playbackRateIncrementDecrement: val })
},
setEnableSmartSpeed() {
this.$store.commit('user/SET_SMART_SPEED_ENABLED', this.enableSmartSpeed)
},
setSmartSpeedRatio(val) {
this.smartSpeedRatio = val
this.$store.commit('user/SET_SMART_SPEED_RATIO', val)
},
settingsUpdated() {
this.useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack')
this.jumpForwardAmount = this.$store.getters['user/getUserSetting']('jumpForwardAmount')
this.jumpBackwardAmount = this.$store.getters['user/getUserSetting']('jumpBackwardAmount')
this.playbackRateIncrementDecrement = this.$store.getters['user/getUserSetting']('playbackRateIncrementDecrement')
const enableSmartSpeed = this.$store.getters['user/getUserSetting']('enableSmartSpeed')
this.enableSmartSpeed = enableSmartSpeed !== null ? enableSmartSpeed : false
const smartSpeedRatio = this.$store.getters['user/getUserSetting']('smartSpeedRatio')
this.smartSpeedRatio = smartSpeedRatio !== null ? smartSpeedRatio : 2.5
}
},
mounted() {

View file

@ -1,5 +1,11 @@
<template>
<div class="relative">
<!-- Smart Speed Indicator -->
<div v-if="isSmartSpeedEnabled && !isCasting" class="absolute -top-6 right-0 text-xs text-yellow-400 flex items-center bg-black/50 px-2 py-0.5 rounded shadow-sm z-10 pointer-events-none">
<span class="material-symbols text-sm mr-1">bolt</span>
<span>Smart Speed Active</span>
</div>
<!-- Track -->
<div ref="track" class="w-full h-2 bg-gray-700 relative cursor-pointer transform duration-100 hover:scale-y-125 overflow-hidden" @mousemove="mousemoveTrack" @mouseleave="mouseleaveTrack" @click.stop="clickTrack">
<div ref="readyTrack" class="h-full bg-gray-600 absolute top-0 left-0 pointer-events-none" />
@ -63,6 +69,12 @@ export default {
}
},
computed: {
isCasting() {
return this.$store.state.globals.isCasting || false
},
isSmartSpeedEnabled() {
return this.$store.getters['user/getUserSetting']('enableSmartSpeed') || false
},
_playbackRate() {
if (!this.playbackRate || isNaN(this.playbackRate)) return 1
return this.playbackRate

View file

@ -326,11 +326,22 @@ export default {
if (this.$refs.trackbar) this.$refs.trackbar.setUseChapterTrack(this.useChapterTrack)
this.setPlaybackRate(this.playbackRate)
const enableSmartSpeed = this.$store.getters['user/getUserSetting']('enableSmartSpeed')
const smartSpeedRatio = this.$store.getters['user/getUserSetting']('smartSpeedRatio')
if (this.playerHandler && this.playerHandler.isPlayingLocalItem) {
this.playerHandler.setSmartSpeed(enableSmartSpeed || false, smartSpeedRatio || 2.5)
}
},
settingsUpdated(settings) {
if (settings.playbackRate && this.playbackRate !== settings.playbackRate) {
this.setPlaybackRate(settings.playbackRate)
}
if (this.playerHandler && this.playerHandler.isPlayingLocalItem && (settings.enableSmartSpeed !== undefined || settings.smartSpeedRatio !== undefined)) {
const enableSmartSpeed = settings.enableSmartSpeed !== undefined ? settings.enableSmartSpeed : this.$store.getters['user/getUserSetting']('enableSmartSpeed')
const smartSpeedRatio = settings.smartSpeedRatio !== undefined ? settings.smartSpeedRatio : this.$store.getters['user/getUserSetting']('smartSpeedRatio')
this.playerHandler.setSmartSpeed(enableSmartSpeed || false, smartSpeedRatio || 2.5)
}
},
closePlayer() {
if (this.isFullscreen) {