Pobieranie adresu URL filmu z YouTube za pomocą `youtube-dl` jest powolne, bez pobierania filmu

10

Chcę uzyskać adres URL za pomocą youtube-dl i opcji „symulacji” -g, która nie powoduje pobrania filmu.

Dałem więc następujące polecenie:

youtube-dl -g https://www.youtube.com/watch?v=k4JGSAmu4lg

Dał następujący wynik po 7 do 8 sekundach

https://r20---sn-cvh7zn7d.googlevideo.com/videoplayback?initcwndbps=1113000&mt=1408702970&requiressl=yes&ipbits=0&sver=3&fexp=901454%2C902408%2C919145%2C924626%2C927622%2C927904%2C931330%2C931983%2C934024%2C934030%2C934804%2C945118%2C945308%2C946023%2C951914&ratebypass=yes&signature=38F111D46D72FFC50B47D50B3C9A631099BF5F83.FA134C91F407989B95ACADC1F1F6946B8F18C158&upn=tU0u5t7A2Uw&sparams=id%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Cmm%2Cms%2Cmv%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&mm=31&expire=1408724634&id=o-AJNPuDp9TKMKiwzUwvSk76W7JdA0cx0bRSum9mPJJ7Vo&mv=u&source=youtube&ms=au&key=yt5&ip=115.113.1.50&itag=18

Problem polega jednak na tym, że zapytanie o adres URL zajmuje około 7 do 8 sekund.
Czy jest jakiś sposób, aby mógł być szybszy?

bharath kumar reddy bojja
źródło
Co dokładnie masz na myśli mówiąc „symuluj”?
Volker Siegel,
kiedy podamy opcję -g, po której następuje youtube-dl, wygeneruje (zasymuluje) adres URL, jak wspomniałem jako wynik.
bharath kumar reddy bojja

Odpowiedzi:

9

Czas spędzasz na pracy

Polecenie nie zawiesza się ani nie czeka na coś marnującego czas, w
rzeczywistości działa, co wymaga czasu; Najprawdopodobniej zsumowanie wielu małych opóźnień sieci zajmuje trochę czasu. Ale może się również zdarzyć, że po stronie YouTube pojawią się opóźnienia, które się sumują.

Że jest to tylko czas potrzebny na pobranie potrzebnego kodu HTML;
Polecenie musi wykonać co najmniej dwa żądania HTTP, jeden po drugim i prawdopodobnie więcej.

Więc jeśli coś jest powolne, jest ono mnożone przez liczbę żądań już.

Dla mnie zajmuje to bardzo szybko 1,5 sekundy - to nie jest tak daleko od 8 sekund.


Jak się dowiedzieć

Pokażę polecenia, których się dowiedziałem:

Aby przykłady były bardziej uporządkowane, używamy zmiennej dla adresu URL:

$ u="https://www.youtube.com/watch?v=k4JGSAmu4lg"

Chcemy mierzyć czas trwania poleceń; Używając polecenia, timenależy uważać, aby nie pomieszać polecenia i wbudowanej powłoki. Używamy małej funkcji, aby skrócić linie:

$ t(){/usr/bin/time -f 'Time: %es' "$@";}

Twoje polecenie zapisuje adres URL pliku wideo (obciętego do 80 kolumn):

$ youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823

Zmierzmy czas potrzebny do uruchomienia na moim komputerze:

$ t youtube-dl -g "$u"
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?signature=091F68E823
Time: 1.44s

Ok, półtorej sekundy. Szybciej niż w pytaniu, ale nie tak dużo szybciej. Ale jak spędza czas? Może pobiera wideo w jakiś ukryty sposób i odrzuca je? Wideo trwa 11 minut w 360p. Pobranie go bez opcji zajmuje około 13 sekund - dziesięć razy dłużej.
Musisz przyjrzeć się bliżej, z opcją pełnego -v:

$ t youtube-dl -v -g "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-g', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
https://r20---sn-cxg7en7d.googlevideo.com/videoplayback?sparams=id%2Cinitcwn
Time: 1.40s

Och, jest trochę opóźnienia, zanim zostaną wydrukowane wiersze „[debugowanie]”. Wygląda na to, że youtube-dlpoświęca trochę czasu na własną konfigurację konfiguracji. To jakieś kwadrans, a nie opóźnienie, którego szukamy. Ale możemy się z tego nauczyć, że youtube-dlsama realizacja może być powolna.
Po wiadomościach nic się nie dzieje, dopóki nie zostanie wydrukowany wynikowy adres URL. Dlatego nadal nie widzimy interesującej części.
Opcją -gjest „symulacja” pobierania wideo w tym sensie, że robi skomplikowaną część w celu znalezienia tego częściowo tajnego adresu URL, drukuje go, ale ostatecznie pomija faktyczne pobieranie. Istnieje podobna opcja -s, która nie wyświetla adresu URL, a poza tym wydaje się podobna. Załóżmy, że jest wystarczająco podobny, jeśli zajmuje to mniej więcej tyle samo czasu; Musimy to sprawdzić.

