mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const axios = require('axios').default
 | 
						|
const Database = require('../Database')
 | 
						|
const Logger = require('../Logger')
 | 
						|
 | 
						|
class CustomProviderAdapter {
 | 
						|
  #responseTimeout = 30000
 | 
						|
 | 
						|
  constructor() {}
 | 
						|
 | 
						|
  /**
 | 
						|
   *
 | 
						|
   * @param {string} title
 | 
						|
   * @param {string} author
 | 
						|
   * @param {string} isbn
 | 
						|
   * @param {string} providerSlug
 | 
						|
   * @param {string} mediaType
 | 
						|
   * @param {number} [timeout] response timeout in ms
 | 
						|
   * @returns {Promise<Object[]>}
 | 
						|
   */
 | 
						|
  async search(title, author, isbn, providerSlug, mediaType, timeout = this.#responseTimeout) {
 | 
						|
    if (!timeout || isNaN(timeout)) timeout = this.#responseTimeout
 | 
						|
 | 
						|
    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
 | 
						|
    }
 | 
						|
    if (isbn) {
 | 
						|
      queryObj.isbn = isbn
 | 
						|
    }
 | 
						|
    const queryString = new URLSearchParams(queryObj).toString()
 | 
						|
 | 
						|
    // Setup headers
 | 
						|
    const axiosOptions = {
 | 
						|
      timeout
 | 
						|
    }
 | 
						|
    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
 |