mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-01-08 00:08:14 +01:00
78 lines
2.3 KiB
JavaScript
78 lines
2.3 KiB
JavaScript
const { xmlToJSON } = require('./index')
|
|
|
|
function parseCreators(metadata) {
|
|
if (!metadata['dc:creator']) return null
|
|
var creators = metadata['dc:creator']
|
|
if (!creators.length) return null
|
|
return creators.map(c => {
|
|
if (typeof c !== 'object' || !c['$'] || !c['_']) return false
|
|
return {
|
|
value: c['_'],
|
|
role: c['$']['opf:role'] || null,
|
|
fileAs: c['$']['opf:file-as'] || null
|
|
}
|
|
})
|
|
}
|
|
|
|
function fetchCreator(creators, role) {
|
|
if (!creators || !creators.length) return null
|
|
var creator = creators.find(c => c.role === role)
|
|
return creator ? creator.value : null
|
|
}
|
|
|
|
function fetchDate(metadata) {
|
|
if (!metadata['dc:date']) return null
|
|
var dates = metadata['dc:date']
|
|
if (!dates.length || typeof dates[0] !== 'string') return null
|
|
var dateSplit = dates[0].split('-')
|
|
if (!dateSplit.length || dateSplit[0].length !== 4 || isNaN(dateSplit[0])) return null
|
|
return dateSplit[0]
|
|
}
|
|
|
|
function fetchPublisher(metadata) {
|
|
if (!metadata['dc:publisher']) return null
|
|
var publishers = metadata['dc:publisher']
|
|
if (!publishers.length || typeof publishers[0] !== 'string') return null
|
|
return publishers[0]
|
|
}
|
|
|
|
function fetchISBN(metadata) {
|
|
if (!metadata['dc:identifier'] || !metadata['dc:identifier'].length) return null
|
|
var identifiers = metadata['dc:identifier']
|
|
var isbnObj = identifiers.find(i => i['$'] && i['$']['opf:scheme'] === 'ISBN')
|
|
return isbnObj ? isbnObj['_'] || null : null
|
|
}
|
|
|
|
function fetchTitle(metadata) {
|
|
if (!metadata['dc:title']) return null
|
|
var titles = metadata['dc:title']
|
|
if (!titles.length) return null
|
|
if (typeof titles[0] === 'string') {
|
|
return titles[0]
|
|
}
|
|
if (titles[0]['_']) {
|
|
return titles[0]['_']
|
|
}
|
|
return null
|
|
}
|
|
|
|
module.exports.parseOpfMetadataXML = async (xml) => {
|
|
var json = await xmlToJSON(xml)
|
|
if (!json || !json.package || !json.package.metadata) return null
|
|
var metadata = json.package.metadata
|
|
if (Array.isArray(metadata)) {
|
|
if (!metadata.length) return null
|
|
metadata = metadata[0]
|
|
}
|
|
|
|
var creators = parseCreators(metadata)
|
|
var data = {
|
|
title: fetchTitle(metadata),
|
|
author: fetchCreator(creators, 'aut'),
|
|
narrator: fetchCreator(creators, 'nrt'),
|
|
publishYear: fetchDate(metadata),
|
|
publisher: fetchPublisher(metadata),
|
|
isbn: fetchISBN(metadata)
|
|
}
|
|
return data
|
|
} |