$ t youtube-dl -v -s "$u"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', '-s', 'https://www.youtube.com/watch?v=k4J
[debug] Encodings: locale 'UTF-8', fs 'UTF-8', out 'UTF-8', pref: 'UTF-8'
[debug] youtube-dl version 2014.02.06
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14
[debug] Proxy map: {}
[youtube] Setting language
[youtube] k4JGSAmu4lg: Downloading webpage
[youtube] k4JGSAmu4lg: Downloading video info webpage
[youtube] k4JGSAmu4lg: Extracting video information
Time: 1.45s

Ok, -szajmuje tyle samo czasu co -g, więc można je zastąpić do testowania.
Bardziej interesujące jest to, że mamy teraz większą wydajność. I jest drukowany z ciekawym czasem: linie są drukowane z podobnym opóźnieniem względem siebie, więc wydaje się, że dotyczą działań, które w rzeczywistości zajmują czas, którego szukamy.
Z wiadomości pobierane są co najmniej dwie strony internetowe. Możemy jednak założyć, że słowo „strona” nie będzie oznaczać pojedynczego żądania HTTP i pojedynczego dokumentu HTML.

Czego się nauczyliśmy?

Chodzi przede wszystkim o to, że praca programu zajmuje dużo czasu, nie czeka na coś ani nie zawiesza się.
Widzimy też wiele kroków zajmujących podobny czas. Nie ma wiele do obliczenia, więc to w jakiś sposób obieg sieci, sumując.
Oznacza to, że opóźnienie naszego połączenia jest ważne tylko tutaj. Przepustowość połączenia jest po prostu nieistotna.

Jeśli chcesz, aby twoje połączenie internetowe było szybsze, aby mogło przesyłać dane z podwójną prędkością - to wcale nie pomogłoby. Ale jeśli uda ci się uzyskać lepsze pingczasy, to znacznie przyspieszy.
Nie chodzi jednak o czasy „pingowania” dostawcy usług internetowych; Czas pingowania aż do YouTube ma znaczenie - i może nie być możliwy do zmiany.

Co ciekawe, do następnego kroku, pobierania filmu, wymagania dotyczące szybkiej linii są dokładnie odwrotne: opóźnienie nie jest w ogóle istotne, a przepustowość naprawdę ma znaczenie.


Nie jesteś jeszcze zmęczony?

Chcesz jeszcze więcej szczegółów, aby zrozumieć, na co tak naprawdę spędza czas?
Następnym krokiem byłoby prześledzenie połączenia HTTP; Podejrzewam, że może pokazywać o wiele więcej objazdów niż dwa, na przykład przekierowania. Możesz użyć wiresharkserwera proxy HTTP z logowaniem, lub stracepo prostu policzyć wywołania systemowe do łączenia się lub pisania.

Na dzień dzisiejszy oboje spojrzeliśmy wystarczająco głęboko w króliczą dziurę sieci.

Volker Siegel
źródło
Więc jaki może być powód tak długiego czasu? Czy to z powodu wolnego połączenia sieciowego?
bharath kumar reddy bojja
Zależy od tego, jak wolno jest - jakie jest pytanie? Zaczekaj chwilę na szczegóły moich przykładów, piszę je.
Volker Siegel,
Moje pytanie brzmi: czy opóźnienie wynika z wolnego połączenia sieciowego?
bharath kumar reddy bojja
Tak, częściowo. Pytanie jest mniej proste niż się wydaje;) Nie chodzi o przepustowość połączenia. Opóźnienie jest tutaj ważne. Z tego co wiem, są co najmniej trzy rundy HTTP - ale może więcej. Wszystkie opóźnienia są mnożone przez tę liczbę, która się sumuje. Nic nie wiem o twoim połączeniu; Po stronie YouTube może być powolna, trudna do określenia bez pomiaru. Wypróbuj inne rzeczy w sieci, dla których wiesz, jak szybkie są i sprawdź, czy wydaje się wolniejsze, czy normalne.
Volker Siegel
Dodałem więc trochę szczegółów :)
Volker Siegel
6

Po prostu wykonaj:

youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=k4JGSAmu4lg' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'

Źródło

TIK Tak
źródło
1

Może być inny powód. youtube-dljest rozpowszechniany jako skompresowana aplikacja Python. Za każdym razem, gdy go uruchamiasz, wyodrębnia go, a następnie uruchamia.

Możesz go ręcznie wyodrębnić za pomocą unzippolecenia. Następnie biegnij __main__.pytak jak ty youtube-dl. Na komputerze o niskiej mocy, takim jak Pi, zauważalnie zwiększysz wydajność.

nmrugg
źródło