mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Add continue series category
Added section to home with next book in series
This commit is contained in:
		
							parent
							
								
									111f038cb2
								
							
						
					
					
						commit
						503bfbf2ef
					
				| @ -272,6 +272,7 @@ class LibraryController { | |||||||
| 
 | 
 | ||||||
|     var booksWithUserAb = libraryHelpers.getBooksWithUserAudiobook(req.user, books) |     var booksWithUserAb = libraryHelpers.getBooksWithUserAudiobook(req.user, books) | ||||||
|     var series = libraryHelpers.getSeriesFromBooks(books, minified) |     var series = libraryHelpers.getSeriesFromBooks(books, minified) | ||||||
|  |     var seriesWithUserAb = libraryHelpers.getSeriesWithProgressFromBooks(req.user, books) | ||||||
| 
 | 
 | ||||||
|     var categories = [ |     var categories = [ | ||||||
|       { |       { | ||||||
| @ -280,6 +281,12 @@ class LibraryController { | |||||||
|         type: 'books', |         type: 'books', | ||||||
|         entities: libraryHelpers.getBooksMostRecentlyRead(booksWithUserAb, limitPerShelf, minified) |         entities: libraryHelpers.getBooksMostRecentlyRead(booksWithUserAb, limitPerShelf, minified) | ||||||
|       }, |       }, | ||||||
|  |       { | ||||||
|  |         id: 'continue-series', | ||||||
|  |         label: 'Continue Series', | ||||||
|  |         type: 'books', | ||||||
|  |         entities: libraryHelpers.getBooksNextInSeries(seriesWithUserAb, limitPerShelf, minified) | ||||||
|  |       }, | ||||||
|       { |       { | ||||||
|         id: 'recently-added', |         id: 'recently-added', | ||||||
|         label: 'Recently Added', |         label: 'Recently Added', | ||||||
|  | |||||||
| @ -110,6 +110,29 @@ module.exports = { | |||||||
|     }) |     }) | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  |   getSeriesWithProgressFromBooks(user, books) { | ||||||
|  |     var _series = {} | ||||||
|  |     books.forEach((audiobook) => { | ||||||
|  |       if (audiobook.book.series) { | ||||||
|  |         var bookWithUserAb = { userAudiobook: user.getAudiobookJSON(audiobook.id), book: audiobook } | ||||||
|  |         if (!_series[audiobook.book.series]) { | ||||||
|  |           _series[audiobook.book.series] = { | ||||||
|  |             id: audiobook.book.series, | ||||||
|  |             name: audiobook.book.series, | ||||||
|  |             type: 'series', | ||||||
|  |             books: [bookWithUserAb] | ||||||
|  |           } | ||||||
|  |         } else { | ||||||
|  |           _series[audiobook.book.series].books.push(bookWithUserAb) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     return Object.values(_series).map((series) => { | ||||||
|  |       series.books = naturalSort(series.books).asc(ab => ab.book.book.volumeNumber) | ||||||
|  |       return series | ||||||
|  |     }).filter((series) => series.books.some((book) => book.userAudiobook && book.userAudiobook.isRead)) | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|   sortSeriesBooks(books, minified = false) { |   sortSeriesBooks(books, minified = false) { | ||||||
|     return naturalSort(books).asc(ab => ab.book.volumeNumber).map(ab => { |     return naturalSort(books).asc(ab => ab.book.volumeNumber).map(ab => { | ||||||
|       if (minified) return ab.toJSONMinified() |       if (minified) return ab.toJSONMinified() | ||||||
| @ -134,6 +157,18 @@ module.exports = { | |||||||
|     return booksWithProgress.map(b => minified ? b.book.toJSONMinified() : b.book.toJSONExpanded()).slice(0, limit) |     return booksWithProgress.map(b => minified ? b.book.toJSONMinified() : b.book.toJSONExpanded()).slice(0, limit) | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|  |   getBooksNextInSeries(seriesWithUserAb, limit, minified = false) { | ||||||
|  |     var incompleteSeires = seriesWithUserAb.filter((series) => series.books.some((book) => !book.userAudiobook || (!book.userAudiobook.isRead && book.userAudiobook.progress == 0))) | ||||||
|  |     var booksNextInSeries = [] | ||||||
|  |     incompleteSeires.forEach((series) => { | ||||||
|  |       var dateLastRead = series.books.filter((data) => data.userAudiobook && data.userAudiobook.isRead).sort((a, b) => { return b.userAudiobook.finishedAt - a.userAudiobook.finishedAt})[0].userAudiobook.finishedAt | ||||||
|  |       var nextUnreadBook = series.books.filter((data) => !data.userAudiobook || (!data.userAudiobook.isRead && data.userAudiobook.progress == 0)).sort(b => parseInt(b.volumeNumber))[0] | ||||||
|  |       nextUnreadBook.DateLastReadSeries = dateLastRead | ||||||
|  |       booksNextInSeries.push(nextUnreadBook) | ||||||
|  |     }) | ||||||
|  |     return booksNextInSeries.sort((a, b) => { return b.DateLastReadSeries - a.DateLastReadSeries}).map(b => minified ? b.book.toJSONMinified() : b.book.toJSONExpanded()).slice(0, limit) | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|   getBooksMostRecentlyAdded(books, limit, minified = false) { |   getBooksMostRecentlyAdded(books, limit, minified = false) { | ||||||
|     var booksSortedByAddedAt = sort(books).desc(book => book.addedAt) |     var booksSortedByAddedAt = sort(books).desc(book => book.addedAt) | ||||||
|     return booksSortedByAddedAt.map(b => minified ? b.toJSONMinified() : b.toJSONExpanded()).slice(0, limit) |     return booksSortedByAddedAt.map(b => minified ? b.toJSONMinified() : b.toJSONExpanded()).slice(0, limit) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user