diff --git a/server/objects/Download.js b/server/objects/Download.js index 542e0ef7..5baa3367 100644 --- a/server/objects/Download.js +++ b/server/objects/Download.js @@ -1,5 +1,8 @@ +const { AudioMimeType } = require('../utils/constants') +const { getAudioMimeTypeFromExtname } = require('../utils/fileUtils') const DEFAULT_EXPIRATION = 1000 * 60 * 60 // 60 minutes const DEFAULT_TIMEOUT = 1000 * 60 * 30 // 30 minutes + class Download { constructor(download) { this.id = null @@ -32,16 +35,7 @@ class Download { } get mimeType() { - if (this.ext === '.mp3' || this.ext === '.m4b' || this.ext === '.m4a') { - return 'audio/mpeg' - } else if (this.ext === '.mp4') { - return 'audio/mp4' - } else if (this.ext === '.ogg') { - return 'audio/ogg' - } else if (this.ext === '.aac' || this.ext === '.m4p') { - return 'audio/aac' - } - return 'audio/mpeg' + return getAudioMimeTypeFromExtname(this.ext) || AudioMimeType.MP3 } toJSON() { diff --git a/server/objects/files/AudioFile.js b/server/objects/files/AudioFile.js index 35cb61b0..683834ec 100644 --- a/server/objects/files/AudioFile.js +++ b/server/objects/files/AudioFile.js @@ -1,4 +1,3 @@ -const { isNullOrNaN } = require('../../utils/index') const { AudioMimeType } = require('../../utils/constants') const AudioMetaTags = require('../metadata/AudioMetaTags') const FileMetadata = require('../metadata/FileMetadata') diff --git a/server/routers/StaticRouter.js b/server/routers/StaticRouter.js index 24b6f6da..dcfc8d32 100644 --- a/server/routers/StaticRouter.js +++ b/server/routers/StaticRouter.js @@ -1,6 +1,6 @@ const express = require('express') const Path = require('path') -const Logger = require('../Logger') +const { getAudioMimeTypeFromExtname } = require('../utils/fileUtils') class StaticRouter { constructor(db) { @@ -20,7 +20,16 @@ class StaticRouter { var fullPath = null if (item.isFile) fullPath = item.path else fullPath = Path.join(item.path, remainingPath) - res.sendFile(fullPath) + + var opts = {} + + // Express does not set the correct mimetype for m4b files so use our defined mimetypes if available + const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(fullPath)) + if (audioMimeType) { + opts = { headers: { 'Content-Type': audioMimeType } } + } + + res.sendFile(fullPath, opts) }) } } diff --git a/server/utils/fileUtils.js b/server/utils/fileUtils.js index 0648bd03..f487a209 100644 --- a/server/utils/fileUtils.js +++ b/server/utils/fileUtils.js @@ -3,6 +3,7 @@ const rra = require('../libs/recursiveReaddirAsync') const axios = require('axios') const Path = require('path') const Logger = require('../Logger') +const { AudioMimeType } = require('./constants') async function getFileStat(path) { try { @@ -211,3 +212,11 @@ module.exports.sanitizeFilename = (filename, colonReplacement = ' - ') => { return sanitized } + +// Returns null if extname is not in our defined list of audio extnames +module.exports.getAudioMimeTypeFromExtname = (extname) => { + if (!extname || !extname.length) return null + const formatUpper = extname.slice(1).toUpperCase() + if (AudioMimeType[formatUpper]) return AudioMimeType[formatUpper] + return null +} \ No newline at end of file