Почему последующие загрузки с youtube-dl намного быстрее?

#python #python-3.x #youtube-dl

#python #python-3.x #youtube-dl

Вопрос:

Я загружаю и конвертирую несколько видеороликов YouTube в файлы только для аудио на моем нулевом RPi. Хотя инициализация и первая загрузка занимают довольно много времени, последующие загрузки выполняются намного быстрее. Есть ли какой-либо способ «разогреть» yt-dl, чтобы он был быстрее даже при первой загрузке? Я не возражаю против дополнительного времени инициализации. (Изменение порядка URL-адресов не имеет никакого эффекта.)

 import time
t1 = time.time()

from youtube_dl import YoutubeDL
ydl = YoutubeDL({'format': 'bestaudio/best'}) 
t2 = time.time()
print(t2 - t1, flush=True)

ydl.download(['https://www.youtube.com/watch?v=xxxxxxxxxxx'])
t3 = time.time()
print(t3 - t2, flush=True)

ydl.download(['https://www.youtube.com/watch?v=yyyyyyyyyyy'])
t4 = time.time()
print(t4 - t3, flush=True)

ydl.download(['https://www.youtube.com/watch?v=zzzzzzzzzzz',])
t5 = time.time()
print(t5 - t4, flush=True)
  

Вывод:

 5.889932870864868
[youtube] xxxxxxxxxxx: Downloading webpage
[download] 100% of 4.09MiB in 00:01
15.685529470443726
[youtube] yyyyyyyyyyy: Downloading webpage
[download] 100% of 3.58MiB in 00:00
2.526634693145752
[youtube] zzzzzzzzzzz: Downloading webpage
[download] 100% of 3.88MiB in 00:01
2.4716105461120605
  

Ответ №1:

Хорошо, это должно сработать. Информация D / L из каждого видео, затем извлекает эти видео.

 #! /usr/bin/env python3

import time
from youtube_dl import YoutubeDL

##  opts = { 'format': 'best[height<=720,ext=mp4]/best[height<=720]' }
opts = { 'format': 'bestaudio[ext=m4a]/bestaudio/best' }

ydl = YoutubeDL( opts )

videos = [ 'https://www.youtube.com/watch?v=cVsQLlk-T0s',
           'https://www.youtube.com/watch?v=3l2oi-X8P38',
           'https://www.youtube.com/watch?v=bPpcfH_HHH8' ]

items = []

for video in videos:
    timer = time .time()
    info = ydl .extract_info( video,  download = False )
    items .append( info )
    print( 'info:',  info['title'],  '--',  time .time() -timer,  flush = True )

for item in items:
    timer = time .time()
    ydl .process_video_result( item )
    print( 'vid:',  item['title'],  '--',  time .time() -timer,  flush = True )
  

Комментарии:

1. Спасибо! Это помогает в том смысле, что теперь я знаю, как извлекать мультимедийную информацию без загрузки фактического содержимого. Поэтому для моих нужд мне нужно было бы получить информацию для случайного видео, а затем все загрузки выполняются довольно быстро. Не совсем то, что я искал, но я, вероятно, смогу с этим работать.

Ответ №2:

Пройдя по коду youtube-dl, я обнаружил, что большая часть времени уходит на поиск правильных InfoExtractor URL-адресов для YT. При загрузке первого элемента мультимедиа фреймворк проходит через сотни возможных экстракторов (с выполнением регулярных выражений для каждого из них) и, наконец, останавливается на правильном экстракторе YT, который в моем случае находится на позиции 1122!

Это мой быстрый хак, который полностью удаляет 12 секунд из процесса на моем нулевом RPi:

 import time
timer = time.time()

from youtube_dl import YoutubeDL

ydl = YoutubeDL({'format': 'bestaudio/best'})

# Get correct info extractor and replace the long existing list
ydl._ies = [ydl.get_info_extractor('Youtube')]

print(time.time() - timer)
timer = time.time()

# Super fast first download, yay!
ydl.download(['https://www.youtube.com/watch?v=xxxxxxxxxxx'])

print(time.time() - timer)
  

Вывод:

 5.961918592453003
[youtube] xxxxxxxxxxx: Downloading webpage
[download] 100% of 4.09MiB in 00:01
3.7426917552948   <-- way faster!
  

Может быть, есть более обычный способ для этого без перезаписи полу-частных переменных.

Ответ №3:

Я не думаю, что вы можете ускорить это, не получив более быстрого интернет-сервиса. Это сетевое время, согласование безопасных сокетов с YouTube.

Возможно, вы можете немного ускорить процесс, протестировав скорость вашего текущего DNS и посмотрев, есть ли более быстрый.

https://www.serverwatch.com/guides/two-tools-for-testing-dns-server-speeds

Комментарии:

1. Спасибо за ответ. Я бы не возражал против времени на согласование сокетов, если это произойдет до того, как я попытаюсь загрузить носитель. Есть ли какой-нибудь способ заставить yt-dl сделать это заранее? РЕДАКТИРОВАТЬ: что-то вроде ydl.init_socket(...) было бы очень полезно…

2. Я только что узнал, что сетевые материалы здесь не являются узким местом, см. Мой ответ. В любом случае спасибо за ваш вклад!