Obtener la URL del video de YouTube con `youtube-dl` es lento, sin descargar el video

10

Quiero obtener la URL usando youtube-dl, y la opción "simular" -gque no descarga el video.

Entonces le di el siguiente comando:

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

Dio la siguiente salida después de 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

Pero el problema es que toma alrededor de 7 a 8 segundos para consultar la URL.
¿Hay alguna manera de que pueda ser más rápido?

Bharat Kumar Reddy Bojja
fuente
¿Qué quieres decir con "simular" exactamente?
Volker Siegel
cuando le damos la opción -g seguido de youtube-dl, generará (simulará) URL como mencioné como salida.
bharath kumar reddy bojja

Respuestas:

9

El tiempo se gasta haciendo trabajo

El comando no se cuelga ni espera que algo pierda el tiempo,
en realidad funciona y lleva tiempo; Lo más probable es que tome tiempo al sumar múltiples retrasos de red pequeña. Pero también podría ser que haya retrasos en el lado de YouTube, que se suman.

Que solo se necesita el tiempo necesario para descargar el HTML;
El comando debe realizar al menos dos solicitudes HTTP, una tras otra, y probablemente más.

Entonces, si algo es lento, ya se multiplica por el número de solicitudes.

Para mí, lleva 1.5 segundos en una línea muy rápida, eso no está muy lejos de los 8 segundos.


Cómo averiguar

Mostraré los comandos que solía descubrir:

Para que los ejemplos sean más ordenados, utilizamos una variable para la URL:

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

Queremos medir la duración de los comandos; El uso del comando timedebe tener cuidado de no mezclar el comando y el shell incorporado. Usamos una pequeña función para acortar las líneas:

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

Su comando escribe la URL del archivo de video (truncado a 80 columnas):

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

Midamos el tiempo que tarda en ejecutarse en mi computadora:

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

Ok, un segundo y medio. Más rápido que en la pregunta, pero no mucho más rápido. Pero, ¿cómo es pasar el tiempo? ¿Tal vez descarga el video de alguna manera oculta y lo descarta? El video es de 11 minutos en 360p. Solo descargarlo sin opciones lleva unos 13 segundos, diez veces más.
Necesita echar un vistazo más de cerca, con la opción detallada -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, hay algún retraso antes de que se impriman las líneas '[depuración]'. Parece que youtube-dlpasa algo de tiempo para su propia configuración. Es un cuarto de segundo más o menos, no el retraso que estamos buscando. Pero lo que podemos aprender de él es que la youtube-dlimplementación en sí misma puede ser lenta.
Después de los mensajes, no sucede nada hasta que se imprime la URL del resultado. Entonces todavía no vemos la parte interesante.
La opción -ges "simular" la descarga de video en el sentido de que hace la parte complicada de descubrir esa URL semisecreta, la imprime, pero luego se salta la descarga real al final. Hay una opción similar -sque no genera la URL y, de lo contrario, parece similar. Supongamos que es lo suficientemente similar si toma aproximadamente el mismo tiempo; Necesitamos verificar eso.

$ 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, -stoma el mismo tiempo que -g, así que está bien reemplazarlos para probarlos.
Más interesante es que ahora tenemos más resultados. Y se imprime con un momento interesante: las líneas se imprimen con un retraso similar entre sí, por lo que parece que se trata de las acciones que realmente están tomando el tiempo que buscamos.
De los mensajes, se descargan al menos dos páginas web. Pero podemos suponer que la palabra "página" no significará una sola solicitud HTTP y un solo documento HTML.

Que aprendimos

El punto principal es que el trabajo del programa en realidad lleva tiempo, no está esperando algo o colgado.
Además, vemos varios pasos que requieren una cantidad de tiempo similar. No hay mucho que calcular, así que eso es un viaje de ida y vuelta a la red de alguna manera, sumando.
Eso significa que la latencia de nuestra conexión es importante solo aquí. El rendimiento de la conexión es irrelevante.

Si desea que su conexión a Internet sea más rápida para que pueda transferir datos a doble velocidad, eso no ayudaría en absoluto. Pero si puede obtener mejores pingtiempos, eso lo hará mucho más rápido.
Sin embargo, no se trata de "hacer ping" a su proveedor de servicios de Internet; El tiempo de ping hasta YouTube es lo que importa, y puede que no sea posible cambiarlo.

Curiosamente, para el siguiente paso, descargar un video, los requisitos para una línea rápida son exactamente lo contrario: la latencia no es relevante en absoluto, y el rendimiento realmente importa.


¿Todavía no estás cansado?

¿Quiere aún más detalles para comprender en qué se dedica realmente el tiempo?
El siguiente paso sería rastrear la conexión HTTP; Sospecho que puede mostrar muchos más viajes de ida y vuelta que dos, por ejemplo, para redireccionamientos. Puede usar wireshark, o un proxy HTTP de registro, o stracesimplemente contar las llamadas del sistema para conectarse o escribir.

Por hoy, ambos hemos mirado lo suficientemente profundo en el agujero del conejo de las redes.

Volker Siegel
fuente
Entonces, ¿cuál podría ser la razón de tanto tiempo? ¿Se debe a una conexión de red lenta?
bharath kumar reddy bojja
Depende de lo lento que sea, ¿cuál es la pregunta? Espere un minuto para obtener detalles de mis ejemplos, los estoy escribiendo.
Volker Siegel
Mi pregunta es: ¿el retraso se debe a una conexión de red lenta?
bharath kumar reddy bojja
Si, parcialmente. La pregunta es menos simple de lo que parece;) No se trata del rendimiento de la conexión. La latencia es importante aquí. Por lo que puedo decir, hay al menos tres viajes de ida y vuelta HTTP, pero tal vez más. Todos los retrasos se multiplican por este número, que suma. No sé nada sobre tu conexión; Podría ser lento en el extremo de YouTube, difícil de distinguir sin medir. Pruebe otras cosas en la red para las que sabe lo rápido que son y compruebe si se siente más lento o normal.
Volker Siegel
Entonces, agregué algunos detalles :)
Volker Siegel
6

Solo haz un:

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

Fuente

TIC Tac
fuente
1

Puede haber otra razón. youtube-dlse distribuye como una aplicación Python comprimida. Cada vez que lo ejecuta, lo extrae y luego lo ejecuta.

Puede extraerlo manualmente con el unzipcomando. Luego corre __main__.pycomo lo harías youtube-dl. En una computadora de baja potencia, como la Pi, que mejorará notablemente su rendimiento.

nmrugg
fuente