From 7f5a6fc9175e454f4bcd1e2b6e08f202752e0e33 Mon Sep 17 00:00:00 2001 From: Greg Lorenzen Date: Tue, 10 Dec 2024 02:02:28 +0000 Subject: [PATCH] Remove download logic from LibraryItemController --- server/controllers/LibraryItemController.js | 60 ++++++++------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/server/controllers/LibraryItemController.js b/server/controllers/LibraryItemController.js index fb5f32b6e..5aaacee0d 100644 --- a/server/controllers/LibraryItemController.js +++ b/server/controllers/LibraryItemController.js @@ -157,49 +157,33 @@ class LibraryItemController { * @param {Response} res */ async download(req, res) { - const handleDownload = async (req, res) => { - const libraryItemPath = req.libraryItem.path - const itemTitle = req.libraryItem.media.metadata.title - - Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${itemTitle}" at "${libraryItemPath}"`) - - try { - // If library item is a single file in root dir then no need to zip - if (req.libraryItem.isFile) { - // Express does not set the correct mimetype for m4b files so use our defined mimetypes if available - const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(libraryItemPath)) - if (audioMimeType) { - res.setHeader('Content-Type', audioMimeType) - } - await new Promise((resolve, reject) => res.download(libraryItemPath, req.libraryItem.relPath, (error) => (error ? reject(error) : resolve()))) - } else { - const filename = `${itemTitle}.zip` - await zipHelpers.zipDirectoryPipe(libraryItemPath, filename, res) - } - Logger.info(`[LibraryItemController] Downloaded item "${itemTitle}" at "${libraryItemPath}"`) - } catch (error) { - Logger.error(`[LibraryItemController] Download failed for item "${itemTitle}" at "${libraryItemPath}"`, error) - res.status(500).send('Failed to download the item') - } - } - - if (req.query.share) { - // Find matching MediaItemShare based on slug - const mediaItemShare = await ShareManager.findBySlug(req.query.share) - if (mediaItemShare) { - // If the isDownloadable bool is true, download the file - if (mediaItemShare.isDownloadable) { - return handleDownload(req, res) - } - } - } - if (!req.user.canDownload) { Logger.warn(`User "${req.user.username}" attempted to download without permission`) return res.sendStatus(403) } + const libraryItemPath = req.libraryItem.path + const itemTitle = req.libraryItem.media.metadata.title - return handleDownload(req, res) + Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${itemTitle}" at "${libraryItemPath}"`) + + try { + // If library item is a single file in root dir then no need to zip + if (req.libraryItem.isFile) { + // Express does not set the correct mimetype for m4b files so use our defined mimetypes if available + const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(libraryItemPath)) + if (audioMimeType) { + res.setHeader('Content-Type', audioMimeType) + } + await new Promise((resolve, reject) => res.download(libraryItemPath, req.libraryItem.relPath, (error) => (error ? reject(error) : resolve()))) + } else { + const filename = `${itemTitle}.zip` + await zipHelpers.zipDirectoryPipe(libraryItemPath, filename, res) + } + Logger.info(`[LibraryItemController] Downloaded item "${itemTitle}" at "${libraryItemPath}"`) + } catch (error) { + Logger.error(`[LibraryItemController] Download failed for item "${itemTitle}" at "${libraryItemPath}"`, error) + LibraryItemController.handleDownloadError(error, res) + } } /**