diff --git a/client/pages/audiobook/_id/index.vue b/client/pages/audiobook/_id/index.vue index 783719a1..56926f87 100644 --- a/client/pages/audiobook/_id/index.vue +++ b/client/pages/audiobook/_id/index.vue @@ -30,7 +30,11 @@ Narrated By
- {{ narrator }} + +
@@ -278,6 +282,10 @@ export default { authorLF() { return this.book.authorLF }, + narrators() { + if (!this.book.narratorFL) return [] + return this.book.narratorFL.split(', ') || [] + }, authorTooltipText() { var txt = ['FL: ' + this.authorFL || 'Not Set', 'LF: ' + this.authorLF || 'Not Set'] return txt.join('
') diff --git a/client/store/audiobooks.js b/client/store/audiobooks.js index 7e637d70..970ee8a9 100644 --- a/client/store/audiobooks.js +++ b/client/store/audiobooks.js @@ -60,7 +60,7 @@ export const getters = { else filtered = filtered.filter(ab => ab.book && ab.book.series === filter) } else if (group === 'authors') filtered = filtered.filter(ab => ab.book && ab.book.authorFL && ab.book.authorFL.split(', ').includes(filter)) - else if (group === 'narrators') filtered = filtered.filter(ab => ab.book && ab.book.narrator === filter) + else if (group === 'narrators') filtered = filtered.filter(ab => ab.book && ab.book.narratorFL && ab.book.narratorFL.split(', ').includes(filter)) else if (group === 'progress') { filtered = filtered.filter(ab => { var userAudiobook = rootGetters['user/getUserAudiobook'](ab.id) @@ -141,8 +141,13 @@ export const getters = { return [...new Set(abAuthors)].sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : 1) }, getUniqueNarrators: (state) => { - var _narrators = state.audiobooks.filter(ab => !!(ab.book && ab.book.narrator)).map(ab => ab.book.narrator) - return [...new Set(_narrators)].sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : 1) + var narrators = [] + state.audiobooks.forEach((ab) => { + if (ab.book && ab.book.narratorFL) { + narrators = narrators.concat(ab.book.narratorFL.split(', ')) + } + }) + return [...new Set(narrators)].sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : 1) }, getGenresUsed: (state) => { var _genres = [] diff --git a/server/objects/Book.js b/server/objects/Book.js index 545b56e0..39c5adfc 100644 --- a/server/objects/Book.js +++ b/server/objects/Book.js @@ -54,6 +54,7 @@ class Book { this.authorFL = book.authorFL || null this.authorLF = book.authorLF || null this.narrator = book.narrator || book.narrarator || null // Mispelled initially... need to catch those + this.narratorFL = book.narratorFL || null this.series = book.series this.volumeNumber = book.volumeNumber || null this.publishYear = book.publishYear @@ -68,6 +69,11 @@ class Book { this.lastCoverSearch = book.lastCoverSearch || null this.lastCoverSearchTitle = book.lastCoverSearchTitle || null this.lastCoverSearchAuthor = book.lastCoverSearchAuthor || null + + // narratorFL added in v1.6.21 to support multi-narrators + if (this.narrator && !this.narratorFL) { + this.setParseNarrator(this.narrator) + } } toJSON() { @@ -78,6 +84,7 @@ class Book { authorFL: this.authorFL, authorLF: this.authorLF, narrator: this.narrator, + narratorFL: this.narratorFL, series: this.series, volumeNumber: this.volumeNumber, publishYear: this.publishYear, @@ -114,6 +121,23 @@ class Book { } } + setParseNarrator(narrator) { + if (!narrator) { + var hasUpdated = this.narratorFL + this.narratorFL = null + return hasUpdated + } + try { + var { authorFL } = parseAuthors(narrator) + var hasUpdated = authorFL !== this.narratorFL + this.narratorFL = authorFL || null + return hasUpdated + } catch (err) { + Logger.error('[Book] Parse narrator failed', err) + return false + } + } + setData(data) { this.title = data.title || null this.subtitle = data.subtitle || null @@ -136,6 +160,9 @@ class Book { if (data.author) { this.setParseAuthor(this.author) } + if (data.narrator) { + this.setParseNarrator(this.narrator) + } } update(payload) { @@ -174,6 +201,14 @@ class Book { if (this.setParseAuthor(this.author)) { hasUpdates = true } + } else if (key === 'narrator') { + if (this.narrator !== payload.narrator) { + this.narrator = payload.narrator || null + hasUpdates = true + } + if (this.setParseNarrator(this.narrator)) { + hasUpdates = true + } } else if (this[key] !== undefined && payload[key] !== this[key]) { this[key] = payload[key] hasUpdates = true diff --git a/server/utils/parseAuthors.js b/server/utils/parseAuthors.js index 21029b36..3a73fd12 100644 --- a/server/utils/parseAuthors.js +++ b/server/utils/parseAuthors.js @@ -44,7 +44,7 @@ module.exports = (author) => { var isEvenNum = splitAuthors.length % 2 === 0 if (!isEvenNum && firstChunkIsALastName) { - // console.error('Multi-author LAST,FIRST entry has a straggler (could be roman numerals or a suffix), ignore it', splitByComma[splitByComma.length - 1]) + // console.error('Multi-author LAST,FIRST entry has a straggler (could be roman numerals or a suffix), ignore it') splitAuthors = splitAuthors.slice(0, splitAuthors.length - 1) }