LINUX.ORG.RU

как зациклить yt-dlp на закачку.

 


0

1

Прывет.

С покупкой нового монитора, стала проблема, что смотреть видео в 360p-вообще не айс. И даже 480p, если развернуть на весь экран, опять квадраты.

К чему это я.. К тому что если качаю файл, то качаю минимум 720p с ютуба, а оно занимает много места. А с моим интернетом быстро скачать не получится. Поэтому я ставлю на скачку, и ухожу.

В 10:00 сегодня поставил, в 18:00 пришёл а там

[download]  21.2% of 2.31GiB at 24.36KiB/s KiB/s ETA 24:57:48[download] Got server HTTP error: The read operation timed out. Retrying (attempt 6 of 10) ...
ERROR: unable to download video data: <urlopen error [Errno -3] Temporary failure in name resolution>

Ну вроде всё понятно что написано, «urlopen error» это прекрасно. Но почему он бросает попытки скачать?? Он не должен продолжать долбить этот интернет?

Качаю так 247+140

Как его зациклить на постоянное скачивание?? С моим падающим интернетом.


таймауты поставь побольше, кол-во попыток тоже побольше, почитай документацию по yt-dlp.
я то ответ знаю, но не скажу т.к. есть в документации.

etwrq ★★★★★
()
Ответ на: комментарий от RuttY

Честно говоря, сам давно и интенсивно использую yt-dlp, но не могу сказать, как тут можно поправить средствами самого yt-dlp.

Может проще через bash цикл? Будет рваться и опять запускаться, плюс докачка будет работать (не с нуля каждый раз). Может даже правильней с использованием sleep, чтобы не грузить проц.

while true ; do sleep 10 && yt-dlp -f 247+140  "URL_youtube" ; done

p.s. Youtube-dl и yt-dlp во многом пересекаются в документации, поэтому даже проще искать в интернете по-старинке, по youtube-dl. Больше информации выдаст поисковик.

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 2)
Ответ на: комментарий от krasnh

Честно говоря, сам давно и интенсивно использую yt-dlp, но не могу сказать, как тут можно поправить средствами самого yt-dlp.

По-моему очевидный вариант - распаковываешь архив (оно zip с #!/.../python) ищешь там строку с ошибкой про этот таймаут, рядом с ней должна быть логика этих таймаутов и отключаешь условие счётчика попыток.

До чего дошло, даже в насквозь опенсорсном скрипте ищут какие-то доки вместо того что б сразу поправить.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от krasnh

Как вариант, ютуб еще режет скорость и соединение, если не залогинился и нет –cookies.

krasnh ★★★★
()
Ответ на: комментарий от firkax
По-моему очевидный вариант - распаковываешь архив (оно zip с #!/.../python) ищешь там строку с ошибкой про этот таймаут, рядом с ней должна быть логика этих таймаутов и отключаешь условие счётчика попыток.

Дада, и мне «отсыпьте» потом, такого «yt-dlp». С отключенным счётчиком.

RuttY
() автор топика
Ответ на: комментарий от RuttY
--socket-timeout SECONDS        Time to wait before giving up, in seconds

Поставить максимально возможное значение. Как все это сработает на практике, не знаю. Но если сработает, значит это решение считаем самым простым. )

Может даже равное 0 отключит?

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

неа, 0 не отключает.

Поставил 3600, таймаут))

RuttY
() автор топика
Ответ на: комментарий от RuttY

Ну я не пойму, неужели это и правда сложно?

Сейчас проверю.

21:17 ищу в яндксе yt-dlp и скачиваю архив https://github.com/yt-dlp/yt-dlp/releases/download/2022.06.29/yt-dlp

21:18 unzip yt-dlp, выдало ошибку

23 extra bytes at beginning or within zipfile
cp yt-dlp yt-dlp.zip

mcedit yt-dlp.zip, жму F8 удалить шебанг, F2 сохраняю, Esc Esc выход

unzip yt-dlp.zip - успех, распаковалось в директорию yt_dlp

21:20 ищу твою ошибку

grep -RF «Retrying (attempt» yt_dlp

нашлось в yt_dlp/downloader/common.py

21:21 mcedit yt_dlp/downloader/common.py

F7, ввожу «Retrying (attempt»

первая строка про какие-то операции с файлами, она нам не нужна, ищу ещё раз (F7, enter)

нашло:

    def report_retry(self, err, count, retries):
        """Report retry in case of HTTP error 5xx"""
        self.__to_screen(
            '[download] Got server HTTP error: %s. Retrying (attempt %d of %s) ...'
            % (error_to_compat_str(err), count, self.format_retries(retries)))
        self.sleep_retry('http', count)
21:23 ищу report_retry
$ grep -RF report_retry yt_dlp
yt_dlp/downloader/http.py:                    self.report_retry(e.source_error, count, retries)
yt_dlp/downloader/fragment.py:    def report_retry_fragment(self, err, frag_index, count, retries):
yt_dlp/downloader/fragment.py:                        self.report_retry_fragment(err, frag_index, count, fragment_retries)
yt_dlp/downloader/common.py:    def report_retry(self, err, count, retries):
yt_dlp/downloader/youtube_live_chat.py:                        self.report_retry_fragment(err, frag_index, count, fragment_retries)
yt_dlp/downloader/ism.py:                        self.report_retry_fragment(err, frag_index, count, fragment_retries)
нам нужно первое в yt_dlp/downloader/http.py потому что остальные с другими названиями

21:24 mcedit yt_dlp/downloader/http.py

F7 «report_retry» enter

нашлось такое в конце файла

        while count <= retries:
            try:
                establish_connection()
                return download()
            except RetryDownload as e:
                count += 1
                if count <= retries:
                    self.report_retry(e.source_error, count, retries)
                else:
                    self.to_screen(f'[download] Got server HTTP error: {e.source_error}')
                continue
            except NextFragment:
                continue
            except SucceedDownload:
                return True

        self.report_error('giving up after %s retries' % retries)
        return False

очевидно, можно просто убрать if count <= retries и заменить while count <= retries: на какое-нить while true: (не знаю можно ли так в питоне), но давай сделаем красивее и найдём откуда берётся retries - листаем вверх, а там

retries = self.params.get('retries', 0)
21:28 походу это параметр командной строки с названием retries
yt-dlp --help | grep retries
                                     seconds (or range) to wait between retries
    -R, --retries RETRIES            Number of retries (default is 10), or
    --file-access-retries RETRIES    Number of times to retry on file access
    --fragment-retries RETRIES       Number of retries for a fragment (default
    --extractor-retries RETRIES      Number of retries for known extractor

21:29 и правда, на этом выясняем что можно ничего не патчить было а просто ставить -R 1000000

Итого 12 минут, из них наверно 5 на написание лога моих действий в этом сообщении.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от etwrq

Где-то часа через 4 проведу эксперимент.

Лог приложу в конце дня.

RuttY
() автор топика
Последнее исправление: RuttY (всего исправлений: 1)
Ответ на: комментарий от firkax

Занятно спс)) Потом обязательно сделаю себе, свой собственный yt-dlp. Со своими правками.

RuttY
() автор топика

В 9:00 поставил, приблизительно в 19:47 закончило. Качал сразу два файла, где то 9Гб.

[youtube] : Downloading webpage
[youtube] : Downloading android player API JSON
[info] : Downloading 1 format(s): 22
[download] Resuming download at byte 4815382
[download] Destination: [].mp4
[download] 100% of 4.70GiB in 05:27:35
[youtube] : Downloading webpage
[youtube] : Downloading android player API JSON
[info] : Downloading 1 format(s): 22
[download] Resuming download at byte 15306072
[download] Destination:[].mp4
[download]  29.0% of 4.06GiB at 203.50KiB/s ETA 04:07:56
[download] 100% of 4.06GiB in 05:25:02

Никаких обрывов ничего не видно, может оно их не показывает?

Ну первый раз удачный, отлично! Продолжаем мониторить.

RuttY
() автор топика
27 октября 2023 г.

Написал вот такой код на Python, который зациклит YT-DLP, пока не скачается. Я не профессионал на этом языке, Поправьте если есть что поправить.

import subprocess
from subprocess import CalledProcessError


def run_download(command):
	while True:
		try:
			info_download = subprocess.run(command, check=True, stdout=subprocess.PIPE)
			data = info_download.stdout.decode('cp1251')
			print(data)
			if '[download] 100% of' not in data:
				continue
			break
		except CalledProcessError:
			time.sleep(3)

# command = 'Здесь должна быть команда yt-dlp'
# Например:
command = 'yt-dlp.exe -f 22 https://www.youtube.com/watch?v=ZJhvAJKzg7M'
run_download(command)
listik1234
()
Ответ на: комментарий от t184256

Наверное это неправильно. Но я пока дальше не прошёл.

Можно получается установить yt-dlp установить как модуль. А затем в скрипте *.py всё описать.

listik1234
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.