diff --git a/android/app/build.gradle b/android/app/build.gradle index 248f12ae..1a127e20 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.audiobookshelf.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 16 - versionName "0.9.1-beta" + versionCode 17 + versionName "0.9.2-beta" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/components/app/StreamContainer.vue b/components/app/StreamContainer.vue index 5c8947ba..b768f753 100644 --- a/components/app/StreamContainer.vue +++ b/components/app/StreamContainer.vue @@ -18,7 +18,7 @@ - + @@ -34,7 +34,8 @@ export default { lastProgressTimeUpdate: 0, showPlaybackSpeedModal: false, playbackSpeed: 1, - showChapterModal: false + showChapterModal: false, + currentTime: 0 } }, watch: { @@ -46,6 +47,10 @@ export default { } }, computed: { + currentChapter() { + if (!this.audiobook || !this.chapters.length) return null + return this.chapters.find((ch) => ch.start <= this.currentTime && ch.end > this.currentTime) + }, socketConnected() { return this.$store.state.socketConnected }, @@ -124,6 +129,8 @@ export default { this.showChapterModal = false }, async cancelStream() { + this.currentTime = 0 + if (this.download) { if (this.$refs.audioPlayerMini) { this.$refs.audioPlayerMini.terminateStream() @@ -147,6 +154,8 @@ export default { } }, updateTime(currentTime) { + this.currentTime = currentTime + var diff = currentTime - this.lastProgressTimeUpdate if (diff > 4 || diff < 0) { @@ -231,6 +240,7 @@ export default { var currentTime = await this.getDownloadStartTime() if (isNaN(currentTime) || currentTime === null) currentTime = 0 + this.currentTime = currentTime // Update local current time this.$localStore.setCurrent({ @@ -276,6 +286,7 @@ export default { var playlistUrl = stream.clientPlaylistUri var currentTime = stream.clientCurrentTime || 0 + this.currentTime = currentTime var playOnLoad = this.$store.state.playOnLoad if (playOnLoad) this.$store.commit('setPlayOnLoad', false) diff --git a/components/modals/ChaptersModal.vue b/components/modals/ChaptersModal.vue index 76790483..aec59afa 100644 --- a/components/modals/ChaptersModal.vue +++ b/components/modals/ChaptersModal.vue @@ -1,10 +1,16 @@ + + + Current: {{ currentChapterTitle }} + + + - + {{ chapter.title }} @@ -25,6 +31,10 @@ export default { chapters: { type: Array, default: () => [] + }, + currentChapter: { + type: Object, + default: () => null } }, data() { @@ -38,6 +48,12 @@ export default { set(val) { this.$emit('input', val) } + }, + currentChapterId() { + return this.currentChapter ? this.currentChapter.id : null + }, + currentChapterTitle() { + return this.currentChapter ? this.currentChapter.title : null } }, methods: { diff --git a/components/modals/FilterModal.vue b/components/modals/FilterModal.vue index da2b2a15..3049bc07 100644 --- a/components/modals/FilterModal.vue +++ b/components/modals/FilterModal.vue @@ -80,6 +80,11 @@ export default { text: 'Authors', value: 'authors', sublist: true + }, + { + text: 'Progress', + value: 'progress', + sublist: true } ] } @@ -124,6 +129,9 @@ export default { authors() { return this.$store.getters['audiobooks/getUniqueAuthors'] }, + progress() { + return ['Read', 'Unread', 'In Progress'] + }, sublistItems() { return (this[this.sublist] || []).map((item) => { return { diff --git a/package.json b/package.json index a43f134d..9fb1862c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-app", - "version": "v0.9.1-beta", + "version": "v0.9.2-beta", "author": "advplyr", "scripts": { "dev": "nuxt --hostname localhost --port 1337", diff --git a/pages/index.vue b/pages/index.vue index 6774366f..0fbecc7c 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -6,7 +6,10 @@ {{ numAudiobooks }} Audiobooks - filter_alt + + filter_alt + + sort @@ -29,6 +32,9 @@ export default { } }, computed: { + hasFilters() { + return this.$store.getters['user/getUserSetting']('filterBy') !== 'all' + }, numAudiobooks() { return this.$store.getters['audiobooks/getFiltered']().length } diff --git a/store/audiobooks.js b/store/audiobooks.js index f57acd54..751ee4f0 100644 --- a/store/audiobooks.js +++ b/store/audiobooks.js @@ -17,15 +17,11 @@ export const getters = { return state.audiobooks.find(ab => ab.id === id) }, getFiltered: (state, getters, rootState, rootGetters) => () => { - // var isDisc = !rootState.networkConnected || !rootState.socketConnected - // console.log('GET FILETERED', isDisc) - // var filtered = isDisc ? rootGetters['downloads/getAudiobooks'] : state.audiobooks - // console.log('FILTERED LEN', filtered.length) var filtered = state.audiobooks var settings = rootState.user.settings || {} var filterBy = settings.filterBy || '' - var searchGroups = ['genres', 'tags', 'series', 'authors'] + var searchGroups = ['genres', 'tags', 'series', 'authors', 'progress'] var group = searchGroups.find(_group => filterBy.startsWith(_group + '.')) if (group) { var filter = decode(filterBy.replace(`${group}.`, '')) @@ -33,6 +29,16 @@ export const getters = { else if (group === 'tags') filtered = filtered.filter(ab => ab.tags.includes(filter)) else if (group === 'series') filtered = filtered.filter(ab => ab.book && ab.book.series === filter) else if (group === 'authors') filtered = filtered.filter(ab => ab.book && ab.book.author === filter) + else if (group === 'progress') { + filtered = filtered.filter(ab => { + var userAudiobook = rootGetters['user/getUserAudiobook'](ab.id) + var isRead = userAudiobook && userAudiobook.isRead + if (filter === 'Read' && isRead) return true + if (filter === 'Unread' && !isRead) return true + if (filter === 'In Progress' && (userAudiobook && !userAudiobook.isRead && userAudiobook.progress > 0)) return true + return false + }) + } } return filtered },
Current: {{ currentChapterTitle }}
{{ numAudiobooks }} Audiobooks