diff --git a/server/models/Book.js b/server/models/Book.js index d9f2ff132..d61ec3a46 100644 --- a/server/models/Book.js +++ b/server/models/Book.js @@ -465,9 +465,8 @@ class Book extends Model { /** @type {typeof import('./BookAuthor')} */ const bookAuthorModel = this.sequelize.models.bookAuthor - const authorsCleaned = authors.map((a) => a.toLowerCase()).filter((a) => a) - const authorsRemoved = this.authors.filter((au) => !authorsCleaned.includes(au.name.toLowerCase())) - const newAuthorNames = authors.filter((a) => !this.authors.some((au) => au.name.toLowerCase() === a.toLowerCase())) + const authorsRemoved = this.authors.filter((au) => !authors.some((authorName) => authorModel.isAuthorNameMatch(authorName, au.name))) + const newAuthorNames = authors.filter((a) => !this.authors.some((au) => authorModel.isAuthorNameMatch(au.name, a))) for (const author of authorsRemoved) { await bookAuthorModel.removeByIds(author.id, this.id) @@ -481,6 +480,7 @@ class Book extends Model { const authorsAdded = [] for (const authorName of newAuthorNames) { const { author, created } = await authorModel.findOrCreateByNameAndLibrary(authorName, libraryId) + if (!author) continue await bookAuthorModel.create({ bookId: this.id, authorId: author.id }) if (created) { SocketAuthority.emitter('author_added', author.toOldJSON()) diff --git a/server/scanner/BookScanner.js b/server/scanner/BookScanner.js index 8ae616fe8..005b0f0e7 100644 --- a/server/scanner/BookScanner.js +++ b/server/scanner/BookScanner.js @@ -221,23 +221,18 @@ class BookScanner { if (key === 'authors') { // Check for authors added for (const authorName of bookMetadata.authors) { - if (!media.authors.some((au) => au.name === authorName)) { - const existingAuthorId = await Database.getAuthorIdByName(libraryItemData.libraryId, authorName) - if (existingAuthorId) { + if (!media.authors.some((au) => Database.authorModel.isAuthorNameMatch(au.name, authorName))) { + const { author, created } = await Database.authorModel.findOrCreateByNameAndLibrary(authorName, libraryItemData.libraryId) + if (!created) { await Database.bookAuthorModel.create({ bookId: media.id, - authorId: existingAuthorId + authorId: author.id }) libraryScan.addLog(LogLevel.DEBUG, `Updating book "${bookMetadata.title}" added author "${authorName}"`) authorsUpdated = true } else { - const newAuthor = await Database.authorModel.create({ - name: authorName, - lastFirst: Database.authorModel.getLastFirst(authorName), - libraryId: libraryItemData.libraryId - }) - await media.addAuthor(newAuthor) - Database.addAuthorToFilterData(libraryItemData.libraryId, newAuthor.name, newAuthor.id) + await media.addAuthor(author) + Database.addAuthorToFilterData(libraryItemData.libraryId, author.name, author.id) libraryScan.addLog(LogLevel.DEBUG, `Updating book "${bookMetadata.title}" added new author "${authorName}"`) authorsUpdated = true } @@ -245,7 +240,7 @@ class BookScanner { } // Check for authors removed for (const author of media.authors) { - if (!bookMetadata.authors.includes(author.name)) { + if (!bookMetadata.authors.some((authorName) => Database.authorModel.isAuthorNameMatch(authorName, author.name))) { await author.bookAuthor.destroy() libraryScan.addLog(LogLevel.DEBUG, `Updating book "${bookMetadata.title}" removed author "${author.name}"`) authorsUpdated = true