advplyr.audiobookshelf-app/pages/bookshelf/latest.vue

109 lines
3.6 KiB
Vue
Raw Normal View History

<template>
2022-12-03 17:24:24 -06:00
<div class="w-full p-4">
<h1 class="text-xl mb-2 font-semibold">{{ $strings.HeaderLatestEpisodes }}</h1>
2022-12-03 17:24:24 -06:00
<template v-for="episode in recentEpisodes">
<tables-podcast-latest-episode-row :episode="episode" :local-episode="localEpisodeMap[episode.id]" :library-item-id="episode.libraryItemId" :local-library-item-id="null" :is-local="isLocal" :key="episode.id" @addToPlaylist="addEpisodeToPlaylist" />
2022-12-03 17:24:24 -06:00
</template>
</div>
</template>
<script>
export default {
data() {
2022-12-03 17:24:24 -06:00
return {
processing: false,
recentEpisodes: [],
totalEpisodes: 0,
currentPage: 0,
localLibraryItems: [],
isLocal: false,
loadedLibraryId: null
2022-12-03 17:24:24 -06:00
}
},
watch: {},
2022-12-03 17:24:24 -06:00
computed: {
currentLibraryId() {
return this.$store.state.libraries.currentLibraryId
},
localEpisodes() {
const episodes = []
this.localLibraryItems.forEach((li) => {
if (li.media.episodes?.length) {
episodes.push(...li.media.episodes)
}
})
return episodes
},
localEpisodeMap() {
var epmap = {}
this.localEpisodes.forEach((localEp) => {
if (localEp.serverEpisodeId) {
epmap[localEp.serverEpisodeId] = localEp
}
})
return epmap
2022-12-03 17:24:24 -06:00
}
},
methods: {
async addEpisodeToPlaylist(episode) {
const libraryItem = await this.$nativeHttp.get(`/api/items/${episode.libraryItemId}`).catch((error) => {
2022-12-03 17:24:24 -06:00
console.error('Failed to get library item', error)
this.$toast.error('Failed to get library item')
return null
})
if (!libraryItem) return
this.$store.commit('globals/setSelectedPlaylistItems', [{ libraryItem, episode }])
this.$store.commit('globals/setShowPlaylistsAddCreateModal', true)
},
async loadRecentEpisodes(page = 0) {
this.loadedLibraryId = this.currentLibraryId
2022-12-03 17:24:24 -06:00
this.processing = true
const episodePayload = await this.$nativeHttp.get(`/api/libraries/${this.currentLibraryId}/recent-episodes?limit=25&page=${page}`).catch((error) => {
2022-12-03 17:24:24 -06:00
console.error('Failed to get recent episodes', error)
this.$toast.error('Failed to get recent episodes')
return null
})
this.processing = false
console.log('Episodes', episodePayload)
this.recentEpisodes = episodePayload.episodes || []
this.totalEpisodes = episodePayload.total
this.currentPage = page
},
libraryChanged(libraryId) {
if (libraryId !== this.loadedLibraryId) {
if (this.$store.getters['libraries/getCurrentLibraryMediaType'] === 'podcast') {
this.loadRecentEpisodes()
} else {
this.$router.replace('/bookshelf')
}
}
},
async loadLocalPodcastLibraryItems() {
this.localLibraryItems = await this.$db.getLocalLibraryItems('podcast')
},
newLocalLibraryItem(item) {
if (item.mediaType !== 'podcast') {
return
}
const matchingLocalLibraryItem = this.localLibraryItems.find((lli) => lli.id === item.id)
if (matchingLocalLibraryItem) {
matchingLocalLibraryItem.media.episodes = item.media.episodes
} else {
this.localLibraryItems.push(item)
}
2022-12-03 17:24:24 -06:00
}
},
mounted() {
this.loadRecentEpisodes()
this.loadLocalPodcastLibraryItems()
this.$eventBus.$on('library-changed', this.libraryChanged)
this.$eventBus.$on('new-local-library-item', this.newLocalLibraryItem)
},
beforeDestroy() {
this.$eventBus.$off('library-changed', this.libraryChanged)
this.$eventBus.$off('new-local-library-item', this.newLocalLibraryItem)
2022-12-03 17:24:24 -06:00
}
}
</script>