Add validation for custom metadata provider responses

This commit is contained in:
advplyr 2025-03-04 17:50:40 -06:00
parent a296ac6132
commit b17e6010fd

View File

@ -69,25 +69,57 @@ class CustomProviderAdapter {
throw new Error('Custom provider returned malformed response') throw new Error('Custom provider returned malformed response')
} }
const toStringOrUndefined = (value) => {
if (typeof value === 'string' || typeof value === 'number') return String(value)
if (Array.isArray(value) && value.every((v) => typeof v === 'string' || typeof v === 'number')) return value.join(',')
return undefined
}
const validateSeriesArray = (series) => {
if (!Array.isArray(series) || !series.length) return undefined
return series
.map((s) => {
if (!s?.series || typeof s.series !== 'string') return undefined
const _series = {
series: s.series
}
if (s.sequence && (typeof s.sequence === 'string' || typeof s.sequence === 'number')) {
_series.sequence = String(s.sequence)
}
return _series
})
.filter((s) => s !== undefined)
}
// re-map keys to throw out // 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 matches.map((match) => {
return { const { title, subtitle, author, narrator, publisher, publishedYear, description, cover, isbn, asin, genres, tags, series, language, duration } = match
title,
subtitle, const payload = {
author, title: toStringOrUndefined(title),
narrator, subtitle: toStringOrUndefined(subtitle),
publisher, author: toStringOrUndefined(author),
publishedYear, narrator: toStringOrUndefined(narrator),
description: typeof description === 'string' ? htmlSanitizer.sanitize(description) : description, publisher: toStringOrUndefined(publisher),
cover, publishedYear: toStringOrUndefined(publishedYear),
isbn, description: description && typeof description === 'string' ? htmlSanitizer.sanitize(description) : undefined,
asin, cover: toStringOrUndefined(cover),
genres, isbn: toStringOrUndefined(isbn),
tags: tags?.join(',') || null, asin: toStringOrUndefined(asin),
series: series?.length ? series : null, genres: Array.isArray(genres) && genres.every((g) => typeof g === 'string') ? genres : undefined,
language, tags: toStringOrUndefined(tags),
duration series: validateSeriesArray(series),
language: toStringOrUndefined(language),
duration: !isNaN(duration) && duration !== null ? Number(duration) : undefined
} }
// Remove undefined values
for (const key in payload) {
if (payload[key] === undefined) {
delete payload[key]
}
}
return payload
}) })
} }
} }