const Database = require('../Database') const axios = require('axios') const Logger = require('../Logger') class CustomProviderAdapter { constructor() { } /** * * @param {string} title * @param {string} author * @param {string} providerSlug * @returns {Promise} */ async search(title, author, providerSlug) { const providerId = providerSlug.split('custom-')[1] const provider = await Database.customMetadataProviderModel.findByPk(providerId) if (!provider) { throw new Error("Custom provider not found for the given id") } const axiosOptions = {} if (provider.authHeaderValue) { axiosOptions.headers = { 'Authorization': provider.authHeaderValue } } const matches = await axios.get(`${provider.url}/search?query=${encodeURIComponent(title)}${!!author ? `&author=${encodeURIComponent(author)}` : ""}`, axiosOptions).then((res) => { if (!res?.data || !Array.isArray(res.data.matches)) return null return res.data.matches }).catch(error => { Logger.error('[CustomMetadataProvider] Search error', error) return [] }) if (!matches) { throw new Error("Custom provider returned malformed response") } // re-map keys to throw out return matches.map(({ title, subtitle, author, narrator, publisher, publishedYear, description, cover, isbn, asin, genres, tags, series, language, duration }) => { return { title, subtitle, author, narrator, publisher, publishedYear, description, cover, isbn, asin, genres, tags: tags?.join(',') || null, series: series?.length ? series : null, language, duration } }) } } module.exports = CustomProviderAdapter