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 }}
+
+ {{ 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)
}