diff --git a/client/components/app/BookShelfCategorized.vue b/client/components/app/BookShelfCategorized.vue index f83cbae0..e2119bf8 100644 --- a/client/components/app/BookShelfCategorized.vue +++ b/client/components/app/BookShelfCategorized.vue @@ -85,7 +85,7 @@ export default { }, async fetchCategories() { var categories = await this.$axios - .$get(`/api/libraries/${this.currentLibraryId}/categories`) + .$get(`/api/libraries/${this.currentLibraryId}/categories?minified=1`) .then((data) => { return data }) diff --git a/client/components/app/LazyBookshelf.vue b/client/components/app/LazyBookshelf.vue index 34d6337b..57d1a46e 100644 --- a/client/components/app/LazyBookshelf.vue +++ b/client/components/app/LazyBookshelf.vue @@ -54,7 +54,7 @@ export default { pageLoadQueue: [], isFetchingEntities: false, scrollTimeout: null, - booksPerFetch: 250, + booksPerFetch: 100, totalShelves: 0, bookshelfMarginLeft: 0, isSelectionMode: false, @@ -220,7 +220,7 @@ export default { var entityPath = this.entityName === 'books' ? `books/all` : this.entityName if (this.entityName === 'series-books') entityPath = `series/${this.seriesId}` var sfQueryString = this.currentSFQueryString ? this.currentSFQueryString + '&' : '' - var fullQueryString = this.entityName === 'series-books' ? '' : `?${sfQueryString}limit=${this.booksPerFetch}&page=${page}` + var fullQueryString = this.entityName === 'series-books' ? '' : `?${sfQueryString}limit=${this.booksPerFetch}&page=${page}&minified=1` var payload = await this.$axios.$get(`/api/libraries/${this.currentLibraryId}/${entityPath}${fullQueryString}`).catch((error) => { console.error('failed to fetch books', error) return null @@ -438,7 +438,7 @@ export default { var entitiesPerShelfBefore = this.entitiesPerShelf var { clientHeight, clientWidth } = bookshelf - console.log('Init bookshelf width', clientWidth, 'window width', window.innerWidth) + // console.log('Init bookshelf width', clientWidth, 'window width', window.innerWidth) this.mountWindowWidth = window.innerWidth this.bookshelfHeight = clientHeight this.bookshelfWidth = clientWidth diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 9699e202..f0963cef 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -124,7 +124,8 @@ class LibraryController { page: req.query.page && !isNaN(req.query.page) ? Number(req.query.page) : 0, sortBy: req.query.sort, sortDesc: req.query.desc === '1', - filterBy: req.query.filter + filterBy: req.query.filter, + minified: req.query.minified === '1' } if (payload.filterBy) { @@ -147,7 +148,7 @@ class LibraryController { var startIndex = payload.page * payload.limit audiobooks = audiobooks.slice(startIndex, startIndex + payload.limit) } - payload.results = audiobooks.map(ab => ab.toJSONExpanded()) + payload.results = audiobooks.map(ab => payload.minified ? ab.toJSONMinified() : ab.toJSONExpanded()) res.json(payload) } @@ -162,10 +163,11 @@ class LibraryController { page: req.query.page && !isNaN(req.query.page) ? Number(req.query.page) : 0, sortBy: req.query.sort, sortDesc: req.query.desc === '1', - filterBy: req.query.filter + filterBy: req.query.filter, + minified: req.query.minified === '1' } - var series = libraryHelpers.getSeriesFromBooks(audiobooks) + var series = libraryHelpers.getSeriesFromBooks(audiobooks, payload.minified) payload.total = series.length if (payload.limit) { @@ -208,10 +210,11 @@ class LibraryController { page: req.query.page && !isNaN(req.query.page) ? Number(req.query.page) : 0, sortBy: req.query.sort, sortDesc: req.query.desc === '1', - filterBy: req.query.filter + filterBy: req.query.filter, + minified: req.query.minified === '1' } - var collections = this.db.collections.filter(c => c.libraryId === req.library.id).map(c => c.toJSONExpanded(audiobooks)) + var collections = this.db.collections.filter(c => c.libraryId === req.library.id).map(c => c.toJSONExpanded(audiobooks, payload.minified)) payload.total = collections.length if (payload.limit) { @@ -235,28 +238,29 @@ class LibraryController { var library = req.library var books = this.db.audiobooks.filter(ab => ab.libraryId === library.id) var limitPerShelf = req.query.limit && !isNaN(req.query.limit) ? Number(req.query.limit) : 12 + var minified = req.query.minified === '1' var booksWithUserAb = libraryHelpers.getBooksWithUserAudiobook(req.user, books) - var series = libraryHelpers.getSeriesFromBooks(books) + var series = libraryHelpers.getSeriesFromBooks(books, minified) var categories = [ { id: 'continue-reading', label: 'Continue Reading', type: 'books', - entities: libraryHelpers.getBooksMostRecentlyRead(booksWithUserAb, limitPerShelf) + entities: libraryHelpers.getBooksMostRecentlyRead(booksWithUserAb, limitPerShelf, minified) }, { id: 'recently-added', label: 'Recently Added', type: 'books', - entities: libraryHelpers.getBooksMostRecentlyAdded(books, limitPerShelf) + entities: libraryHelpers.getBooksMostRecentlyAdded(books, limitPerShelf, minified) }, { id: 'read-again', label: 'Read Again', type: 'books', - entities: libraryHelpers.getBooksMostRecentlyFinished(booksWithUserAb, limitPerShelf) + entities: libraryHelpers.getBooksMostRecentlyFinished(booksWithUserAb, limitPerShelf, minified) }, { id: 'recent-series', diff --git a/server/objects/Audiobook.js b/server/objects/Audiobook.js index 28fb67e7..8e42b63a 100644 --- a/server/objects/Audiobook.js +++ b/server/objects/Audiobook.js @@ -211,7 +211,7 @@ class Audiobook { ebooks: this.ebooks.map(ebook => ebook.toJSON()), numEbooks: this.ebooks.length, numTracks: this.tracks.length, - chapters: this.chapters || [], + numChapters: (this.chapters || []).length, isMissing: !!this.isMissing, isInvalid: !!this.isInvalid, hasMissingParts: this.numMissingParts, diff --git a/server/objects/UserCollection.js b/server/objects/UserCollection.js index be761d85..780b2a42 100644 --- a/server/objects/UserCollection.js +++ b/server/objects/UserCollection.js @@ -37,11 +37,11 @@ class UserCollection { } } - toJSONExpanded(audiobooks) { + toJSONExpanded(audiobooks, minifiedBooks = false) { var json = this.toJSON() json.books = json.books.map(bookId => { var _ab = audiobooks.find(ab => ab.id === bookId) - return _ab ? _ab.toJSONExpanded() : null + return _ab ? minifiedBooks ? _ab.toJSONMinified() : _ab.toJSONExpanded() : null }).filter(b => !!b) return json } diff --git a/server/utils/libraryHelpers.js b/server/utils/libraryHelpers.js index 11787580..10bb4af4 100644 --- a/server/utils/libraryHelpers.js +++ b/server/utils/libraryHelpers.js @@ -74,19 +74,20 @@ module.exports = { return data }, - getSeriesFromBooks(books) { + getSeriesFromBooks(books, minified = false) { var _series = {} books.forEach((audiobook) => { if (audiobook.book.series) { + var abJson = minified ? audiobook.toJSONMinified() : audiobook.toJSONExpanded() if (!_series[audiobook.book.series]) { _series[audiobook.book.series] = { id: audiobook.book.series, name: audiobook.book.series, type: 'series', - books: [audiobook.toJSONExpanded()] + books: [abJson] } } else { - _series[audiobook.book.series].books.push(audiobook.toJSONExpanded()) + _series[audiobook.book.series].books.push(abJson) } } }) @@ -108,25 +109,25 @@ module.exports = { }) }, - getBooksMostRecentlyRead(booksWithUserAb, limit) { + getBooksMostRecentlyRead(booksWithUserAb, limit, minified = false) { var booksWithProgress = booksWithUserAb.filter((data) => data.userAudiobook && data.userAudiobook.progress > 0 && !data.userAudiobook.isRead) booksWithProgress.sort((a, b) => { return b.userAudiobook.lastUpdate - a.userAudiobook.lastUpdate }) - return booksWithProgress.map(b => b.book.toJSONExpanded()).slice(0, limit) + return booksWithProgress.map(b => minified ? b.book.toJSONMinified() : b.book.toJSONExpanded()).slice(0, limit) }, - getBooksMostRecentlyAdded(books, limit) { + getBooksMostRecentlyAdded(books, limit, minified = false) { var booksSortedByAddedAt = sort(books).desc(book => book.addedAt) - return booksSortedByAddedAt.map(b => b.toJSONExpanded()).slice(0, limit) + return booksSortedByAddedAt.map(b => minified ? b.toJSONMinified() : b.toJSONExpanded()).slice(0, limit) }, - getBooksMostRecentlyFinished(booksWithUserAb, limit) { + getBooksMostRecentlyFinished(booksWithUserAb, limit, minified = false) { var booksRead = booksWithUserAb.filter((data) => data.userAudiobook && data.userAudiobook.isRead) booksRead.sort((a, b) => { return b.userAudiobook.finishedAt - a.userAudiobook.finishedAt }) - return booksRead.map(b => b.book.toJSONExpanded()).slice(0, limit) + return booksRead.map(b => minified ? b.book.toJSONMinified() : b.book.toJSONExpanded()).slice(0, limit) }, getSeriesMostRecentlyAdded(series, limit) {