mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-07-22 19:54:45 +02:00
Add:Podcast item page play button to play next unfinished episode #139
This commit is contained in:
parent
a5f483f518
commit
95e070a897
3 changed files with 69 additions and 14 deletions
|
@ -32,7 +32,8 @@ export default {
|
||||||
onMediaPlayerChangedListener: null,
|
onMediaPlayerChangedListener: null,
|
||||||
sleepInterval: null,
|
sleepInterval: null,
|
||||||
currentEndOfChapterTime: 0,
|
currentEndOfChapterTime: 0,
|
||||||
serverLibraryItemId: null
|
serverLibraryItemId: null,
|
||||||
|
serverEpisodeId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -173,15 +174,15 @@ export default {
|
||||||
this.$toast.error(`Cannot cast locally downloaded media`)
|
this.$toast.error(`Cannot cast locally downloaded media`)
|
||||||
} else {
|
} else {
|
||||||
// Change to server library item
|
// Change to server library item
|
||||||
this.playServerLibraryItemAndCast(this.serverLibraryItemId)
|
this.playServerLibraryItemAndCast(this.serverLibraryItemId, this.serverEpisodeId)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
playServerLibraryItemAndCast(libraryItemId) {
|
playServerLibraryItemAndCast(libraryItemId, episodeId) {
|
||||||
var playbackRate = 1
|
var playbackRate = 1
|
||||||
if (this.$refs.audioPlayer) {
|
if (this.$refs.audioPlayer) {
|
||||||
playbackRate = this.$refs.audioPlayer.currentPlaybackRate || 1
|
playbackRate = this.$refs.audioPlayer.currentPlaybackRate || 1
|
||||||
}
|
}
|
||||||
AbsAudioPlayer.prepareLibraryItem({ libraryItemId, episodeId: null, playWhenReady: false, playbackRate })
|
AbsAudioPlayer.prepareLibraryItem({ libraryItemId, episodeId, playWhenReady: false, playbackRate })
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
if (data.error) {
|
if (data.error) {
|
||||||
const errorMsg = data.error || 'Failed to play'
|
const errorMsg = data.error || 'Failed to play'
|
||||||
|
@ -203,6 +204,7 @@ export default {
|
||||||
// When playing local library item and can also play this item from the server
|
// When playing local library item and can also play this item from the server
|
||||||
// then store the server library item id so it can be used if a cast is made
|
// then store the server library item id so it can be used if a cast is made
|
||||||
var serverLibraryItemId = payload.serverLibraryItemId || null
|
var serverLibraryItemId = payload.serverLibraryItemId || null
|
||||||
|
var serverEpisodeId = payload.serverEpisodeId || null
|
||||||
|
|
||||||
if (libraryItemId.startsWith('local') && this.$store.state.isCasting) {
|
if (libraryItemId.startsWith('local') && this.$store.state.isCasting) {
|
||||||
const { value } = await Dialog.confirm({
|
const { value } = await Dialog.confirm({
|
||||||
|
@ -215,6 +217,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.serverLibraryItemId = null
|
this.serverLibraryItemId = null
|
||||||
|
this.serverEpisodeId = null
|
||||||
|
|
||||||
var playbackRate = 1
|
var playbackRate = 1
|
||||||
if (this.$refs.audioPlayer) {
|
if (this.$refs.audioPlayer) {
|
||||||
|
@ -234,6 +237,11 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
this.serverLibraryItemId = serverLibraryItemId
|
this.serverLibraryItemId = serverLibraryItemId
|
||||||
}
|
}
|
||||||
|
if (episodeId && !episodeId.startsWith('local')) {
|
||||||
|
this.serverEpisodeId = episodeId
|
||||||
|
} else {
|
||||||
|
this.serverEpisodeId = serverEpisodeId
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|
|
@ -199,7 +199,9 @@ export default {
|
||||||
|
|
||||||
this.$eventBus.$emit('play-item', {
|
this.$eventBus.$emit('play-item', {
|
||||||
libraryItemId: this.localLibraryItemId,
|
libraryItemId: this.localLibraryItemId,
|
||||||
episodeId: this.localEpisode.id
|
episodeId: this.localEpisode.id,
|
||||||
|
serverLibraryItemId: this.libraryItemId,
|
||||||
|
serverEpisodeId: this.episode.id
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
this.$eventBus.$emit('play-item', {
|
this.$eventBus.$emit('play-item', {
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
<div v-else-if="(user && (showPlay || showRead)) || hasLocal" class="flex mt-4">
|
<div v-else-if="(user && (showPlay || showRead)) || hasLocal" class="flex mt-4">
|
||||||
<ui-btn v-if="showPlay" color="success" :disabled="isPlaying" class="flex items-center justify-center flex-grow mr-2" :padding-x="4" @click="playClick">
|
<ui-btn v-if="showPlay" color="success" :disabled="isPlaying" class="flex items-center justify-center flex-grow mr-2" :padding-x="4" @click="playClick">
|
||||||
<span v-show="!isPlaying" class="material-icons">play_arrow</span>
|
<span v-show="!isPlaying" class="material-icons">play_arrow</span>
|
||||||
<span class="px-1 text-sm">{{ isPlaying ? (isStreaming ? 'Streaming' : 'Playing') : hasLocal ? 'Play' : 'Stream' }}</span>
|
<span class="px-1 text-sm">{{ isPlaying ? (isStreaming ? 'Streaming' : 'Playing') : isPodcast ? 'Next Episode' : hasLocal ? 'Play' : 'Stream' }}</span>
|
||||||
</ui-btn>
|
</ui-btn>
|
||||||
<ui-btn v-if="showRead && user" color="info" class="flex items-center justify-center mr-2" :class="showPlay ? '' : 'flex-grow'" :padding-x="2" @click="readBook">
|
<ui-btn v-if="showRead && user" color="info" class="flex items-center justify-center mr-2" :class="showPlay ? '' : 'flex-grow'" :padding-x="2" @click="readBook">
|
||||||
<span class="material-icons">auto_stories</span>
|
<span class="material-icons">auto_stories</span>
|
||||||
|
@ -305,13 +305,14 @@ export default {
|
||||||
return this.libraryItem.isIncomplete
|
return this.libraryItem.isIncomplete
|
||||||
},
|
},
|
||||||
showPlay() {
|
showPlay() {
|
||||||
return !this.isMissing && !this.isIncomplete && this.numTracks
|
return !this.isMissing && !this.isIncomplete && (this.numTracks || this.episodes.length)
|
||||||
},
|
},
|
||||||
showRead() {
|
showRead() {
|
||||||
return this.ebookFile && this.ebookFormat !== 'pdf'
|
return this.ebookFile && this.ebookFormat !== 'pdf'
|
||||||
},
|
},
|
||||||
showDownload() {
|
showDownload() {
|
||||||
if (this.isIos) return false
|
if (this.isIos) return false
|
||||||
|
if (this.isPodcast) return false
|
||||||
return this.user && this.userCanDownload && this.showPlay && !this.hasLocal
|
return this.user && this.userCanDownload && this.showPlay && !this.hasLocal
|
||||||
},
|
},
|
||||||
ebookFile() {
|
ebookFile() {
|
||||||
|
@ -368,14 +369,58 @@ export default {
|
||||||
this.$store.commit('openReader', this.libraryItem)
|
this.$store.commit('openReader', this.libraryItem)
|
||||||
},
|
},
|
||||||
playClick() {
|
playClick() {
|
||||||
// Todo: Allow playing local or streaming
|
var episodeId = null
|
||||||
if (this.hasLocal && this.serverLibraryItemId && this.isCasting) {
|
|
||||||
// If casting and connected to server for local library item then send server library item id
|
if (this.isPodcast) {
|
||||||
this.$eventBus.$emit('play-item', { libraryItemId: this.serverLibraryItemId })
|
this.episodes.sort((a, b) => {
|
||||||
return
|
return String(b.publishedAt).localeCompare(String(a.publishedAt), undefined, { numeric: true, sensitivity: 'base' })
|
||||||
|
})
|
||||||
|
|
||||||
|
var episode = this.episodes.find((ep) => {
|
||||||
|
var podcastProgress = null
|
||||||
|
if (!this.isLocal) {
|
||||||
|
podcastProgress = this.$store.getters['user/getUserMediaProgress'](this.libraryItemId, ep.id)
|
||||||
|
} else {
|
||||||
|
podcastProgress = this.$store.getters['globals/getLocalMediaProgressById'](this.libraryItemId, ep.id)
|
||||||
|
}
|
||||||
|
return !podcastProgress || !podcastProgress.isFinished
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!episode) episode = this.episodes[0]
|
||||||
|
|
||||||
|
episodeId = episode.id
|
||||||
|
|
||||||
|
var localEpisode = null
|
||||||
|
if (this.hasLocal && !this.isLocal) {
|
||||||
|
localEpisode = this.localLibraryItem.media.episodes.find((ep) => ep.serverEpisodeId == episodeId)
|
||||||
|
} else if (this.isLocal) {
|
||||||
|
localEpisode = episode
|
||||||
|
}
|
||||||
|
var serverEpisodeId = !this.isLocal ? episodeId : localEpisode ? localEpisode.serverEpisodeId : null
|
||||||
|
|
||||||
|
if (serverEpisodeId && this.serverLibraryItemId && this.isCasting) {
|
||||||
|
// If casting and connected to server for local library item then send server library item id
|
||||||
|
this.$eventBus.$emit('play-item', { libraryItemId: this.serverLibraryItemId, episodeId: serverEpisodeId })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (localEpisode) {
|
||||||
|
this.$eventBus.$emit('play-item', { libraryItemId: this.localLibraryItem.id, episodeId: localEpisode.id, serverLibraryItemId: this.serverLibraryItemId, serverEpisodeId })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Audiobook
|
||||||
|
if (this.hasLocal && this.serverLibraryItemId && this.isCasting) {
|
||||||
|
// If casting and connected to server for local library item then send server library item id
|
||||||
|
this.$eventBus.$emit('play-item', { libraryItemId: this.serverLibraryItemId })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.hasLocal) {
|
||||||
|
this.$eventBus.$emit('play-item', { libraryItemId: this.localLibraryItem.id, serverLibraryItemId: this.serverLibraryItemId })
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.hasLocal) return this.$eventBus.$emit('play-item', { libraryItemId: this.localLibraryItem.id, serverLibraryItemId: this.serverLibraryItemId })
|
|
||||||
this.$eventBus.$emit('play-item', { libraryItemId: this.libraryItemId })
|
this.$eventBus.$emit('play-item', { libraryItemId: this.libraryItemId, episodeId })
|
||||||
},
|
},
|
||||||
async clearProgressClick() {
|
async clearProgressClick() {
|
||||||
const { value } = await Dialog.confirm({
|
const { value } = await Dialog.confirm({
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue