diff --git a/client/components/app/BookShelfToolbar.vue b/client/components/app/BookShelfToolbar.vue index a3879279..57599877 100644 --- a/client/components/app/BookShelfToolbar.vue +++ b/client/components/app/BookShelfToolbar.vue @@ -189,6 +189,9 @@ export default { currentLibraryId() { return this.$store.state.libraries.currentLibraryId }, + libraryProvider() { + return this.$store.getters['libraries/getLibraryProvider'](this.currentLibraryId) || 'google' + }, currentLibraryMediaType() { return this.$store.getters['libraries/getCurrentLibraryMediaType'] }, @@ -323,7 +326,11 @@ export default { const payload = {} if (author.asin) payload.asin = author.asin else payload.q = author.name - console.log('Payload', payload, 'author', author) + + payload.region = 'us' + if (this.libraryProvider.startsWith('audible.')) { + payload.region = this.libraryProvider.split('.').pop() || 'us' + } this.$eventBus.$emit(`searching-author-${author.id}`, true) diff --git a/client/components/cards/AuthorCard.vue b/client/components/cards/AuthorCard.vue index ce4f0d3b..db4e7e9a 100644 --- a/client/components/cards/AuthorCard.vue +++ b/client/components/cards/AuthorCard.vue @@ -77,6 +77,12 @@ export default { }, userCanUpdate() { return this.$store.getters['user/getUserCanUpdate'] + }, + currentLibraryId() { + return this.$store.state.libraries.currentLibraryId + }, + libraryProvider() { + return this.$store.getters['libraries/getLibraryProvider'](this.currentLibraryId) || 'google' } }, methods: { @@ -92,6 +98,11 @@ export default { if (this.asin) payload.asin = this.asin else payload.q = this.name + payload.region = 'us' + if (this.libraryProvider.startsWith('audible.')) { + payload.region = this.libraryProvider.split('.').pop() || 'us' + } + var response = await this.$axios.$post(`/api/authors/${this.authorId}/match`, payload).catch((error) => { console.error('Failed', error) return null diff --git a/client/components/modals/authors/EditModal.vue b/client/components/modals/authors/EditModal.vue index f2430390..40292dca 100644 --- a/client/components/modals/authors/EditModal.vue +++ b/client/components/modals/authors/EditModal.vue @@ -85,6 +85,12 @@ export default { }, title() { return this.$strings.HeaderUpdateAuthor + }, + currentLibraryId() { + return this.$store.state.libraries.currentLibraryId + }, + libraryProvider() { + return this.$store.getters['libraries/getLibraryProvider'](this.currentLibraryId) || 'google' } }, methods: { @@ -151,6 +157,11 @@ export default { if (this.authorCopy.asin) payload.asin = this.authorCopy.asin else payload.q = this.authorCopy.name + payload.region = 'us' + if (this.libraryProvider.startsWith('audible.')) { + payload.region = this.libraryProvider.split('.').pop() || 'us' + } + var response = await this.$axios.$post(`/api/authors/${this.authorId}/match`, payload).catch((error) => { console.error('Failed', error) return null diff --git a/server/controllers/AuthorController.js b/server/controllers/AuthorController.js index d3d72f7c..106734a4 100644 --- a/server/controllers/AuthorController.js +++ b/server/controllers/AuthorController.js @@ -167,18 +167,19 @@ class AuthorController { } async match(req, res) { - var authorData = null + let authorData = null + const region = req.body.region || 'us' if (req.body.asin) { - authorData = await this.authorFinder.findAuthorByASIN(req.body.asin) + authorData = await this.authorFinder.findAuthorByASIN(req.body.asin, region) } else { - authorData = await this.authorFinder.findAuthorByName(req.body.q) + authorData = await this.authorFinder.findAuthorByName(req.body.q, region) } if (!authorData) { return res.status(404).send('Author not found') } Logger.debug(`[AuthorController] match author with "${req.body.q || req.body.asin}"`, authorData) - var hasUpdates = false + let hasUpdates = false if (authorData.asin && req.author.asin !== authorData.asin) { req.author.asin = authorData.asin hasUpdates = true @@ -188,7 +189,7 @@ class AuthorController { if (authorData.image && (!req.author.imagePath || hasUpdates)) { this.cacheManager.purgeImageCache(req.author.id) - var imageData = await this.authorFinder.saveAuthorImage(req.author.id, authorData.image) + const imageData = await this.authorFinder.saveAuthorImage(req.author.id, authorData.image) if (imageData) { req.author.imagePath = imageData.path hasUpdates = true @@ -204,7 +205,7 @@ class AuthorController { req.author.updatedAt = Date.now() await this.db.updateEntity('author', req.author) - var numBooks = this.db.libraryItems.filter(li => { + const numBooks = this.db.libraryItems.filter(li => { return li.media.metadata.hasAuthor && li.media.metadata.hasAuthor(req.author.id) }).length SocketAuthority.emitter('author_updated', req.author.toJSONExpanded(numBooks)) diff --git a/server/finders/AuthorFinder.js b/server/finders/AuthorFinder.js index 1f8b970b..18fb2223 100644 --- a/server/finders/AuthorFinder.js +++ b/server/finders/AuthorFinder.js @@ -20,16 +20,16 @@ class AuthorFinder { }) } - findAuthorByASIN(asin) { + findAuthorByASIN(asin, region) { if (!asin) return null - return this.audnexus.findAuthorByASIN(asin) + return this.audnexus.findAuthorByASIN(asin, region) } - async findAuthorByName(name, options = {}) { + async findAuthorByName(name, region, options = {}) { if (!name) return null const maxLevenshtein = !isNaN(options.maxLevenshtein) ? Number(options.maxLevenshtein) : 3 - var author = await this.audnexus.findAuthorByName(name, maxLevenshtein) + const author = await this.audnexus.findAuthorByName(name, region, maxLevenshtein) if (!author || !author.name) { return null } diff --git a/server/providers/Audnexus.js b/server/providers/Audnexus.js index 43dfb665..b74d1d13 100644 --- a/server/providers/Audnexus.js +++ b/server/providers/Audnexus.js @@ -7,9 +7,12 @@ class Audnexus { this.baseUrl = 'https://api.audnex.us' } - authorASINsRequest(name) { - name = encodeURIComponent(name); - return axios.get(`${this.baseUrl}/authors?name=${name}`).then((res) => { + authorASINsRequest(name, region) { + name = encodeURIComponent(name) + const regionQuery = region ? `®ion=${region}` : '' + const authorRequestUrl = `${this.baseUrl}/authors?name=${name}${regionQuery}` + Logger.info(`[Audnexus] Searching for author "${authorRequestUrl}"`) + return axios.get(authorRequestUrl).then((res) => { return res.data || [] }).catch((error) => { Logger.error(`[Audnexus] Author ASIN request failed for ${name}`, error) @@ -17,9 +20,12 @@ class Audnexus { }) } - authorRequest(asin) { - asin = encodeURIComponent(asin); - return axios.get(`${this.baseUrl}/authors/${asin}`).then((res) => { + authorRequest(asin, region) { + asin = encodeURIComponent(asin) + const regionQuery = region ? `?region=${region}` : '' + const authorRequestUrl = `${this.baseUrl}/authors/${asin}${regionQuery}` + Logger.info(`[Audnexus] Searching for author "${authorRequestUrl}"`) + return axios.get(authorRequestUrl).then((res) => { return res.data }).catch((error) => { Logger.error(`[Audnexus] Author request failed for ${asin}`, error) @@ -27,8 +33,8 @@ class Audnexus { }) } - async findAuthorByASIN(asin) { - var author = await this.authorRequest(asin) + async findAuthorByASIN(asin, region) { + const author = await this.authorRequest(asin, region) if (!author) { return null } @@ -40,14 +46,14 @@ class Audnexus { } } - async findAuthorByName(name, maxLevenshtein = 3) { + async findAuthorByName(name, region, maxLevenshtein = 3) { Logger.debug(`[Audnexus] Looking up author by name ${name}`) - var asins = await this.authorASINsRequest(name) - var matchingAsin = asins.find(obj => levenshteinDistance(obj.name, name) <= maxLevenshtein) + const asins = await this.authorASINsRequest(name, region) + const matchingAsin = asins.find(obj => levenshteinDistance(obj.name, name) <= maxLevenshtein) if (!matchingAsin) { return null } - var author = await this.authorRequest(matchingAsin.asin) + const author = await this.authorRequest(matchingAsin.asin) if (!author) { return null }