Obter URL do vídeo do YouTube com `youtube-dl` é lento, sem baixar o vídeo

10

Quero obter o URL usando o youtube-dl e a opção "simular" -gque não baixa o vídeo.

Então, eu dei o seguinte comando:

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

Deu a seguinte saída após 7 a 8 segundos

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

Mas o problema é que demora cerca de 7 a 8 segundos para consultar o URL.
Existe alguma maneira de que seja mais rápido?

bharath kumar reddy bojja
fonte
O que você quer dizer com "simular", exatamente?
Volker Siegel
quando damos a opção -g seguida pelo youtube-dl, ela gera (simula) o URL como mencionei como saída.
precisa saber é o seguinte

Respostas:

9

O tempo é gasto trabalhando

O comando não trava ou espera por algo que está perdendo tempo,
ele realmente funciona e leva tempo; Provavelmente leva tempo adicionando vários pequenos atrasos na rede. Mas também pode haver atrasos no lado do youtube, que se somam.

Que leva apenas o tempo necessário para baixar o HTML necessário;
O comando precisa fazer pelo menos duas solicitações HTTP, uma após a outra e provavelmente mais.

Portanto, se algo for lento, ele será multiplicado pelo número de solicitações.

Para mim, são necessários 1,5 segundos em uma linha muito rápida - isso não está longe de 8 segundos.


Como descobrir

Vou mostrar os comandos que descobri:

Para tornar os exemplos mais organizados, usamos uma variável para o URL:

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

Queremos medir a duração dos comandos; O uso do comando timeprecisa tomar cuidado para não misturar o comando e o shell interno. Usamos uma função pequena para tornar as linhas mais curtas:

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

Seu comando grava o URL do arquivo de vídeo (truncado para 80 colunas):

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

Vamos medir o tempo que leva para executar no meu computador:

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

Ok, um segundo e meio. Mais rápido do que na questão, mas não muito mais rápido. Mas como está gastando o tempo? Talvez ele faça o download do vídeo de alguma maneira oculta e o descarte? O vídeo tem 11 minutos em 360p. O download sem opções leva cerca de 13s - dez vezes mais.
Precisa dar uma olhada mais de perto, com a opção detalhada -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

Ah, há algum atraso antes das linhas '[debug]' serem impressas. Parece que youtube-dlleva algum tempo para sua própria configuração. São cerca de um quarto de segundo, não o atraso que estamos procurando. Mas o que podemos aprender é que a youtube-dlprópria implementação pode ser lenta.
Após as mensagens, nada acontece até que o URL do resultado seja impresso. Então ainda não vemos a parte interessante.
A opção -gé "simular" o download do vídeo no sentido de que ele faz a parte complicada de descobrir esse URL semi-secreto, imprimi-lo, mas depois pula o download real no final. Existe uma opção semelhante -sque não gera a URL e, de outra forma, parece semelhante. Vamos supor que seja semelhante o suficiente se demorar aproximadamente o mesmo tempo; Precisamos verificar isso.

$ 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, -sleva o mesmo tempo que -g, portanto, está tudo bem substituí-los para teste.
Mais interessante é que agora temos mais resultados. E é impresso com um timing interessante: as linhas são impressas com um atraso semelhante entre si, portanto, parece que são sobre as ações que realmente levam o tempo que procuramos.
Das mensagens, pelo menos duas páginas da web são baixadas. Mas podemos supor que a palavra "página" não signifique uma única solicitação HTTP e um único documento HTML.

O que aprendemos?

O ponto principal é que o trabalho do programa realmente leva tempo, não está esperando por algo ou está pendurado.
Além disso, vemos várias etapas que levam quantidades semelhantes de tempo. Não há muito o que calcular, portanto, isso é de alguma forma, ida e volta à rede.
Isso significa que a latência da nossa conexão é importante apenas aqui. A taxa de transferência da conexão é apenas irrelevante.

Se você tornasse a sua conexão com a Internet mais rápida para poder transferir dados em velocidade dupla - isso não ajudaria em nada. Mas se você puder obter melhores pingtempos, isso será muito mais rápido.
Não se trata de tempos de 'ping' para o seu provedor de serviços de Internet; O tempo de ping até o YouTube é o que importa - e pode não ser possível alterar.

Curiosamente, para a próxima etapa, baixar um vídeo, os requisitos para uma linha rápida são exatamente o oposto: a latência não é relevante e a taxa de transferência realmente importa.


Ainda não está cansado?

Deseja ainda mais detalhes para entender em que tempo é realmente gasto?
O próximo passo seria rastrear a conexão HTTP; Eu suspeitaria que pode mostrar muito mais ida e volta que duas, para redirecionamentos, por exemplo. Você pode usar wireshark, ou um proxy HTTP de log, ou straceapenas contar as chamadas do sistema para conexão ou gravação.

Por hoje, nós dois examinamos profundamente o buraco do coelho das redes.

Volker Siegel
fonte
Então, qual poderia ser a razão de tanto tempo? É devido a uma conexão de rede lenta?
bharath Kumar Reddy bojja
Depende de quão lento é - qual é a questão? Espere um minuto para obter detalhes dos meus exemplos, estou escrevendo-os.
Volker Siegel
Minha pergunta é: O atraso ocorre devido à conexão lenta da rede?
precisa saber é o seguinte
Sim parcialmente. A questão é menos simples do que parece;) Não se trata da taxa de transferência da conexão. A latência é importante aqui. Pelo que sei, há pelo menos três ida e volta HTTP - mas talvez mais. Todos os atrasos são multiplicados por esse número, que soma. Eu não sei nada sobre sua conexão; Pode ser lento no final do YouTube, difícil de dizer sem medir. Tente algumas outras coisas na rede para as quais você sabe quão rápido elas são e verifique se parece mais lento ou normal.
Volker Siegel
Então, eu adicionei alguns detalhes :)
Volker Siegel
6

Basta fazer um:

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

Fonte

tictac
fonte
1

Pode haver outro motivo. youtube-dlé distribuído como um aplicativo Python compactado. Cada vez que você o executa, ele o extrai e o executa.

Você pode extraí-lo manualmente com o unzipcomando Então corra __main__.pycomo você correria youtube-dl. Em um computador de baixa potência, como o Pi, isso aumentará visivelmente o seu desempenho.

nmrugg
fonte