#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. Я только что узнал, что сетевые материалы здесь не являются узким местом, см. Мой ответ. В любом случае спасибо за ваш вклад!