mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-09 19:01:41 +00:00
Add support for "Open Current Chapter" button
This commit is contained in:
parent
5308fd8b46
commit
79df705da7
30 changed files with 88 additions and 6 deletions
|
|
@ -36,6 +36,7 @@
|
|||
ref="audioPlayer"
|
||||
:chapters="chapters"
|
||||
:current-chapter="currentChapter"
|
||||
:libraryItem="streamLibraryItem"
|
||||
:paused="!isPlaying"
|
||||
:loading="playerLoading"
|
||||
:bookmarks="bookmarks"
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Следваща Глава",
|
||||
"ButtonOk": "Добре",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Отвори Feed",
|
||||
"ButtonOpenManager": "Отвори Мениджър",
|
||||
"ButtonPause": "Пауза",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "পরবর্তী",
|
||||
"ButtonNextChapter": "পরবর্তী অধ্যায়",
|
||||
"ButtonOk": "ঠিক আছে",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "ফিড খুলুন",
|
||||
"ButtonOpenManager": "ম্যানেজার খুলুন",
|
||||
"ButtonPause": "বিরতি",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Next Chapter",
|
||||
"ButtonOk": "OK",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Åbn feed",
|
||||
"ButtonOpenManager": "Åbn manager",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Vor",
|
||||
"ButtonNextChapter": "Nächstes Kapitel",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Feed öffnen",
|
||||
"ButtonOpenManager": "Manager öffnen",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Siguiente Capítulo",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Abrir fuente",
|
||||
"ButtonOpenManager": "Abrir Editor",
|
||||
"ButtonPause": "Pausar",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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ä",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Next Chapter",
|
||||
"ButtonOk": "ઓકે",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "ફીડ ખોલો",
|
||||
"ButtonOpenManager": "મેનેજર ખોલો",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "הבא",
|
||||
"ButtonNextChapter": "פרק הבא",
|
||||
"ButtonOk": "אישור",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "פתח פיד",
|
||||
"ButtonOpenManager": "פתח מנהל",
|
||||
"ButtonPause": "השהה",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Next Chapter",
|
||||
"ButtonOk": "ठीक है",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "फ़ीड खोलें",
|
||||
"ButtonOpenManager": "मैनेजर खोलें",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Next Chapter",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Otvori feed",
|
||||
"ButtonOpenManager": "Otvori menadžera",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Prossimo",
|
||||
"ButtonNextChapter": "Prossimo Capitolo",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Apri il flusso",
|
||||
"ButtonOpenManager": "Apri Manager",
|
||||
"ButtonPause": "Pausa",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Kitas Skyrius",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Atidaryti srautą",
|
||||
"ButtonOpenManager": "Atidaryti tvarkyklę",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Volgende",
|
||||
"ButtonNextChapter": "Volgend hoofdstuk",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Feed openen",
|
||||
"ButtonOpenManager": "Manager openen",
|
||||
"ButtonPause": "Pauze",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Neste Kapittel",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Åpne Feed",
|
||||
"ButtonOpenManager": "Åpne behandler",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Следующая глава",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Открыть канал",
|
||||
"ButtonOpenManager": "Открыть менеджер",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Next",
|
||||
"ButtonNextChapter": "Next Chapter",
|
||||
"ButtonOk": "Okej",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Öppna flöde",
|
||||
"ButtonOpenManager": "Öppna Manager",
|
||||
"ButtonPause": "Pause",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "Наступний",
|
||||
"ButtonNextChapter": "Наступна глава",
|
||||
"ButtonOk": "Гаразд",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "Відкрити стрічку",
|
||||
"ButtonOpenManager": "Відкрити менеджер",
|
||||
"ButtonPause": "Пауза",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "下一个",
|
||||
"ButtonNextChapter": "下一章节",
|
||||
"ButtonOk": "确定",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "打开源",
|
||||
"ButtonOpenManager": "打开管理器",
|
||||
"ButtonPause": "暂停",
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
"ButtonNext": "下個",
|
||||
"ButtonNextChapter": "下個章節",
|
||||
"ButtonOk": "確定",
|
||||
"ButtonOpenCurrentChapter": "Open Current Chapter",
|
||||
"ButtonOpenFeed": "打開源",
|
||||
"ButtonOpenManager": "打開管理器",
|
||||
"ButtonPause": "暫停",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue