diff --git a/server/managers/PodcastManager.js b/server/managers/PodcastManager.js index a959ba9a..1b6617ac 100644 --- a/server/managers/PodcastManager.js +++ b/server/managers/PodcastManager.js @@ -121,17 +121,28 @@ class PodcastManager { await fs.mkdir(this.currentDownload.libraryItem.path) } - // Download episode and tag it - const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { - Logger.error(`[PodcastManager] Podcast Episode download failed`, error) - }) - let success = !!ffmpegDownloadResponse?.success + let success = false + if (this.currentDownload.isMp3) { + // Download episode and tag it + const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { + Logger.error(`[PodcastManager] Podcast Episode download failed`, error) + }) + success = !!ffmpegDownloadResponse?.success - // If failed due to ffmpeg error, retry without tagging - // e.g. RSS feed may have incorrect file extension and file type - // See https://github.com/advplyr/audiobookshelf/issues/3837 - if (!success && ffmpegDownloadResponse?.isFfmpegError) { - Logger.info(`[PodcastManager] Retrying episode download without tagging`) + // If failed due to ffmpeg error, retry without tagging + // e.g. RSS feed may have incorrect file extension and file type + // See https://github.com/advplyr/audiobookshelf/issues/3837 + if (!success && ffmpegDownloadResponse?.isFfmpegError) { + Logger.info(`[PodcastManager] Retrying episode download without tagging`) + // Download episode only + success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) + .then(() => true) + .catch((error) => { + Logger.error(`[PodcastManager] Podcast Episode download failed`, error) + return false + }) + } + } else { // Download episode only success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) .then(() => true) diff --git a/server/objects/PodcastEpisodeDownload.js b/server/objects/PodcastEpisodeDownload.js index cce9f66f..3c1d82ac 100644 --- a/server/objects/PodcastEpisodeDownload.js +++ b/server/objects/PodcastEpisodeDownload.js @@ -63,6 +63,16 @@ class PodcastEpisodeDownload { const enclosureType = this.rssPodcastEpisode.enclosure.type return typeof enclosureType === 'string' ? enclosureType : null } + /** + * RSS feed may have an episode with file extension of mp3 but the specified enclosure type is not mpeg. + * @see https://github.com/advplyr/audiobookshelf/issues/3711 + * + * @returns {boolean} + */ + get isMp3() { + if (this.enclosureType && !this.enclosureType.includes('mpeg')) return false + return this.fileExtension === 'mp3' + } get episodeTitle() { return this.rssPodcastEpisode.title }