mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-12-24 19:11:44 +01:00
b47ce4fb24
The API for Google Books will return HTTP image URLs when matiching any books using it as a search provider. In a secure environment, this causes browser warnings. All Google image links support HTTPS and we can safely switch to HTTOS to avoid these warnings.
61 lines
2.0 KiB
JavaScript
61 lines
2.0 KiB
JavaScript
const axios = require('axios')
|
|
const Logger = require('../Logger')
|
|
|
|
class GoogleBooks {
|
|
constructor() { }
|
|
|
|
extractIsbn(industryIdentifiers) {
|
|
if (!industryIdentifiers || !industryIdentifiers.length) return null
|
|
|
|
var isbnObj = industryIdentifiers.find(i => i.type === 'ISBN_13') || industryIdentifiers.find(i => i.type === 'ISBN_10')
|
|
if (isbnObj && isbnObj.identifier) return isbnObj.identifier
|
|
return null
|
|
}
|
|
|
|
cleanResult(item) {
|
|
var { id, volumeInfo } = item
|
|
if (!volumeInfo) return null
|
|
const { title, subtitle, authors, publisher, publisherDate, description, industryIdentifiers, categories, imageLinks } = volumeInfo
|
|
|
|
let cover = null
|
|
// Selects the largest cover assuming the largest is the last key in the object
|
|
if (imageLinks && Object.keys(imageLinks).length) {
|
|
cover = imageLinks[Object.keys(imageLinks).pop()]
|
|
cover = cover?.replace(/^http:/, 'https:') || null
|
|
}
|
|
|
|
return {
|
|
id,
|
|
title,
|
|
subtitle: subtitle || null,
|
|
author: authors ? authors.join(', ') : null,
|
|
publisher,
|
|
publishedYear: publisherDate ? publisherDate.split('-')[0] : null,
|
|
description,
|
|
cover,
|
|
genres: categories && Array.isArray(categories) ? [...categories] : null,
|
|
isbn: this.extractIsbn(industryIdentifiers)
|
|
}
|
|
}
|
|
|
|
async search(title, author) {
|
|
title = encodeURIComponent(title)
|
|
var queryString = `q=intitle:${title}`
|
|
if (author) {
|
|
author = encodeURIComponent(author)
|
|
queryString += `+inauthor:${author}`
|
|
}
|
|
var url = `https://www.googleapis.com/books/v1/volumes?${queryString}`
|
|
Logger.debug(`[GoogleBooks] Search url: ${url}`)
|
|
var items = await axios.get(url).then((res) => {
|
|
if (!res || !res.data || !res.data.items) return []
|
|
return res.data.items
|
|
}).catch(error => {
|
|
Logger.error('[GoogleBooks] Volume search error', error)
|
|
return []
|
|
})
|
|
return items.map(item => this.cleanResult(item))
|
|
}
|
|
}
|
|
|
|
module.exports = GoogleBooks |