mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-08-04 10:14:36 +02:00
Add collapse series, add filter by series include sequence and sort, show number of episodes on podcast card
This commit is contained in:
parent
2a386ca2a9
commit
174dac8fd4
7 changed files with 80 additions and 15 deletions
|
@ -152,7 +152,11 @@ class LibraryController {
|
|||
collapseseries: req.query.collapseseries === '1'
|
||||
}
|
||||
|
||||
var filterSeries = null
|
||||
if (payload.filterBy) {
|
||||
// If filtering by series, will include seriesName and seriesSequence on media metadata
|
||||
filterSeries = (payload.mediaType == 'book' && payload.filterBy.startsWith('series.')) ? libraryHelpers.decode(payload.filterBy.replace('series.', '')) : null
|
||||
|
||||
libraryItems = libraryHelpers.getFilteredLibraryItems(libraryItems, payload.filterBy, req.user)
|
||||
payload.total = libraryItems.length
|
||||
}
|
||||
|
@ -180,7 +184,21 @@ class LibraryController {
|
|||
}
|
||||
|
||||
// TODO: Potentially implement collapse series again
|
||||
libraryItems = libraryItems.map(ab => payload.minified ? ab.toJSONMinified() : ab.toJSON())
|
||||
if (payload.collapseseries) {
|
||||
libraryItems = libraryHelpers.collapseBookSeries(libraryItems)
|
||||
payload.total = libraryItems.length
|
||||
} else if (filterSeries) {
|
||||
// Book media when filtering series will include series object on media metadata
|
||||
libraryItems = libraryItems.map(li => {
|
||||
var series = li.media.metadata.getSeries(filterSeries)
|
||||
var liJson = payload.minified ? li.toJSONMinified() : li.toJSON()
|
||||
liJson.media.metadata.series = series
|
||||
return liJson
|
||||
})
|
||||
libraryItems = naturalSort(libraryItems).asc(li => li.media.metadata.series.sequence)
|
||||
} else {
|
||||
libraryItems = libraryItems.map(li => payload.minified ? li.toJSONMinified() : li.toJSON())
|
||||
}
|
||||
|
||||
if (payload.limit) {
|
||||
var startIndex = payload.page * payload.limit
|
||||
|
|
|
@ -57,7 +57,7 @@ class Podcast {
|
|||
metadata: this.metadata.toJSON(),
|
||||
coverPath: this.coverPath,
|
||||
tags: [...this.tags],
|
||||
episodes: this.episodes.map(e => e.toJSON()),
|
||||
numEpisodes: this.episodes.length,
|
||||
autoDownloadEpisodes: this.autoDownloadEpisodes,
|
||||
lastEpisodeCheck: this.lastEpisodeCheck,
|
||||
size: this.size
|
||||
|
|
|
@ -151,6 +151,12 @@ class BookMetadata {
|
|||
hasNarrator(narratorName) {
|
||||
return this.narrators.includes(narratorName)
|
||||
}
|
||||
getSeries(seriesId) {
|
||||
return this.series.find(se => se.id == seriesId)
|
||||
}
|
||||
getFirstSeries() {
|
||||
return this.series.length ? this.series[0] : null
|
||||
}
|
||||
getSeriesSequence(seriesId) {
|
||||
var series = this.series.find(se => se.id == seriesId)
|
||||
if (!series) return null
|
||||
|
|
|
@ -262,4 +262,33 @@ module.exports = {
|
|||
})
|
||||
return totalSize
|
||||
},
|
||||
|
||||
collapseBookSeries(libraryItems) {
|
||||
var seriesObjects = this.getSeriesFromBooks(libraryItems, true)
|
||||
var seriesToUse = {}
|
||||
var libraryItemIdsToHide = []
|
||||
seriesObjects.forEach((series) => {
|
||||
series.firstBook = series.books.find(b => !seriesToUse[b.id]) // Find first book not already used
|
||||
if (series.firstBook) {
|
||||
seriesToUse[series.firstBook.id] = series
|
||||
libraryItemIdsToHide = libraryItemIdsToHide.concat(series.books.filter(b => !seriesToUse[b.id]).map(b => b.id))
|
||||
}
|
||||
})
|
||||
|
||||
return libraryItems.map((li) => {
|
||||
if (li.mediaType != 'book') return
|
||||
var libraryItemJson = li.toJSONMinified()
|
||||
if (libraryItemIdsToHide.includes(li.id)) {
|
||||
return null
|
||||
}
|
||||
if (seriesToUse[li.id]) {
|
||||
libraryItemJson.collapsedSeries = {
|
||||
id: seriesToUse[li.id].id,
|
||||
name: seriesToUse[li.id].name,
|
||||
numBooks: seriesToUse[li.id].books.length
|
||||
}
|
||||
}
|
||||
return libraryItemJson
|
||||
}).filter(li => li)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue