diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 1650d566..dbe35425 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -179,7 +179,7 @@ class LibraryController { series = series.slice(startIndex, startIndex + payload.limit) } - payload.results = series + payload.results = sort(series).asc(s => s.name) res.json(payload) } @@ -194,7 +194,7 @@ class LibraryController { return res.status(404).send('Series not found') } audiobooks = sort(audiobooks).asc(ab => { - return ab.book.volumeNumber + return Number(ab.book.volumeNumber) }) res.json({ results: audiobooks.map(ab => ab.toJSONExpanded()), diff --git a/server/utils/parseOpfMetadata.js b/server/utils/parseOpfMetadata.js index 68ed4cd2..83f3e3cb 100644 --- a/server/utils/parseOpfMetadata.js +++ b/server/utils/parseOpfMetadata.js @@ -1,4 +1,5 @@ const { xmlToJSON } = require('./index') +const { stripHtml } = require("string-strip-html") function parseCreators(metadata) { if (!metadata['dc:creator']) return null @@ -56,7 +57,7 @@ function fetchDescription(metadata) { // check if description is HTML or plain text. only plain text allowed // calibre stores < and > as < and > description = description.replace(/</g, '<').replace(/>/g, '>') - if (description.match(/|<\/?\s*[a-z-][^>]*\s*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);)/)) return null + if (description.match(/|<\/?\s*[a-z-][^>]*\s*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);)/)) return stripHtml(description).result return description } @@ -69,6 +70,16 @@ function fetchLanguage(metadata) { return fetchTagString(metadata, 'dc:language') } +function fetchSeries(metadata) { + if(typeof metadata.meta == "undefined") return null + return fetchTagString(metadata.meta, "calibre:series") +} + +function fetchVolumeNumber(metadata) { + if(typeof metadata.meta == "undefined") return null + return fetchTagString(metadata.meta, "calibre:series_index") +} + module.exports.parseOpfMetadataXML = async (xml) => { var json = await xmlToJSON(xml) if (!json || !json.package || !json.package.metadata) return null @@ -79,6 +90,13 @@ module.exports.parseOpfMetadataXML = async (xml) => { metadata = metadata[0] } + if (typeof metadata.meta != "undefined") { + metadata.meta = {} + for(var match of xml.matchAll(//g)) { + metadata.meta[match.groups['name']] = [match.groups['content']] + } + } + var creators = parseCreators(metadata) var data = { title: fetchTitle(metadata), @@ -89,7 +107,9 @@ module.exports.parseOpfMetadataXML = async (xml) => { isbn: fetchISBN(metadata), description: fetchDescription(metadata), genres: fetchGenres(metadata), - language: fetchLanguage(metadata) + language: fetchLanguage(metadata), + series: fetchSeries(metadata), + volumeNumber: fetchVolumeNumber(metadata) } return data } \ No newline at end of file