yt_dlp — ошибка при Read Timeout

Пишу код для загрузки видео с использованием yt_dlp. Моя задача сделать так, чтобы при проблеме к подключению по URL вызывался обработчик ошибки. Код следующий:

import yt_dlp

output = 'downloads/%(title)s.mp4'
ydl_opts = {
    'outtmpl': output,
    'quiet': True,
    'ignoreerrors': False,
}
video_url = 'https://www.youtube.com/watch?v=a4fVPvDTYVQ'

with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    try:
        print("Code:", ydl.download([video_url]))
    except yt_dlp.utils.DownloadError:
        print("Download Error")
    except Exception as e:
        print("Error:", e)
    else:
        print("Success!")

В моем случае к YouTube в целом не получается подключиться. В лог консоли yt_dlp выводит следующее сообщение: WARNING: [youtube] Failed to download m3u8 information: HTTPSConnectionPool(host='manifest.googlevideo.com', port=443): Read timed out. (read timeout=20.0). Однако функция отрабатывает штатно и вместо обработчика ошибки попадает в блок else.

Как сделать так, чтобы при проблеме с подключением функция ydl.download([video_url]) падала с ошибкой?


Ответы (2 шт):

Автор решения: Artem Gafarov

Для этого в ydl_opts нужно прописать аргументы для extractor. В частности аргумент raise_incomplete_data со значением 'Incomplete Data Received'. Тогда при ошибке подключения будет вызываться ошибка yt_dlp.utils.DownloadError.

Код выглядит следующим образом:

ydl_opts = {
    # Прочите параметры
    'extractor_args': {
        'youtube': {
            'raise_incomplete_data': ['Incomplete Data Received']
        }
    },
    # Прочие параметры
}
→ Ссылка
Автор решения: Fox Fox

Не то и не о том. Следует также учитывать, что деятельность граждан РФ в Ютюб затруднена. У меня есть рабочий вариант скачивания, я не из РФ, вот его существенный кусок. В тексте используются мои переменные и функции ядра, но понять можно:

  v_options = {
   "ffmpeg_location": v_ffmpeg,
   "format": f"bestvideo[height<={v_quality}]+bestaudio/best",
   "geo_bypass": True,
   "noprogress": True,
   "outtmpl": os.path.join(v_folder, f"%(title)s ({v_quality}p).%(ext)s"),
   "overwrites": True,
   "quiet": True
   }

  try: yt_dlp.YoutubeDL(v_options).download([v_url])
  except Exception as e: ok = lib_msgbox(f"Ошибка загрузки видео! Подробнее:\n{e}", 16)

Обращаю также внимание, что с версией Python 3.13 данный модуль пока что не работает. Спят писатели, ещё не заметили, что вышла новая версия.

→ Ссылка