The method retrieves info from an URL, extracts it and sends a ReadableStream to the client to download. The problem comes when after certain filesize ONLY the mixed audio and video the download refuses to end and starts all over again (I think the download restart comes from Chrome's side anyway). This issue isn't present in bigger filesizes with only audio or only video but mixed.
This is my code:
const ytdl = require('youtube-dl-exec')
const httpStatus = require('http-status')
const APIError = require('../errors/api-error')
const options = {
dumpSingleJson: true,
noWarnings: true,
noCallHome: true,
noCheckCertificate: true,
youtubeSkipDashManifest: true,
limitRate: '100K',
noResizeBuffer: true,
noCacheDir: true
}
exports.download = async (req, res, next) => {
const { formatId: format } = req.params
const { url } = req.query
try {
const info = await ytdl(url, options)
const { formats, id } = info
const filteredFile = formats.find((fmt) => fmt.format_id === format)
const stream = ytdl.exec(url, { format, quiet: true, output: '-' })
res.set({
'Content-Type': 'application/octet-stream',
'Content-Length': filteredFile.filesize ? filteredFile.filesize : filteredFile.filesize_approx,
'Content-Disposition': `attachment; filename="${id}.${filteredFile.ext}"`
})
stream.stdout.pipe(res)
} catch (error) {
if (error.stderr?.includes(404)) {
next(new APIError({
errors: "That video doesn't exist or isn't accesible",
status: httpStatus.BAD_REQUEST
}))
} else {
next(new APIError({
errors: 'There was an error from our side, sorry',
status: httpStatus.INTERNAL_SERVER_ERROR
}))
}
}
}
Repeated api calls after failed downloads
(Didnt fail) GET /v1/video/download/248?url=https://www.youtube.com/watch?v=SSd8SozKLEc 200 4692.642 ms - 31657807
(Failed) GET /v1/video/download/22?url=https://www.youtube.com/watch?v=SSd8SozKLEc 200 4507.283 ms - 14003829
(Failed + repeated) GET /v1/video/download/22?url=https://www.youtube.com/watch?v=SSd8SozKLEc 200 4329.014 ms - 14003829
(Failed + repeated) GET /v1/video/download/22?url=https://www.youtube.com/watch?v=SSd8SozKLEc 200 4418.191 ms - 14003829
(Failed + repeated) GET /v1/video/download/22?url=https://www.youtube.com/watch?v=SSd8SozKLEc 200 4509.562 ms - 14003829