mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-01-08 00:08:14 +01:00
Fix:Overdrive chapter parser crash server on invalid meta data #880
This commit is contained in:
parent
fddf850a41
commit
95ac74d748
@ -402,9 +402,12 @@ class Book {
|
|||||||
var includedAudioFiles = this.audioFiles.filter(af => !af.exclude)
|
var includedAudioFiles = this.audioFiles.filter(af => !af.exclude)
|
||||||
|
|
||||||
// If overdrive media markers are present and preferred, use those instead
|
// If overdrive media markers are present and preferred, use those instead
|
||||||
if (preferOverdriveMediaMarker && overdriveMediaMarkersExist(includedAudioFiles)) {
|
if (preferOverdriveMediaMarker) {
|
||||||
Logger.info('[Book] Overdrive Media Markers and preference found! Using these for chapter definitions')
|
var overdriveChapters = parseOverdriveMediaMarkersAsChapters(includedAudioFiles)
|
||||||
return this.chapters = parseOverdriveMediaMarkersAsChapters(includedAudioFiles)
|
if (overdriveChapters) {
|
||||||
|
Logger.info('[Book] Overdrive Media Markers and preference found! Using these for chapter definitions')
|
||||||
|
return this.chapters = overdriveChapters
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (includedAudioFiles.length === 1) {
|
if (includedAudioFiles.length === 1) {
|
||||||
|
@ -3,7 +3,7 @@ const Logger = require('../../Logger')
|
|||||||
// given a list of audio files, extract all of the Overdrive Media Markers metaTags, and return an array of them as XML
|
// given a list of audio files, extract all of the Overdrive Media Markers metaTags, and return an array of them as XML
|
||||||
function extractOverdriveMediaMarkers(includedAudioFiles) {
|
function extractOverdriveMediaMarkers(includedAudioFiles) {
|
||||||
Logger.debug('[parseOverdriveMediaMarkers] Extracting overdrive media markers')
|
Logger.debug('[parseOverdriveMediaMarkers] Extracting overdrive media markers')
|
||||||
var markers = includedAudioFiles.map((af) => af.metaTags.tagOverdriveMediaMarker).filter(notUndefined => notUndefined !== undefined).filter(elem => { return elem !== null }) || []
|
var markers = includedAudioFiles.map((af) => af.metaTags.tagOverdriveMediaMarker).filter(af => af) || []
|
||||||
|
|
||||||
return markers
|
return markers
|
||||||
}
|
}
|
||||||
@ -29,11 +29,11 @@ function cleanOverdriveMediaMarkers(overdriveMediaMarkers) {
|
|||||||
]
|
]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var parseString = require('xml2js').parseString; // function to convert xml to JSON
|
var parseString = require('xml2js').parseString // function to convert xml to JSON
|
||||||
var parsedOverdriveMediaMarkers = []
|
var parsedOverdriveMediaMarkers = []
|
||||||
|
|
||||||
overdriveMediaMarkers.forEach(function (item, index) {
|
overdriveMediaMarkers.forEach((item, index) => {
|
||||||
var parsed_result
|
var parsed_result = null
|
||||||
parseString(item, function (err, result) {
|
parseString(item, function (err, result) {
|
||||||
/*
|
/*
|
||||||
result.Markers.Marker is the result of parsing the XML for the MediaMarker tags for the MP3 file (Part##.mp3)
|
result.Markers.Marker is the result of parsing the XML for the MediaMarker tags for the MP3 file (Part##.mp3)
|
||||||
@ -54,10 +54,14 @@ function cleanOverdriveMediaMarkers(overdriveMediaMarkers) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// The values for Name and Time in results.Markers.Marker are returned as Arrays from parseString and should be strings
|
// The values for Name and Time in results.Markers.Marker are returned as Arrays from parseString and should be strings
|
||||||
parsed_result = objectValuesArrayToString(result.Markers.Marker)
|
if (result && result.Markers && result.Markers.Marker) {
|
||||||
|
parsed_result = objectValuesArrayToString(result.Markers.Marker)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
parsedOverdriveMediaMarkers.push(parsed_result)
|
if (parsed_result) {
|
||||||
|
parsedOverdriveMediaMarkers.push(parsed_result)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return removeExtraChapters(parsedOverdriveMediaMarkers)
|
return removeExtraChapters(parsedOverdriveMediaMarkers)
|
||||||
@ -114,6 +118,7 @@ function generateParsedChapters(includedAudioFiles, cleanedOverdriveMediaMarkers
|
|||||||
|
|
||||||
// cleanedOverdriveMediaMarkers is an array of array of objects, where the inner array matches to the included audio files tracks
|
// cleanedOverdriveMediaMarkers is an array of array of objects, where the inner array matches to the included audio files tracks
|
||||||
// this allows us to leverage the individual track durations when calculating the start times of chapters in tracks after the first (using length)
|
// this allows us to leverage the individual track durations when calculating the start times of chapters in tracks after the first (using length)
|
||||||
|
// TODO: can we guarantee the inner array matches the included audio files?
|
||||||
includedAudioFiles.forEach((track, track_index) => {
|
includedAudioFiles.forEach((track, track_index) => {
|
||||||
cleanedOverdriveMediaMarkers[track_index].forEach((chapter) => {
|
cleanedOverdriveMediaMarkers[track_index].forEach((chapter) => {
|
||||||
time = chapter.Time.split(":")
|
time = chapter.Time.split(":")
|
||||||
@ -141,7 +146,13 @@ module.exports.parseOverdriveMediaMarkersAsChapters = (includedAudioFiles) => {
|
|||||||
Logger.info('[parseOverdriveMediaMarkers] Parsing of Overdrive Media Markers started')
|
Logger.info('[parseOverdriveMediaMarkers] Parsing of Overdrive Media Markers started')
|
||||||
|
|
||||||
var overdriveMediaMarkers = extractOverdriveMediaMarkers(includedAudioFiles)
|
var overdriveMediaMarkers = extractOverdriveMediaMarkers(includedAudioFiles)
|
||||||
|
if (!overdriveMediaMarkers.length) return null
|
||||||
|
|
||||||
var cleanedOverdriveMediaMarkers = cleanOverdriveMediaMarkers(overdriveMediaMarkers)
|
var cleanedOverdriveMediaMarkers = cleanOverdriveMediaMarkers(overdriveMediaMarkers)
|
||||||
|
// TODO: generateParsedChapters requires overdrive media markers and included audio files length to be the same
|
||||||
|
// so if not equal then we must exit
|
||||||
|
if (cleanedOverdriveMediaMarkers.length !== includedAudioFiles.length) return null
|
||||||
|
|
||||||
var parsedChapters = generateParsedChapters(includedAudioFiles, cleanedOverdriveMediaMarkers)
|
var parsedChapters = generateParsedChapters(includedAudioFiles, cleanedOverdriveMediaMarkers)
|
||||||
|
|
||||||
return parsedChapters
|
return parsedChapters
|
||||||
|
Loading…
Reference in New Issue
Block a user