Cleaning up server code

Doing some literal cleaning
This commit is contained in:
jmt-gh 2022-06-12 01:38:09 -07:00
parent f31700f668
commit 8754f0c25f
2 changed files with 136 additions and 127 deletions

View File

@ -3,7 +3,7 @@ const Logger = require('../../Logger')
const BookMetadata = require('../metadata/BookMetadata') const BookMetadata = require('../metadata/BookMetadata')
const { areEquivalent, copyValue } = require('../../utils/index') const { areEquivalent, copyValue } = require('../../utils/index')
const { parseOpfMetadataXML } = require('../../utils/parsers/parseOpfMetadata') const { parseOpfMetadataXML } = require('../../utils/parsers/parseOpfMetadata')
const { getOverdriveMediaMarkersFromFiles, parseOverdriveMediaMarkers } = require('../../utils/parsers/parseOverdriveMediaMarkers') const { overdriveMediaMarkersExist, parseOverdriveMediaMarkersAsChapters } = require('../../utils/parsers/parseOverdriveMediaMarkers')
const abmetadataGenerator = require('../../utils/abmetadataGenerator') const abmetadataGenerator = require('../../utils/abmetadataGenerator')
const { readTextFile } = require('../../utils/fileUtils') const { readTextFile } = require('../../utils/fileUtils')
const AudioFile = require('../files/AudioFile') const AudioFile = require('../files/AudioFile')
@ -403,14 +403,12 @@ class Book {
// If 1 audio file without chapters, then no chapters will be set // If 1 audio file without chapters, then no chapters will be set
var includedAudioFiles = this.audioFiles.filter(af => !af.exclude) var includedAudioFiles = this.audioFiles.filter(af => !af.exclude)
var overdriveMediaMarkers = getOverdriveMediaMarkersFromFiles(includedAudioFiles) // If overdrive media markers are present and preferred, use those instead
if (preferOverdriveMediaMarker && overdriveMediaMarkersExist(includedAudioFiles)) {
Logger.info('[Book] Overdrive Media Markers and preference found! Using these for chapter definitions')
return this.chapters = parseOverdriveMediaMarkersAsChapters(includedAudioFiles)
}
// If preferOverdriveMediaMarker is set, try and use that first
// fallback to non-overdrive chapters if there are no Overdrive Media Markers available
if (preferOverdriveMediaMarker && (overdriveMediaMarkers.length > 0)) {
Logger.debug(`[Book] preferring overdrive media markers! Lets generate em.`)
this.chapters = parseOverdriveMediaMarkers(overdriveMediaMarkers, includedAudioFiles)
} else {
if (includedAudioFiles.length === 1) { if (includedAudioFiles.length === 1) {
// 1 audio file with chapters // 1 audio file with chapters
if (includedAudioFiles[0].chapters) { if (includedAudioFiles[0].chapters) {
@ -461,7 +459,6 @@ class Book {
}) })
} }
} }
}
// Only checks container format // Only checks container format
checkCanDirectPlay(payload) { checkCanDirectPlay(payload) {

View File

@ -1,16 +1,30 @@
const Logger = require('../../Logger') const Logger = require('../../Logger')
// given an array of audioFiles, return an array of unparsed MediaMarkers // given a list of audio files, extract all of the Overdrive Media Markers metaTags, and return an array of them as XML
module.exports.getOverdriveMediaMarkersFromFiles = (audioFiles) => { function overdriveMediaMarkers(includedAudioFiles) {
var markers = audioFiles.map((af) => af.metaTags.tagOverdriveMediaMarker).filter(notUndefined => notUndefined !== undefined).filter(elem => { return elem !== null }) || [] var markers = includedAudioFiles.map((af) => af.metaTags.tagOverdriveMediaMarker).filter(notUndefined => notUndefined !== undefined).filter(elem => { return elem !== null }) || []
return markers return markers
} }
module.exports.parseOverdriveMediaMarkers = (overdriveMediaMarkers, includedAudioFiles) => { // given the array of Overdrive Media Markers from generateOverdriveMediaMarkers()
// parse and clean them in to something a bit more usable
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 = [] // an array of objects. each object being a chapter with a name and time key. the values are arrays of strings // go from an array of arrays of objects to an array of objects
// end result looks like:
// [
// {
// "Name": "Chapter 1",
// "Time": "0:00.000"
// },
// {
// "Name": "Chapter 2",
// "Time": "15:51.000"
// },
// { redacted }
// ]
overdriveMediaMarkers.forEach(function (item, index) { overdriveMediaMarkers.forEach(function (item, index) {
var parsed_result var parsed_result
parseString(item, function (err, result) { parseString(item, function (err, result) {
@ -49,42 +63,29 @@ module.exports.parseOverdriveMediaMarkers = (overdriveMediaMarkers, includedAudi
parsedOverdriveMediaMarkers.push(parsed_result) parsedOverdriveMediaMarkers.push(parsed_result)
}) })
// go from an array of arrays of objects to an array of objects return parsedOverdriveMediaMarkers
// end result looks like: }
// [
// {
// "Name": "Chapter 1",
// "Time": "0:00.000"
// },
// {
// "Name": "Chapter 2",
// "Time": "15:51.000"
// },
// { redacted }
// ]
parsedOverdriveMediaMarkers = parsedOverdriveMediaMarkers
var index = 0
var time = 0.0
// The function that actually generates the Chapters object that we update ABS with
function generateParsedChapters(includedAudioFiles, cleanedOverdriveMediaMarkers) {
// actually generate the chapter object // actually generate the chapter object
// logic ported over from benonymity's OverdriveChapterizer: // logic ported over from benonymity's OverdriveChapterizer:
// https://github.com/benonymity/OverdriveChapterizer/blob/main/chapters.py // https://github.com/benonymity/OverdriveChapterizer/blob/main/chapters.py
var length = 0.0 var length = 0.0
var newOChapters = [] var index = 0
var time = 0.0
var newChapters = []
const weirdChapterFilterRegex = /([(]\d|[cC]ontinued)/ const weirdChapterFilterRegex = /([(]\d|[cC]ontinued)/
includedAudioFiles.forEach((track, track_index) => { includedAudioFiles.forEach((track, track_index) => {
parsedOverdriveMediaMarkers[track_index].forEach((chapter) => { cleanedOverdriveMediaMarkers[track_index].forEach((chapter) => {
Logger.debug(`[parseOverdriveMediaMarkers] Attempting regex check for ${chapter.Name}!`) Logger.debug(`[parseOverdriveMediaMarkers] Attempting regex check for ${chapter.Name}...`)
if (weirdChapterFilterRegex.test(chapter.Name)) { if (weirdChapterFilterRegex.test(chapter.Name)) {
Logger.debug(`[parseOverdriveMediaMarkers] That shit weird yo`) Logger.debug(`[parseOverdriveMediaMarkers] Regex matched. Skipping ${chapter.Name}!`)
return return
} }
time = chapter.Time.split(":") time = chapter.Time.split(":")
time = length + parseFloat(time[0]) * 60 + parseFloat(time[1]) time = length + parseFloat(time[0]) * 60 + parseFloat(time[1])
newOChapters.push( newChapters.push(
{ {
id: index++, id: index++,
start: time, start: time,
@ -96,6 +97,17 @@ module.exports.parseOverdriveMediaMarkers = (overdriveMediaMarkers, includedAudi
length += track.duration length += track.duration
}) })
Logger.debug(`[parseOverdriveMediaMarkers] newOChapters: ${JSON.stringify(newOChapters)}`) return newChapters
return newOChapters }
module.exports.overdriveMediaMarkersExist = (includedAudioFiles) => {
return overdriveMediaMarkers(includedAudioFiles).length > 1
}
module.exports.parseOverdriveMediaMarkersAsChapters = (includedAudioFiles) => {
Logger.info('[parseOverdriveMediaMarkers] Parsing of Overdrive Media Markers started')
var cleanedOverdriveMediaMarkers = cleanOverdriveMediaMarkers(overdriveMediaMarkers(includedAudioFiles))
var parsedChapters = generateParsedChapters(includedAudioFiles, cleanedOverdriveMediaMarkers)
return parsedChapters
} }