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"
:chapters="chapters"
:current-chapter="currentChapter"
:libraryItem="streamLibraryItem"
:paused="!isPlaying"
:loading="playerLoading"
:bookmarks="bookmarks"

View file

@ -7,7 +7,11 @@
<ui-tooltip direction="top" :text="$strings.LabelVolume">
<controls-volume-control ref="volumeControl" v-model="volume" @input="setVolume" class="mx-2 hidden sm:block" />
</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">
<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>
@ -77,6 +81,7 @@ export default {
type: Array,
default: () => []
},
libraryItem: Object,
sleepTimerSet: Boolean,
sleepTimerRemaining: Number,
sleepTimerType: String,
@ -173,6 +178,9 @@ export default {
useChapterTrack() {
const _useChapterTrack = this.$store.getters['user/getUserSetting']('useChapterTrack') || false
return this.chapters.length ? _useChapterTrack : false
},
hasEbookFile() {
return this.libraryItem.media && this.libraryItem.media.ebookFile
}
},
methods: {
@ -352,6 +360,9 @@ export default {
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.CLOSE) this.closePlayer()
},
openEbook() {
this.$store.commit('showEReader', { libraryItem: this.libraryItem, keepProgress: true })
}
},
mounted() {

View file

@ -305,7 +305,7 @@ export default {
})
}
},
initEpub() {
async initEpub() {
/** @type {EpubReader} */
const reader = this
@ -330,8 +330,26 @@ export default {
flow: 'paginated'
})
// load saved progress
reader.rendition.display(this.savedEbookLocation || reader.book.locations.start)
await reader.book.ready
// 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', () => {
this.applyTheme()
@ -439,13 +457,38 @@ export default {
this.rendition.getContents().forEach((c) => {
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.windowHeight = window.innerHeight
window.addEventListener('resize', this.resize)
this.initEpub()
await this.initEpub()
},
beforeDestroy() {
window.removeEventListener('resize', this.resize)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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