ARTICLE AD BOX
I'm building a Flask backend that downloads audio from YouTube using yt_dlp.
Locally, everything works perfectly. But when I deploy the same code to Render, the /import-youtube route returns a 500 error.
Here is my simplified route:
@app.route('/import-youtube', methods=['POST']) def import_youtube(): data = request.get_json(silent=True) or {} url = data.get("url") ydl_opts = { "format": "bestaudio/best", "postprocessors": [{ "key": "FFmpegExtractAudio", "preferredcodec": "mp3", "preferredquality": "192", }], "outtmpl": os.path.join(DOWNLOADS_DIR, "%(title)s.%(ext)s"), } try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=True) except Exception as e: app.logger.error("YouTube import failed", exc_info=True) return jsonify({"error": str(e)}), 500What fails on Render
The logs show:
yt_dlp.utils.DownloadError: ERROR: [youtube] <video-id>: Sign in to confirm you’re not a bot. Use --cookies-from-browser or --cookies for authentication.Locally on my machine this never happens.
My environment
Python 3.13 (Render)
Flask
yt_dlp 2024.x
FFmpeg installed in the Render environment
Using Gunicorn: gunicorn FindSongsBackEnd.app:app
My question
Why does yt_dlp require “Sign in to confirm you’re not a bot” only on Render, while the exact same code works locally?
Is there a recommended way to avoid this error when running yt_dlp on cloud hosting providers (Render, AWS, etc.)?
I’m specifically looking for:
Whether this is an IP / rate-limit issue.
Whether there is a way to configure yt_dlp to avoid this error without passing browser cookies.
Or whether the correct approach is to catch DownloadError and handle this case as a non-recoverable response.
Any guidance or prior experience with yt_dlp on cloud hosts would be appreciated.
