diff --git a/client/package.json b/client/package.json index 0ac4b610..893ca5e8 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "1.6.34", + "version": "1.6.35", "description": "Audiobook manager and player", "main": "index.js", "scripts": { diff --git a/package.json b/package.json index b416a624..cc64777c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "1.6.34", + "version": "1.6.35", "description": "Self-hosted audiobook server for managing and playing audiobooks", "main": "index.js", "scripts": { diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 8e505a2c..9699e202 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -173,7 +173,7 @@ class LibraryController { series = series.slice(startIndex, startIndex + payload.limit) } - payload.results = series + payload.results = sort(series).asc(s => s.name) res.json(payload) } 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