Add support for "Open Current Chapter" button

This commit is contained in:
Faizan Zafar 2024-08-25 01:04:40 -07:00
parent 5308fd8b46
commit 79df705da7
30 changed files with 88 additions and 6 deletions

View file

@ -36,6 +36,7 @@
ref="audioPlayer" ref="audioPlayer"
:chapters="chapters" :chapters="chapters"
:current-chapter="currentChapter" :current-chapter="currentChapter"
:libraryItem="streamLibraryItem"
:paused="!isPlaying" :paused="!isPlaying"
:loading="playerLoading" :loading="playerLoading"
:bookmarks="bookmarks" :bookmarks="bookmarks"

View file

@ -7,7 +7,11 @@
<ui-tooltip direction="top" :text="$strings.LabelVolume"> <ui-tooltip direction="top" :text="$strings.LabelVolume">
<controls-volume-control ref="volumeControl" v-model="volume" @input="setVolume" class="mx-2 hidden sm:block" /> <controls-volume-control ref="volumeControl" v-model="volume" @input="setVolume" class="mx-2 hidden sm:block" />
</ui-tooltip> </ui-tooltip>
<ui-tooltip v-if="hasEbookFile" direction="top" :text="$strings.ButtonOpenCurrentChapter">
<button :aria-label="$strings.ButtonOpenCurrentChapter" class="text-gray-300 hover:text-white mx-1 lg:mx-2" @mousedown.prevent @mouseup.prevent @click.stop="openEbook">
<span class="material-symbols text-2xl">auto_stories</span>
</button>
</ui-tooltip>
<ui-tooltip v-if="!hideSleepTimer" direction="top" :text="$strings.LabelSleepTimer"> <ui-tooltip v-if="!hideSleepTimer" direction="top" :text="$strings.LabelSleepTimer">
<button :aria-label="$strings.LabelSleepTimer" class="text-gray-300 hover:text-white mx-1 lg:mx-2" @mousedown.prevent @mouseup.prevent @click.stop="$emit('showSleepTimer')"> <button :aria-label="$strings.LabelSleepTimer" class="text-gray-300 hover:text-white mx-1 lg:mx-2" @mousedown.prevent @mouseup.prevent @click.stop="$emit('showSleepTimer')">
<span v-if="!sleepTimerSet" class="material-symbols text-2xl">snooze</span> <span v-if="!sleepTimerSet" class="material-symbols text-2xl">snooze</span>
@ -77,6 +81,7 @@ export default {
type: Array, type: Array,
default: () => [] default: () => []
}, },
libraryItem: Object,
sleepTimerSet: Boolean, sleepTimerSet: Boolean,
sleepTimerRemaining: Number, sleepTimerRemaining: Number,
sleepTimerType: String, sleepTimerType: String,
@ -173,6 +178,9 @@ export default {
useChapterTrack() { useChapterTrack() {
const _useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack') || false const _useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack') || false
return this.chapters.length ? _useChapterTrack : false return this.chapters.length ? _useChapterTrack : false
},
hasEbookFile() {
return this.libraryItem.media && this.libraryItem.media.ebookFile
} }
}, },
methods: { methods: {
@ -352,6 +360,9 @@ export default {
else if (action === this.$hotkeys.AudioPlayer.INCREASE_PLAYBACK_RATE) this.increasePlaybackRate() else if (action === this.$hotkeys.AudioPlayer.INCREASE_PLAYBACK_RATE) this.increasePlaybackRate()
else if (action === this.$hotkeys.AudioPlayer.DECREASE_PLAYBACK_RATE) this.decreasePlaybackRate() else if (action === this.$hotkeys.AudioPlayer.DECREASE_PLAYBACK_RATE) this.decreasePlaybackRate()
else if (action === this.$hotkeys.AudioPlayer.CLOSE) this.closePlayer() else if (action === this.$hotkeys.AudioPlayer.CLOSE) this.closePlayer()
},
openEbook() {
this.$store.commit('showEReader', { libraryItem: this.libraryItem, keepProgress: true })
} }
}, },
mounted() { mounted() {

View file

@ -305,7 +305,7 @@ export default {
}) })
} }
}, },
initEpub() { async initEpub() {
/** @type {EpubReader} */ /** @type {EpubReader} */
const reader = this const reader = this
@ -330,8 +330,26 @@ export default {
flow: 'paginated' flow: 'paginated'
}) })
// load saved progress await reader.book.ready
reader.rendition.display(this.savedEbookLocation || reader.book.locations.start) // load saved progress or initial chapter
var initialLocation = this.savedEbookLocation || this.initialChapterHref || reader.book.locations.start
try {
const initialChapterTitle = this.getCurrentAudioChapter()
if (initialChapterTitle) {
const href = this.findChapterHref(initialChapterTitle)
if (href) {
try {
initialLocation = 'text/' + href
} catch (error) {
console.error('Failed to navigate to chapter:', error)
}
}
}
} catch (error) {
return
}
reader.rendition.display(initialLocation)
reader.rendition.on('rendered', () => { reader.rendition.on('rendered', () => {
this.applyTheme() this.applyTheme()
@ -439,13 +457,38 @@ export default {
this.rendition.getContents().forEach((c) => { this.rendition.getContents().forEach((c) => {
c.addStylesheetRules(this.themeRules) c.addStylesheetRules(this.themeRules)
}) })
},
getCurrentAudioChapter() {
try {
var currentTime = this.$store.getters['user/getUserMediaProgress'](this.libraryItemId).currentTime
var audioBookChapters = this.$store.state.streamLibraryItem.media.chapters
} catch (error) {
return null
}
if (!audioBookChapters) return null
const chapter = audioBookChapters.find((chapter) => chapter.start <= currentTime && currentTime < chapter.end)
return chapter.title || audioBookChapters[audioBookChapters.length - 1].title
},
findChapterHref(title) {
const findInToc = (items) => {
for (let item of items) {
if (item.label.trim() === title) return item.href
if (item.subitems) {
const result = findInToc(item.subitems)
if (result) return result
}
}
return null
}
return findInToc(this.rendition.book.navigation.toc)
} }
}, },
mounted() { async mounted() {
this.windowWidth = window.innerWidth this.windowWidth = window.innerWidth
this.windowHeight = window.innerHeight this.windowHeight = window.innerHeight
window.addEventListener('resize', this.resize) window.addEventListener('resize', this.resize)
this.initEpub()
await this.initEpub()
}, },
beforeDestroy() { beforeDestroy() {
window.removeEventListener('resize', this.resize) window.removeEventListener('resize', this.resize)

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Следваща Глава", "ButtonNextChapter": "Следваща Глава",
"ButtonOk": "Добре", "ButtonOk": "Добре",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Отвори Feed", "ButtonOpenFeed": "Отвори Feed",
"ButtonOpenManager": "Отвори Мениджър", "ButtonOpenManager": "Отвори Мениджър",
"ButtonPause": "Пауза", "ButtonPause": "Пауза",

View file

@ -47,6 +47,7 @@
"ButtonNext": "পরবর্তী", "ButtonNext": "পরবর্তী",
"ButtonNextChapter": "পরবর্তী অধ্যায়", "ButtonNextChapter": "পরবর্তী অধ্যায়",
"ButtonOk": "ঠিক আছে", "ButtonOk": "ঠিক আছে",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "ফিড খুলুন", "ButtonOpenFeed": "ফিড খুলুন",
"ButtonOpenManager": "ম্যানেজার খুলুন", "ButtonOpenManager": "ম্যানেজার খুলুন",
"ButtonPause": "বিরতি", "ButtonPause": "বিরতি",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Další Kapitola", "ButtonNextChapter": "Další Kapitola",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Otevřít kanál", "ButtonOpenFeed": "Otevřít kanál",
"ButtonOpenManager": "Otevřít správce", "ButtonOpenManager": "Otevřít správce",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonOk": "OK", "ButtonOk": "OK",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Åbn feed", "ButtonOpenFeed": "Åbn feed",
"ButtonOpenManager": "Åbn manager", "ButtonOpenManager": "Åbn manager",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Vor", "ButtonNext": "Vor",
"ButtonNextChapter": "Nächstes Kapitel", "ButtonNextChapter": "Nächstes Kapitel",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Feed öffnen", "ButtonOpenFeed": "Feed öffnen",
"ButtonOpenManager": "Manager öffnen", "ButtonOpenManager": "Manager öffnen",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -48,6 +48,7 @@
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonNextItemInQueue": "Next Item in Queue", "ButtonNextItemInQueue": "Next Item in Queue",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Open Feed", "ButtonOpenFeed": "Open Feed",
"ButtonOpenManager": "Open Manager", "ButtonOpenManager": "Open Manager",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Siguiente Capítulo", "ButtonNextChapter": "Siguiente Capítulo",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Abrir fuente", "ButtonOpenFeed": "Abrir fuente",
"ButtonOpenManager": "Abrir Editor", "ButtonOpenManager": "Abrir Editor",
"ButtonPause": "Pausar", "ButtonPause": "Pausar",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Järgmine peatükk", "ButtonNextChapter": "Järgmine peatükk",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Ava voog", "ButtonOpenFeed": "Ava voog",
"ButtonOpenManager": "Ava haldur", "ButtonOpenManager": "Ava haldur",
"ButtonPause": "Peata", "ButtonPause": "Peata",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Seuraava", "ButtonNext": "Seuraava",
"ButtonNextChapter": "Seuraava luku", "ButtonNextChapter": "Seuraava luku",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Avaa syöte", "ButtonOpenFeed": "Avaa syöte",
"ButtonOpenManager": "Avaa hallinta", "ButtonOpenManager": "Avaa hallinta",
"ButtonPause": "Pysäytä", "ButtonPause": "Pysäytä",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Suivant", "ButtonNext": "Suivant",
"ButtonNextChapter": "Chapitre suivant", "ButtonNextChapter": "Chapitre suivant",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Ouvrir le flux", "ButtonOpenFeed": "Ouvrir le flux",
"ButtonOpenManager": "Ouvrir le gestionnaire", "ButtonOpenManager": "Ouvrir le gestionnaire",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonOk": "ઓકે", "ButtonOk": "ઓકે",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "ફીડ ખોલો", "ButtonOpenFeed": "ફીડ ખોલો",
"ButtonOpenManager": "મેનેજર ખોલો", "ButtonOpenManager": "મેનેજર ખોલો",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "הבא", "ButtonNext": "הבא",
"ButtonNextChapter": "פרק הבא", "ButtonNextChapter": "פרק הבא",
"ButtonOk": "אישור", "ButtonOk": "אישור",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "פתח פיד", "ButtonOpenFeed": "פתח פיד",
"ButtonOpenManager": "פתח מנהל", "ButtonOpenManager": "פתח מנהל",
"ButtonPause": "השהה", "ButtonPause": "השהה",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonOk": "ठीक है", "ButtonOk": "ठीक है",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "फ़ीड खोलें", "ButtonOpenFeed": "फ़ीड खोलें",
"ButtonOpenManager": "मैनेजर खोलें", "ButtonOpenManager": "मैनेजर खोलें",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Otvori feed", "ButtonOpenFeed": "Otvori feed",
"ButtonOpenManager": "Otvori menadžera", "ButtonOpenManager": "Otvori menadžera",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Következő fejezet", "ButtonNextChapter": "Következő fejezet",
"ButtonOk": "Oké", "ButtonOk": "Oké",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Hírcsatorna megnyitása", "ButtonOpenFeed": "Hírcsatorna megnyitása",
"ButtonOpenManager": "Kezelő megnyitása", "ButtonOpenManager": "Kezelő megnyitása",
"ButtonPause": "Szünet", "ButtonPause": "Szünet",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Prossimo", "ButtonNext": "Prossimo",
"ButtonNextChapter": "Prossimo Capitolo", "ButtonNextChapter": "Prossimo Capitolo",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Apri il flusso", "ButtonOpenFeed": "Apri il flusso",
"ButtonOpenManager": "Apri Manager", "ButtonOpenManager": "Apri Manager",
"ButtonPause": "Pausa", "ButtonPause": "Pausa",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Kitas Skyrius", "ButtonNextChapter": "Kitas Skyrius",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Atidaryti srautą", "ButtonOpenFeed": "Atidaryti srautą",
"ButtonOpenManager": "Atidaryti tvarkyklę", "ButtonOpenManager": "Atidaryti tvarkyklę",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Volgende", "ButtonNext": "Volgende",
"ButtonNextChapter": "Volgend hoofdstuk", "ButtonNextChapter": "Volgend hoofdstuk",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Feed openen", "ButtonOpenFeed": "Feed openen",
"ButtonOpenManager": "Manager openen", "ButtonOpenManager": "Manager openen",
"ButtonPause": "Pauze", "ButtonPause": "Pauze",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Neste Kapittel", "ButtonNextChapter": "Neste Kapittel",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Åpne Feed", "ButtonOpenFeed": "Åpne Feed",
"ButtonOpenManager": "Åpne behandler", "ButtonOpenManager": "Åpne behandler",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Następny", "ButtonNext": "Następny",
"ButtonNextChapter": "Następny rozdział", "ButtonNextChapter": "Następny rozdział",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Otwórz feed", "ButtonOpenFeed": "Otwórz feed",
"ButtonOpenManager": "Otwórz menadżera", "ButtonOpenManager": "Otwórz menadżera",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Próximo", "ButtonNext": "Próximo",
"ButtonNextChapter": "Próximo Capítulo", "ButtonNextChapter": "Próximo Capítulo",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Abrir Feed", "ButtonOpenFeed": "Abrir Feed",
"ButtonOpenManager": "Abrir Gerenciador", "ButtonOpenManager": "Abrir Gerenciador",
"ButtonPause": "Pausar", "ButtonPause": "Pausar",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Следующая глава", "ButtonNextChapter": "Следующая глава",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Открыть канал", "ButtonOpenFeed": "Открыть канал",
"ButtonOpenManager": "Открыть менеджер", "ButtonOpenManager": "Открыть менеджер",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Next", "ButtonNext": "Next",
"ButtonNextChapter": "Next Chapter", "ButtonNextChapter": "Next Chapter",
"ButtonOk": "Okej", "ButtonOk": "Okej",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Öppna flöde", "ButtonOpenFeed": "Öppna flöde",
"ButtonOpenManager": "Öppna Manager", "ButtonOpenManager": "Öppna Manager",
"ButtonPause": "Pause", "ButtonPause": "Pause",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Наступний", "ButtonNext": "Наступний",
"ButtonNextChapter": "Наступна глава", "ButtonNextChapter": "Наступна глава",
"ButtonOk": "Гаразд", "ButtonOk": "Гаразд",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Відкрити стрічку", "ButtonOpenFeed": "Відкрити стрічку",
"ButtonOpenManager": "Відкрити менеджер", "ButtonOpenManager": "Відкрити менеджер",
"ButtonPause": "Пауза", "ButtonPause": "Пауза",

View file

@ -47,6 +47,7 @@
"ButtonNext": "Tiếp Theo", "ButtonNext": "Tiếp Theo",
"ButtonNextChapter": "Chương Tiếp Theo", "ButtonNextChapter": "Chương Tiếp Theo",
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "Mở Feed", "ButtonOpenFeed": "Mở Feed",
"ButtonOpenManager": "Mở Quản Lý", "ButtonOpenManager": "Mở Quản Lý",
"ButtonPause": "Tạm Dừng", "ButtonPause": "Tạm Dừng",

View file

@ -47,6 +47,7 @@
"ButtonNext": "下一个", "ButtonNext": "下一个",
"ButtonNextChapter": "下一章节", "ButtonNextChapter": "下一章节",
"ButtonOk": "确定", "ButtonOk": "确定",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "打开源", "ButtonOpenFeed": "打开源",
"ButtonOpenManager": "打开管理器", "ButtonOpenManager": "打开管理器",
"ButtonPause": "暂停", "ButtonPause": "暂停",

View file

@ -47,6 +47,7 @@
"ButtonNext": "下個", "ButtonNext": "下個",
"ButtonNextChapter": "下個章節", "ButtonNextChapter": "下個章節",
"ButtonOk": "確定", "ButtonOk": "確定",
"ButtonOpenCurrentChapter": "Open Current Chapter",
"ButtonOpenFeed": "打開源", "ButtonOpenFeed": "打開源",
"ButtonOpenManager": "打開管理器", "ButtonOpenManager": "打開管理器",
"ButtonPause": "暫停", "ButtonPause": "暫停",