mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const Database = require('../Database')
 | 
						|
const axios = require('axios')
 | 
						|
const Logger = require('../Logger')
 | 
						|
 | 
						|
class CustomProviderAdapter {
 | 
						|
    constructor() { }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @param {string} title 
 | 
						|
     * @param {string} author 
 | 
						|
     * @param {string} providerSlug 
 | 
						|
     * @param {string} mediaType
 | 
						|
     * @returns {Promise<Object[]>}
 | 
						|
     */
 | 
						|
    async search(title, author, providerSlug, mediaType) {
 | 
						|
        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")
 | 
						|
        }
 | 
						|
 | 
						|
        // Setup query params
 | 
						|
        const queryObj = {
 | 
						|
            mediaType,
 | 
						|
            query: title
 | 
						|
        }
 | 
						|
        if (author) {
 | 
						|
            queryObj.author = author
 | 
						|
        }
 | 
						|
        const queryString = (new URLSearchParams(queryObj)).toString()
 | 
						|
 | 
						|
        // Setup headers
 | 
						|
        const axiosOptions = {}
 | 
						|
        if (provider.authHeaderValue) {
 | 
						|
            axiosOptions.headers = {
 | 
						|
                'Authorization': provider.authHeaderValue
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        const matches = await axios.get(`${provider.url}/search?${queryString}}`, 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 |