Skip to content

Commit 51704f4

Browse files
authored
Merge pull request advplyr#3892 from glorenzen/feat/adjustable-playback-speed-increment-decrement
Add adjustable increment and decrement value for playback rate
2 parents fbe186a + e701a0a commit 51704f4

File tree

5 files changed

+41
-15
lines changed

5 files changed

+41
-15
lines changed

client/components/controls/PlaybackSpeedControl.vue

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<div ref="wrapper" class="relative ml-4 sm:ml-8" v-click-outside="clickOutside">
33
<div class="flex items-center justify-center text-gray-300 cursor-pointer h-full" @mousedown.prevent @mouseup.prevent @click="setShowMenu(true)">
4-
<span class="text-gray-200 text-sm sm:text-base">{{ playbackRate.toFixed(1) }}<span class="text-base">x</span></span>
4+
<span class="text-gray-200 text-sm sm:text-base">{{ playbackRateDisplay }}<span class="text-base">x</span></span>
55
</div>
66
<div v-show="showMenu" class="absolute -top-[5.5rem] z-20 bg-bg border-black-200 border shadow-xl rounded-lg" :style="{ left: menuLeft + 'px' }">
77
<div class="absolute -bottom-1.5 right-0 w-full flex justify-center" :style="{ left: arrowLeft + 'px' }">
@@ -19,7 +19,7 @@
1919
<div class="w-full py-1 px-1">
2020
<div class="flex items-center justify-between">
2121
<ui-icon-btn :disabled="!canDecrement" icon="remove" @click="decrement" />
22-
<p class="px-2 text-2xl sm:text-3xl">{{ playbackRate }}<span class="text-2xl">x</span></p>
22+
<p class="px-2 text-2xl sm:text-3xl">{{ playbackRateDisplay }}<span class="text-2xl">x</span></p>
2323
<ui-icon-btn :disabled="!canIncrement" icon="add" @click="increment" />
2424
</div>
2525
</div>
@@ -33,6 +33,10 @@ export default {
3333
value: {
3434
type: [String, Number],
3535
default: 1
36+
},
37+
playbackRateIncrementDecrement: {
38+
type: Number,
39+
default: 0.1
3640
}
3741
},
3842
data() {
@@ -58,10 +62,17 @@ export default {
5862
return [0.5, 1, 1.2, 1.5, 2]
5963
},
6064
canIncrement() {
61-
return this.playbackRate + 0.1 <= this.MAX_SPEED
65+
return this.playbackRate + this.playbackRateIncrementDecrement <= this.MAX_SPEED
6266
},
6367
canDecrement() {
64-
return this.playbackRate - 0.1 >= this.MIN_SPEED
68+
return this.playbackRate - this.playbackRateIncrementDecrement >= this.MIN_SPEED
69+
},
70+
playbackRateDisplay() {
71+
if (this.playbackRateIncrementDecrement == 0.05) return this.playbackRate.toFixed(2)
72+
// For 0.1 increment: Only show 2 decimal places if the playback rate is 2 decimals
73+
const numDecimals = String(this.playbackRate).split('.')[1]?.length || 0
74+
if (numDecimals <= 1) return this.playbackRate.toFixed(1)
75+
return this.playbackRate.toFixed(2)
6576
}
6677
},
6778
methods: {
@@ -73,14 +84,14 @@ export default {
7384
this.$nextTick(() => this.setShowMenu(false))
7485
},
7586
increment() {
76-
if (this.playbackRate + 0.1 > this.MAX_SPEED) return
77-
var newPlaybackRate = this.playbackRate + 0.1
78-
this.playbackRate = Number(newPlaybackRate.toFixed(1))
87+
if (this.playbackRate + this.playbackRateIncrementDecrement > this.MAX_SPEED) return
88+
var newPlaybackRate = this.playbackRate + this.playbackRateIncrementDecrement
89+
this.playbackRate = Number(newPlaybackRate.toFixed(2))
7990
},
8091
decrement() {
81-
if (this.playbackRate - 0.1 < this.MIN_SPEED) return
82-
var newPlaybackRate = this.playbackRate - 0.1
83-
this.playbackRate = Number(newPlaybackRate.toFixed(1))
92+
if (this.playbackRate - this.playbackRateIncrementDecrement < this.MIN_SPEED) return
93+
var newPlaybackRate = this.playbackRate - this.playbackRateIncrementDecrement
94+
this.playbackRate = Number(newPlaybackRate.toFixed(2))
8495
},
8596
updateMenuPositions() {
8697
if (!this.$refs.wrapper) return

client/components/modals/PlayerSettingsModal.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
<div class="flex items-center mb-4">
1212
<ui-select-input v-model="jumpForwardAmount" :label="$strings.LabelJumpForwardAmount" menuMaxHeight="250px" :items="jumpValues" @input="setJumpForwardAmount" />
1313
</div>
14-
<div class="flex items-center">
14+
<div class="flex items-center mb-4">
1515
<ui-select-input v-model="jumpBackwardAmount" :label="$strings.LabelJumpBackwardAmount" menuMaxHeight="250px" :items="jumpValues" @input="setJumpBackwardAmount" />
1616
</div>
17+
<div class="flex items-center mb-4">
18+
<ui-select-input v-model="playbackRateIncrementDecrement" :label="$strings.LabelPlaybackRateIncrementDecrement" menuMaxHeight="250px" :items="playbackRateIncrementDecrementValues" @input="setPlaybackRateIncrementDecrementAmount" />
19+
</div>
1720
</div>
1821
</modals-modal>
1922
</template>
@@ -35,7 +38,9 @@ export default {
3538
{ text: this.$getString('LabelTimeDurationXMinutes', ['5']), value: 300 }
3639
],
3740
jumpForwardAmount: 10,
38-
jumpBackwardAmount: 10
41+
jumpBackwardAmount: 10,
42+
playbackRateIncrementDecrementValues: [0.1, 0.05],
43+
playbackRateIncrementDecrement: 0.1
3944
}
4045
},
4146
computed: {
@@ -60,10 +65,15 @@ export default {
6065
this.jumpBackwardAmount = val
6166
this.$store.dispatch('user/updateUserSettings', { jumpBackwardAmount: val })
6267
},
68+
setPlaybackRateIncrementDecrementAmount(val) {
69+
this.playbackRateIncrementDecrement = val
70+
this.$store.dispatch('user/updateUserSettings', { playbackRateIncrementDecrement: val })
71+
},
6372
settingsUpdated() {
6473
this.useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack')
6574
this.jumpForwardAmount = this.$store.getters['user/getUserSetting']('jumpForwardAmount')
6675
this.jumpBackwardAmount = this.$store.getters['user/getUserSetting']('jumpBackwardAmount')
76+
this.playbackRateIncrementDecrement = this.$store.getters['user/getUserSetting']('playbackRateIncrementDecrement')
6777
}
6878
},
6979
mounted() {

client/components/player/PlayerUi.vue

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="w-full -mt-6">
33
<div class="w-full relative mb-1">
44
<div class="absolute -top-10 lg:top-0 right-0 lg:right-2 flex items-center h-full">
5-
<controls-playback-speed-control v-model="playbackRate" @input="setPlaybackRate" @change="playbackRateChanged" class="mx-2 block" />
5+
<controls-playback-speed-control v-model="playbackRate" @input="setPlaybackRate" @change="playbackRateChanged" :playbackRateIncrementDecrement="playbackRateIncrementDecrement" class="mx-2 block" />
66

77
<ui-tooltip direction="bottom" :text="$strings.LabelVolume">
88
<controls-volume-control ref="volumeControl" v-model="volume" @input="setVolume" class="mx-2 hidden sm:block" />
@@ -180,6 +180,9 @@ export default {
180180
useChapterTrack() {
181181
const _useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack') || false
182182
return this.chapters.length ? _useChapterTrack : false
183+
},
184+
playbackRateIncrementDecrement() {
185+
return this.$store.getters['user/getUserSetting']('playbackRateIncrementDecrement')
183186
}
184187
},
185188
methods: {
@@ -223,12 +226,12 @@ export default {
223226
},
224227
increasePlaybackRate() {
225228
if (this.playbackRate >= 10) return
226-
this.playbackRate = Number((this.playbackRate + 0.1).toFixed(1))
229+
this.playbackRate = Number((this.playbackRate + this.playbackRateIncrementDecrement || 0.1).toFixed(2))
227230
this.setPlaybackRate(this.playbackRate)
228231
},
229232
decreasePlaybackRate() {
230233
if (this.playbackRate <= 0.5) return
231-
this.playbackRate = Number((this.playbackRate - 0.1).toFixed(1))
234+
this.playbackRate = Number((this.playbackRate - this.playbackRateIncrementDecrement || 0.1).toFixed(2))
232235
this.setPlaybackRate(this.playbackRate)
233236
},
234237
playbackRateChanged(playbackRate) {

client/store/user.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const state = () => ({
55
orderDesc: false,
66
filterBy: 'all',
77
playbackRate: 1,
8+
playbackRateIncrementDecrement: 0.1,
89
bookshelfCoverSize: 120,
910
collapseSeries: false,
1011
collapseBookSeries: false,

client/strings/en-us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@
486486
"LabelPersonalYearReview": "Your Year in Review ({0})",
487487
"LabelPhotoPathURL": "Photo Path/URL",
488488
"LabelPlayMethod": "Play Method",
489+
"LabelPlaybackRateIncrementDecrement": "Playback Rate Increment/Decrement Amount",
489490
"LabelPlayerChapterNumberMarker": "{0} of {1}",
490491
"LabelPlaylists": "Playlists",
491492
"LabelPodcast": "Podcast",

0 commit comments

Comments
 (0)