Update podcast downloads to fallback to download without tagging due to inaccurate rss feed enclosures #3837

This commit is contained in:
advplyr 2025-01-14 15:48:06 -06:00
parent 9b5bdc1fdb
commit 1a67f57551
2 changed files with 29 additions and 6 deletions

View File

@ -115,10 +115,24 @@ class PodcastManager {
let success = false let success = false
if (this.currentDownload.isMp3) { if (this.currentDownload.isMp3) {
// Download episode and tag it // Download episode and tag it
success = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => {
Logger.error(`[PodcastManager] Podcast Episode download failed`, error) Logger.error(`[PodcastManager] Podcast Episode download failed`, error)
return false
}) })
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`)
// 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 { } else {
// Download episode only // Download episode only
success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath)

View File

@ -99,7 +99,7 @@ module.exports.resizeImage = resizeImage
/** /**
* *
* @param {import('../objects/PodcastEpisodeDownload')} podcastEpisodeDownload * @param {import('../objects/PodcastEpisodeDownload')} podcastEpisodeDownload
* @returns * @returns {Promise<{success: boolean, isFfmpegError?: boolean}>}
*/ */
module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => { module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
@ -115,7 +115,11 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
Logger.error(`[ffmpegHelpers] Failed to download podcast episode with url "${podcastEpisodeDownload.url}"`, error) Logger.error(`[ffmpegHelpers] Failed to download podcast episode with url "${podcastEpisodeDownload.url}"`, error)
return null return null
}) })
if (!response) return resolve(false) if (!response) {
return resolve({
success: false
})
}
/** @type {import('../libs/fluentFfmpeg/index').FfmpegCommand} */ /** @type {import('../libs/fluentFfmpeg/index').FfmpegCommand} */
const ffmpeg = Ffmpeg(response.data) const ffmpeg = Ffmpeg(response.data)
@ -177,7 +181,10 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
if (stderrLines.length) { if (stderrLines.length) {
Logger.error(`Full stderr dump for episode url "${podcastEpisodeDownload.url}": ${stderrLines.join('\n')}`) Logger.error(`Full stderr dump for episode url "${podcastEpisodeDownload.url}": ${stderrLines.join('\n')}`)
} }
resolve(false) resolve({
success: false,
isFfmpegError: true
})
}) })
ffmpeg.on('progress', (progress) => { ffmpeg.on('progress', (progress) => {
let progressPercent = 0 let progressPercent = 0
@ -189,7 +196,9 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
}) })
ffmpeg.on('end', () => { ffmpeg.on('end', () => {
Logger.debug(`[FfmpegHelpers] downloadPodcastEpisode: Complete`) Logger.debug(`[FfmpegHelpers] downloadPodcastEpisode: Complete`)
resolve(podcastEpisodeDownload.targetPath) resolve({
success: true
})
}) })
ffmpeg.run() ffmpeg.run()
}) })