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 |