From 43f48b65f81e0f221527ed97072e40828e5ed08a Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 6 Mar 2022 16:32:04 -0600 Subject: [PATCH] Add:Podcast iTunes search api and iTunes provider --- server/ApiController.js | 13 +++++++++-- server/{ => finders}/AuthorFinder.js | 8 +++---- server/{ => finders}/BookFinder.js | 12 +++++----- server/finders/PodcastFinder.js | 25 +++++++++++++++++++++ server/providers/iTunes.js | 33 ++++++++++++++++++++++++++++ server/scanner/AuthorScanner.js | 2 +- server/scanner/Scanner.js | 2 +- 7 files changed, 81 insertions(+), 14 deletions(-) rename server/{ => finders}/AuthorFinder.js (94%) rename server/{ => finders}/BookFinder.js (96%) create mode 100644 server/finders/PodcastFinder.js create mode 100644 server/providers/iTunes.js diff --git a/server/ApiController.js b/server/ApiController.js index b8eff93e..90034b2c 100644 --- a/server/ApiController.js +++ b/server/ApiController.js @@ -15,8 +15,9 @@ const CollectionController = require('./controllers/CollectionController') const MeController = require('./controllers/MeController') const BackupController = require('./controllers/BackupController') -const BookFinder = require('./BookFinder') -const AuthorFinder = require('./AuthorFinder') +const BookFinder = require('./finders/BookFinder') +const AuthorFinder = require('./finders/AuthorFinder') +const PodcastFinder = require('./finders/PodcastFinder') const FileSystemController = require('./controllers/FileSystemController') class ApiController { @@ -36,6 +37,7 @@ class ApiController { this.bookFinder = new BookFinder() this.authorFinder = new AuthorFinder() + this.podcastFinder = new PodcastFinder() this.router = express() this.init() @@ -131,6 +133,7 @@ class ApiController { // this.router.get('/search/covers', this.findCovers.bind(this)) this.router.get('/search/books', this.findBooks.bind(this)) + this.router.get('/search/podcast', this.findPodcasts.bind(this)) // // File System Routes @@ -181,6 +184,12 @@ class ApiController { res.json(result) } + async findPodcasts(req, res) { + var term = req.query.term + var results = await this.podcastFinder.search(term) + res.json(results) + } + authorize(req, res) { if (!req.user) { Logger.error('Invalid user in authorize') diff --git a/server/AuthorFinder.js b/server/finders/AuthorFinder.js similarity index 94% rename from server/AuthorFinder.js rename to server/finders/AuthorFinder.js index ba3f3a83..3232fcbb 100644 --- a/server/AuthorFinder.js +++ b/server/finders/AuthorFinder.js @@ -1,10 +1,10 @@ const fs = require('fs-extra') -const Logger = require('./Logger') +const Logger = require('../Logger') const Path = require('path') -const Author = require('./objects/Author') -const Audnexus = require('./providers/Audnexus') +const Author = require('../objects/Author') +const Audnexus = require('../providers/Audnexus') -const { downloadFile } = require('./utils/fileUtils') +const { downloadFile } = require('../utils/fileUtils') class AuthorFinder { constructor() { diff --git a/server/BookFinder.js b/server/finders/BookFinder.js similarity index 96% rename from server/BookFinder.js rename to server/finders/BookFinder.js index c7f18f22..d5d4ac45 100644 --- a/server/BookFinder.js +++ b/server/finders/BookFinder.js @@ -1,9 +1,9 @@ -const OpenLibrary = require('./providers/OpenLibrary') -const LibGen = require('./providers/LibGen') -const GoogleBooks = require('./providers/GoogleBooks') -const Audible = require('./providers/Audible') -const Logger = require('./Logger') -const { levenshteinDistance } = require('./utils/index') +const OpenLibrary = require('../providers/OpenLibrary') +const LibGen = require('../providers/LibGen') +const GoogleBooks = require('../providers/GoogleBooks') +const Audible = require('../providers/Audible') +const Logger = require('../Logger') +const { levenshteinDistance } = require('../utils/index') class BookFinder { constructor() { diff --git a/server/finders/PodcastFinder.js b/server/finders/PodcastFinder.js new file mode 100644 index 00000000..8e3b5728 --- /dev/null +++ b/server/finders/PodcastFinder.js @@ -0,0 +1,25 @@ +const Logger = require('../Logger') +const iTunes = require('../providers/iTunes') + +class PodcastFinder { + constructor() { + this.iTunesApi = new iTunes() + } + + async search(term, options = {}) { + if (!term) return null + Logger.debug(`[iTunes] Searching for podcast with term "${term}"`) + + var searchOptions = { + term, + media: 'podcast', + entity: 'podcast', + ...options + } + + var results = await this.iTunesApi.search(searchOptions) + Logger.debug(`[iTunes] Podcast search for "${term}" returned ${results.length} results`) + return results + } +} +module.exports = PodcastFinder \ No newline at end of file diff --git a/server/providers/iTunes.js b/server/providers/iTunes.js new file mode 100644 index 00000000..c8f78b74 --- /dev/null +++ b/server/providers/iTunes.js @@ -0,0 +1,33 @@ +const axios = require('axios') +const Logger = require('../Logger') + +class iTunes { + constructor() { } + + // https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html + search(options) { + if (!options.term) { + Logger.error('[iTunes] Invalid search options - no term') + return [] + } + var query = { + term: options.term, + media: options.media, + entity: options.entity, + lang: options.lang, + 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 || [] + }).catch((error) => { + Logger.error(`[iTunes] search request error`, error) + return [] + }) + } +} +module.exports = iTunes \ No newline at end of file diff --git a/server/scanner/AuthorScanner.js b/server/scanner/AuthorScanner.js index 3c3be497..09ce2478 100644 --- a/server/scanner/AuthorScanner.js +++ b/server/scanner/AuthorScanner.js @@ -1,4 +1,4 @@ -const AuthorFinder = require('../AuthorFinder') +const AuthorFinder = require('../finders/AuthorFinder') class AuthorScanner { constructor(db) { diff --git a/server/scanner/Scanner.js b/server/scanner/Scanner.js index b1ebd556..142440e9 100644 --- a/server/scanner/Scanner.js +++ b/server/scanner/Scanner.js @@ -9,7 +9,7 @@ const { comparePaths, getId } = require('../utils/index') const { ScanResult, LogLevel } = require('../utils/constants') const AudioFileScanner = require('./AudioFileScanner') -const BookFinder = require('../BookFinder') +const BookFinder = require('../finders/BookFinder') const Audiobook = require('../objects/Audiobook') const LibraryScan = require('./LibraryScan') const ScanOptions = require('./ScanOptions')