Skip to content

Commit 4acc267

Browse files
committed
Implement chapter time over full audiobook duration
1 parent b3e46e9 commit 4acc267

File tree

3 files changed

+60
-13
lines changed

3 files changed

+60
-13
lines changed

src/layouts/default/PlayerOSD/PlayerTimeline.vue

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"
1313
style="width: 100%"
1414
:min="0"
15-
:max="store.curQueueItem?.duration"
15+
:max="playerCurQueueItemDuration"
1616
hide-details
1717
:track-size="2"
1818
:thumb-size="isThumbHidden ? 0 : 10"
@@ -88,36 +88,65 @@ const isDragging = ref(false);
8888
const curTimeValue = ref(0);
8989
const tempTime = ref(0);
9090
91+
const chapterTime = computed(() => {
92+
return localStorage.getItem("frontend.settings.audiobook_chapter_time") == "true";
93+
});
94+
9195
// computed properties
96+
const curChapter = computed(() => {
97+
if (store.curQueueItem?.media_item?.metadata?.chapters) {
98+
return store.curQueueItem.media_item.metadata.chapters.find((chapter) => {
99+
return chapter.start < store.activePlayerQueue.elapsed_time && chapter.end > store.activePlayerQueue.elapsed_time;
100+
});
101+
}
102+
return null;
103+
});
104+
105+
const playerCurQueueItemDuration = computed(() => {
106+
if (chapterTime.value && store.curQueueItem?.media_item?.media_type == MediaType.AUDIOBOOK) {
107+
return curChapter.value.end - curChapter.value.start;
108+
}
109+
return store.curQueueItem.duration;
110+
});
111+
112+
const curQueueItemTime = computed(() => {
113+
if (isDragging.value) {
114+
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
115+
tempTime.value = curTimeValue.value;
116+
return curTimeValue.value;
117+
}
118+
119+
if (store.activePlayerQueue) {
120+
if (chapterTime.value && store.curQueueItem?.media_item?.media_type == MediaType.AUDIOBOOK) {
121+
return store.activePlayerQueue.elapsed_time - curChapter.value.start;
122+
}
123+
return store.activePlayerQueue.elapsed_time;
124+
}
125+
return 0;
126+
});
127+
92128
const playerCurTimeStr = computed(() => {
93129
if (!store.curQueueItem) return "0:00";
94130
if (showRemainingTime.value) {
95131
return `-${formatDuration(
96-
store.curQueueItem.duration - curQueueItemTime.value,
132+
playerCurQueueItemDuration.value - curQueueItemTime.value,
97133
)}`;
98134
} else {
99135
return `${formatDuration(curQueueItemTime.value)}`;
100136
}
101137
});
138+
102139
const playerTotalTimeStr = computed(() => {
103140
if (!store.curQueueItem) return "";
104141
if (!store.curQueueItem.duration) return "";
105142
if (store.curQueueItem.media_item?.media_type == MediaType.RADIO) return "";
106-
const totalSecs = store.curQueueItem.duration;
143+
const totalSecs = playerCurQueueItemDuration.value;
107144
return formatDuration(totalSecs);
108145
});
109-
const curQueueItemTime = computed(() => {
110-
if (isDragging.value) {
111-
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
112-
tempTime.value = curTimeValue.value;
113-
return curTimeValue.value;
114-
}
115-
if (store.activePlayerQueue) return store.activePlayerQueue.elapsed_time;
116-
return 0;
117-
});
118146
119147
const chapterTicks = computed(() => {
120148
const ticks: Record<number, string> = {};
149+
if (chapterTime.value) return null;
121150
if (store.curQueueItem?.media_item?.metadata?.chapters) {
122151
store.curQueueItem.media_item.metadata.chapters.forEach((chapter) => {
123152
ticks[chapter.start] = chapter.name;
@@ -141,9 +170,13 @@ const startDragging = function () {
141170
const stopDragging = () => {
142171
isDragging.value = false;
143172
if (!isDragging.value && store.activePlayer) {
173+
var seekTime = tempTime.value
174+
console.log(seekTime)
175+
if (chapterTime.value) seekTime = curChapter.value.start + seekTime;
176+
console.log(seekTime)
144177
api.playerCommandSeek(
145178
store.activePlayer.player_id,
146-
Math.round(tempTime.value),
179+
Math.round(seekTime),
147180
);
148181
}
149182
};

src/translations/en.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,10 @@
516516
"enable_builtin_player": {
517517
"label": "Allow playback to this device\/browser",
518518
"description": "Enable the (experimental) built-in player for this device\/browser, which allows you to stream all Music Assistant content directly to this device."
519+
},
520+
"audiobook_chapter_time": {
521+
"label": "Audiobook Chapter Progress",
522+
"description": "Show the progress of the current chapter instead of the full duration when playing audiobooks."
519523
}
520524
},
521525
"show_info": "Show info",

src/views/settings/FrontendConfig.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ onMounted(() => {
143143
localStorage.getItem("frontend.settings.enable_builtin_player") !=
144144
"false",
145145
},
146+
{
147+
key: "audiobook_chapter_time",
148+
type: ConfigEntryType.BOOLEAN,
149+
label: "chapter_time",
150+
default_value: false,
151+
required: false,
152+
multi_value: false,
153+
category: "audiobooks_podcasts",
154+
value: localStorage.getItem("frontend.settings.audiobook_chapter_time") == "true",
155+
},
146156
];
147157
});
148158

0 commit comments

Comments
 (0)