const { parseOpfMetadataXML } = require('../utils/parsers/parseOpfMetadata') const { readTextFile } = require('../utils/fileUtils') class OpfFileScanner { constructor() { } /** * Parse metadata from .opf file found in library scan and update bookMetadata * * @param {import('../models/LibraryItem').LibraryFileObject} opfLibraryFileObj * @param {Object} bookMetadata */ async scanBookOpfFile(opfLibraryFileObj, bookMetadata) { const xmlText = await readTextFile(opfLibraryFileObj.metadata.path) const opfMetadata = xmlText ? await parseOpfMetadataXML(xmlText) : null if (opfMetadata) { for (const key in opfMetadata) { if (key === 'tags') { // Add tags only if tags are empty if (opfMetadata.tags.length) { bookMetadata.tags = opfMetadata.tags } } else if (key === 'genres') { // Add genres only if genres are empty if (opfMetadata.genres.length) { bookMetadata.genres = opfMetadata.genres } } else if (key === 'authors') { if (opfMetadata.authors?.length) { bookMetadata.authors = opfMetadata.authors } } else if (key === 'narrators') { if (opfMetadata.narrators?.length) { bookMetadata.narrators = opfMetadata.narrators } } else if (key === 'series') { if (opfMetadata.series) { bookMetadata.series = [{ name: opfMetadata.series, sequence: opfMetadata.sequence || null }] } } else if (opfMetadata[key] && key !== 'sequence') { bookMetadata[key] = opfMetadata[key] } } } } } module.exports = new OpfFileScanner()