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 шт):
Для этого в ydl_opts
нужно прописать аргументы для extractor
. В частности аргумент raise_incomplete_data
со значением 'Incomplete Data Received'
. Тогда при ошибке подключения будет вызываться ошибка yt_dlp.utils.DownloadError
.
Код выглядит следующим образом:
ydl_opts = {
# Прочите параметры
'extractor_args': {
'youtube': {
'raise_incomplete_data': ['Incomplete Data Received']
}
},
# Прочие параметры
}
Не то и не о том. Следует также учитывать, что деятельность граждан РФ в Ютюб затруднена. У меня есть рабочий вариант скачивания, я не из РФ, вот его существенный кусок. В тексте используются мои переменные и функции ядра, но понять можно:
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 данный модуль пока что не работает. Спят писатели, ещё не заметили, что вышла новая версия.