diff --git a/client/components/modals/edit-tabs/Cover.vue b/client/components/modals/edit-tabs/Cover.vue index 9879e6b9..23d1b408 100644 --- a/client/components/modals/edit-tabs/Cover.vue +++ b/client/components/modals/edit-tabs/Cover.vue @@ -47,9 +47,9 @@
- +
-
+
Search @@ -98,20 +98,6 @@ export default { showLocalCovers: false, previewUpload: null, selectedFile: null, - providers: [ - { - text: 'Google Books', - value: 'google' - }, - { - text: 'Open Library', - value: 'openlibrary' - }, - { - text: 'Audible', - value: 'audible' - } - ], provider: 'google' } }, @@ -134,6 +120,14 @@ export default { this.$emit('update:processing', val) } }, + providers() { + return this.$store.state.scanners.providers + }, + searchTitleLabel() { + if (this.provider == 'audible') return 'Search Title or ASIN' + else if (this.provider == 'itunes') return 'Search Term' + return 'Search Title' + }, coverAspectRatio() { return this.$store.getters['getServerSetting']('coverAspectRatio') }, diff --git a/client/components/modals/edit-tabs/Match.vue b/client/components/modals/edit-tabs/Match.vue index 1eb2258c..31206c36 100644 --- a/client/components/modals/edit-tabs/Match.vue +++ b/client/components/modals/edit-tabs/Match.vue @@ -6,9 +6,9 @@
- +
-
+
Search @@ -147,6 +147,11 @@ export default { }, providers() { return this.$store.state.scanners.providers + }, + searchTitleLabel() { + if (this.provider == 'audible') return 'Search Title or ASIN' + else if (this.provider == 'itunes') return 'Search Term' + return 'Search Title' } }, methods: { diff --git a/client/store/scanners.js b/client/store/scanners.js index 8312e712..509b832e 100644 --- a/client/store/scanners.js +++ b/client/store/scanners.js @@ -12,6 +12,10 @@ export const state = () => ({ { text: 'Audible', value: 'audible' + }, + { + text: 'iTunes', + value: 'itunes' } ] }) diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js index d5d4ac45..fa0214a6 100644 --- a/server/finders/BookFinder.js +++ b/server/finders/BookFinder.js @@ -2,6 +2,7 @@ const OpenLibrary = require('../providers/OpenLibrary') const LibGen = require('../providers/LibGen') const GoogleBooks = require('../providers/GoogleBooks') const Audible = require('../providers/Audible') +const iTunes = require('../providers/iTunes') const Logger = require('../Logger') const { levenshteinDistance } = require('../utils/index') @@ -11,6 +12,7 @@ class BookFinder { this.libGen = new LibGen() this.googleBooks = new GoogleBooks() this.audible = new Audible() + this.iTunesApi = new iTunes() this.verbose = false } @@ -158,6 +160,10 @@ class BookFinder { return books } + async getiTunesAudiobooksResults(title, author) { + return this.iTunesApi.searchAudiobooks(title) + } + async getAudibleResults(title, author) { var books = await this.audible.search(title, author); if (this.verbose) Logger.debug(`Audible Book Search Results: ${books.length || 0}`) @@ -175,6 +181,8 @@ class BookFinder { return this.getGoogleBooksResults(title, author) } else if (provider === 'audible') { return this.getAudibleResults(title, author) + } else if (provider === 'itunes') { + return this.getiTunesAudiobooksResults(title, author) } else if (provider === 'libgen') { books = await this.getLibGenResults(title, author, maxTitleDistance, maxAuthorDistance) } else if (provider === 'openlibrary') { diff --git a/server/providers/iTunes.js b/server/providers/iTunes.js index c8f78b74..2eb42fab 100644 --- a/server/providers/iTunes.js +++ b/server/providers/iTunes.js @@ -1,6 +1,6 @@ const axios = require('axios') const Logger = require('../Logger') - +const { stripHtml } = require('string-strip-html') class iTunes { constructor() { } @@ -18,16 +18,35 @@ class iTunes { limit: options.limit, country: options.country } - console.log('Query', query) - return axios.get('https://itunes.apple.com/search', { params: query }).then((response) => { - var data = response.data - console.log('data', data) - return data.results || [] + return response.data.results || [] }).catch((error) => { Logger.error(`[iTunes] search request error`, error) return [] }) } + + cleanAudiobook(data) { + // Example cover art: https://is1-ssl.mzstatic.com/image/thumb/Music118/v4/cb/ea/73/cbea739b-ff3b-11c4-fb93-7889fbec7390/9781598874983_cover.jpg/100x100bb.jpg + // 100x100bb can be replaced by other values https://github.com/bendodson/itunes-artwork-finder + var cover = data.artworkUrl100 || data.artworkUrl60 || '' + cover = cover.replace('100x100bb', '600x600bb').replace('60x60bb', '600x600bb') + return { + id: data.collectionId, + artistId: data.artistId, + title: data.collectionName, + author: data.artistName, + description: stripHtml(data.description || '').result, + publishYear: data.releaseDate ? data.releaseDate.split('-')[0] : null, + genres: data.primaryGenreName ? [data.primaryGenreName] : [], + cover + } + } + + searchAudiobooks(term) { + return this.search({ term, entity: 'audiobook', media: 'audiobook' }).then((results) => { + return results.map(this.cleanAudiobook) + }) + } } module.exports = iTunes \ No newline at end of file