• Publicidad

Integrando youtube-dl en Chrome con RainVid

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Integrando youtube-dl en Chrome con RainVid

Notapor ostpulse » 2015-03-06 09:30 @437

¡Hola a todos!

A continuación os presento un programa en Perl que, en conjunto con youtube-dl y una extensión para Chrome, nos permitirán descargar vídeos (por el momento de Youtube) usando todo el poder de youtube-dl http://rg3.github.io/youtube-dl/

Primeramente, el programa en Perl (muy básico dado que me inicio en Perl ;D ):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Win32::Clipboard;
  2.  
  3. ### Simple Documentation ###
  4. #
  5. #      
  6. #       RainVid is a simple script which works with "Copy all urls" https://chrome.google.com/webstore/deta ... nanaolmbfk extension
  7. #       and youtube-dl to let downloading videos from youtube (right now) with only a click
  8. #       You must remember that Chrome Store doesnt allow extensions to download videos from youtube so for that reason is this script
  9. #  
  10. #       '$clip_obj' variable is used to call the object Win32::Clipboard so this variable also accepts all the methods of Win32::Clipboard object
  11. #       '$clip_txt' variable stores the current content of the clipboard
  12. #       '$command' defines the path to be executed after reading the clipboard
  13. #
  14. ### End Simple Documentation ###
  15.  
  16. $command = 'c:\Users\Cibertron\Documents\youtube-dl.exe';   #Path to command to be exexuted
  17. $clip_obj = Win32::Clipboard(); # Create the object
  18. $clip_obj->Empty(); # Clean the clipboard before the first run
  19.  
  20.  
  21. do {    # Create a do loop to avoid terminating the program after the video is downloaded
  22.  
  23.     $clip_obj->WaitForChange();  #Wait to change the clipboard
  24.     $clip_txt = $clip_obj->GetText();   #Obtain only text type clipboard
  25.     
  26.     if (($clip_txt =~ /https:\/\/www.youtube.com/)||($clip_txt =~ /http:\/\/www.youtube.com/)) { # Check if the clipboard contents a youtube url
  27.         system("$command $clip_txt");
  28.         $clip_obj->Empty(); # Clean clipboard after downloading the video
  29.     }else{
  30.         #do nothing;
  31.     }
  32.     
  33. }while(1!=0) # Condition always true, so the "do" loop never finish and by the way, the program doesnt exists when the video is downloaded and waits for more urls
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ok, procuraré siempre que escriba código documentarlo bien para que sea fácil para otros (odio no entender el código de otros, me hace sentir muy  :huh: :huh: :huh: ) así que cualquier duda, preguntad :D

El código es para funcionar bajo Windows, así pues necesitaremos Perl http://www.activestate.com/activeperl; una vez descargado e instalado nos vamos a Perl Package Manager y buscamos el módulo Win32-Clipboard y lo instalamos tal y como muestra la imagen:
Imagen

Una vez instalado el módulo, y teniendo el programa, solo nos falta configurar el Chrome y youtube-dl.

Ok, instalamos la extensión de Chrome, Copy all Urls que hará lo prometido de "solo un clic" https://chrome.google.com/webstore/detail/copy-all-urls/djdmadneanknadilpjiknlnanaolmbfk.

Una vez instalada vamos a descargar youtube-dl http://rg3.github.io/youtube-dl/download.html y lo guardaremos donde deseemos, habrá que recordar el lugar de donde lo guardamos puesto que habrá que sustituir el PATH de la variable command del programa por el lugar en el que guardamos a youtube-dl en nuestro PC. Así por ejemplo, si lo guardamos en "Mis Documentos" en Windows 7, la ruta sería c:\Users\User\Documents\youtube-dl.exe

Llegados a este punto nos falta configurar algo muy importante, lo primero es ffmpeg que es el conversor con el que youtube-dl trabaja para convertir los vídeos a los distintos formatos que se permite tal como avi, mp4, flv, etc. ( EN CUESTIÓN DE CODECS Y RELACIONADOS SOY UNA CACA  :-X ¡ja,ja,ja!).

Descargamos ffmpeg http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20150306-git-c089e72-win32-static.7z
Una vez descargado lo descomprimimos, por ejemplo en C:\ para que sea más fácil y MUY IMPORTANTE, pues debemos incluir a ffmpeg en la variable PATH de Windows para que cuando youtube-dl lo llame lo pueda encontrar. Para hacer esto nos vamos a Mi PC --> Configuración avanzada del sistema--> Variables de entorno y editamos la variable PATH en la cual añadimos al final (en caso de haber descomprimido en C:\) C:\ffmpeg\bin, recordad escribir un punto y coma antes de añadir la línea.
Imagen

¡¡Ya vamos terminando!! ;D

Si hemos hecho todo bien, ahora solo nos falta tocar a Chrome y darle el poder mágico, si os habéis fijado la extensión Copy all Urls nos ha dejado una bonita sombrilla:
Imagen

Ahora solo nos falta configurar la sombrilla, para ello abrimos las preferencias de la extensión y marcamos la casilla Copy highlighted tabs only (activamos esta opción para solo copiar la URL en el portapapeles de la pestaña que estamos viendo) y todas las demás casillas las desactivamos (en la pestaña Default Action seleccionamos Copy para que al pulsar en la sombrilla no nos pregunte la acción qué queremos realizar y automáticamente copié la URL en el portapapeles).

Por último y para finalizar, en la sección Format de la extensión es donde tendremos la oportunidad de escoger si deseamos que descargue vídeos o los convierta a mp3 o al formato que queramos. Para hacer esto tenemos que conocer un poco a youtube-dl...

Si queremos que descargue el vídeo y lo pase a mp3, seleccionaremos la opción Custom en Format y escribimos la siguiente línea: -x --audio-format mp3 --audio-quality 192 $url y si queremos un simple mp4 sencillamente escribimos $url.

¿Cómo funciona todo esto? Sencillo: la extensión de Chrome nos permite copiar contenido al portapapeles, y nuestro programa analiza lo copiado en el portapapeles y si encuentra en este caso una URL de Youtube (¡el programa no analiza si es válida o no la URL!) se la pasa como argumento al programa youtube-dl.

youtube-dl recibe sus parámetros gracias a la sección Custom de la extensión de Chrome donde le decimos qué queremos que haga con la URL que se representa con $url, así pues si queremos decirle que haga por cosa a youtube-dl con la URL simplemente escribiremos los parámetros en la sección Custom.
FIJAOS QUE NO ESCRIBO youtube-dl en la sección Custom, sino que hago directamente el paso de los parámetros.

Ahora para probar que funciona y si habéis hecho todos los pasos, es tan sencillo como ejecutar el programa y abrimos Chrome, nos vamos a Youtube y vemos cualquier vídeo, y le damos clic a la sombrilla y veréis cómo empieza a descargar  ;D

Vale, cosas que pueden pasar. Has de esperar a que descargue el primer vídeo para que puedas descargar el segundo, si intentas dar clic a la sombrilla mientras haya un vídeo descárgandose no se descargará el segundo vídeo dado que el primero no ha terminado. Para hacer eso estoy estudiando fork() que es lo que permitirá hacerlo... si es que os animáis a probarlo la segunda vez, ¡je,je,je!  :rolleyes:

Así que ya sabéis, esperar a que el primero termine y adelante con el siguiente... :P
Imagen

Bueno, mi primer mensaje con algo de aporte :P Se me ha hecho extenso y demasiado :¬¬ y no sé mucho de buena presentación pero iré aprendiendo, ¡je,je,je! Espero que opinéis y me digáis que tal os parece y si es útil...

Saludos, chicos.

ostpul♪e►
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631

Publicidad

Re: Integrando youtube-dl en Chrome con RainVid

Notapor explorer » 2015-03-06 12:38 @568

Hola, ostpulse.

Primero, gracias por tu aporte. Ahora, quisiera hacerte unos comentarios.

youtube-dl

No lo has comentado, pero este programa es un ejecutable para Windows que, al ejecutarse, descomprime e instala un intérprete de ¡Python!, lo cual es sorprendente cuando lo que quieres es resolver el tema de bajar vídeos desde Youtube usando un programa Perl. Es algo así como... arreglar el pinchazo de la rueda de un coche, comprando otro coche nuevo :)

El código

El código es correcto, pero algunas cosillas se pueden hacer un pelín más simples:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!Perl
  2. use Win32::Clipboard;
  3.  
  4. ### Simple Documentation ###
  5. #
  6. # RainVid is a simple script which works with "Copy all urls" extension
  7. # and youtube-dl to let downloading videos from youtube (right now) with only a click.
  8. # You must remember that Chrome Store doesnt allow extensions to download videos from
  9. # youtube so for that reason is this script.
  10. #  
  11. # '$clip_obj' variable is used to call the object Win32::Clipboard so this variable
  12. #             also accepts all the methods of Win32::Clipboard object
  13. # '$clip_txt' variable stores the current content of the clipboard
  14. # '$command'  defines the path to be executed after reading the clipboard
  15. #
  16. ### End Simple Documentation ###
  17.      
  18. $command = 'c:\Users\Cibertron\Documents\youtube-dl.exe';   # Path to command to be exexuted
  19. $clip_obj = Win32::Clipboard();                             # Create the object
  20. $clip_obj->Empty();                                         # Clean the clipboard before the first run
  21.  
  22. while (1) {
  23.  
  24.     $clip_obj->WaitForChange();                             # Wait to change the clipboard
  25.     $clip_txt = $clip_obj->GetText();                       # Obtain only text type clipboard
  26.  
  27.     if ($clip_txt =~ m{https?://www[.]youtube[.]com}) {     # Check if the clipboard contents a youtube url
  28.         system("$command $clip_txt");
  29.         $clip_obj->Empty();                                 # Clean clipboard after downloading the video
  30.     }
  31. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Bajar vídeos de Youtube

Finalmente, como alternativa a youtube-dl, recomiendo el uso de WWW::YouTube::Download, con el que se pueden bajar vídeos con una sola línea de código (artículo en inglés con ejemplos).

De hecho, el código de WWW::YouTube::Download replica el de youtube-dl ;) incluyendo opciones para obtener información del vídeo antes de bajarlo, como por ejemplo las dimensiones de la imagen o la lista de formatos en las que podemos bajarlo (mp4, 3gp, flv o webm), para no tener que hacer la transformación.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Integrando youtube-dl en Chrome con RainVid

Notapor ostpulse » 2015-03-06 14:49 @659

¡¡Hola, explorer!!

WoW :o La verdad es que es muy cierto, he visto tu código y es muy limpio y comprensible y ordenado. Veo el mío y me parece una porquería :oops:

Por otro lado, explorer, el problema es que no sé de qué forma empezar a abordar los problemas... ¿Sabes lo que se dice de que si la rueda se inventó no la reinventes?, pues yo estoy en esa fase de dudas de no saber por dónde empezar y me gustaría saber hacer todo desde el principio, programar mis propias herramientas y tal aunque valgan para el mismo fin pero siento que de esa forma me siento más seguro en cuanto a mi conocimiento.

Para darte un ejemplo recordarás que hace poco formulé una pregunta de fork(). Vale, básicamente quiero aprender a manejar procesos con fork. Sin embargo ya hay módulos que hacen esto y con una tremenda facilidad, entonces entro en dudas de que si, por ejemplo, usase un módulo en vez de fork estaría por decir de alguna forma "aprendiendo menos" porque abordo el problema desde la facilidad de una herramienta creada por alguien el cual sí entiende fork y yo no entiendo fork y por eso hago uso de su módulo... Entonces, la verdad, agradecería una forma de guiarme en el estudio de Perl porque ganas tengo y de sobra pero no encuentro la forma de guiarme y dado a eso muchas veces empiezo y lo dejo en cuestión de días dado que no sé por dónde seguir o cómo seguir.

Me cuesta reconocer que a diferencia de otros autodidactas del asunto, logran formarse muy bien estructurándose ellos mismos los estudios, sin embargo y aunque me avergüenza siento que debo tener algo por lo que guiarme porque mis pautas de aprendizaje son muy dispersas: un día estudio hashes y el otro día estudio forks... Entonces me pierdo intentando darme una base sólida y no solo con Perl sino con cualquier cosa que intente empezar.

Entre mi reflexión de novel y otras cosas, intentaré mejorar en calidad de código y escribir de forma más ordenada. Creo que había un documento que hablaba de cómo escribir código Perl para que sea legible :roll:

¡Gracias, explorer, por el comentario! :)
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631

Re: Integrando youtube-dl en Chrome con RainVid

Notapor explorer » 2015-03-06 17:24 @767

ostpulse escribiste:La verdad es que es muy cierto, he visto tu código y es muy limpio y comprensible y ordenado. Veo el mío y me parece una porquería
Humm... solo he quitado líneas, formateado el espacio en blanco, cambiar el do{}while() por un while(){}, y simplificar la expresión regular. Lo que son sentencias de ejecución, son las mismas.

Escribirlo así cuesta mucho. Yo aprendí leyendo las 3/4 primeras partes del Perl Best Practices.

ostpulse escribiste:Por otro lado, explorer, el problema es que no sé de qué forma empezar a abordar los problemas... ¿Sabes lo que se dice de que si la rueda se inventó no la reinventes?, pues yo estoy en esa fase de dudas de no saber por dónde empezar y me gustaría saber hacer todo desde el principio, programar mis propias herramientas y tal aunque valgan para el mismo fin pero siento que de esa forma me siento más seguro en cuanto a mi conocimiento.
Eso pasa cuando aprendes un nuevo lenguaje informático.

Las distintas partes de un lenguaje (o de cualquier sistema informático) son como diferentes tipos de ladrillos. A la hora de hacer una casa, pues es una ventaja conocer el mayor número posible de ladrillos diferentes. Saldrá más bonita, se terminará antes, y será más fuerte. Pero aprender eso lleva un tiempo.

Mientras aprendes, olvídate del tema de la reinvención y de los módulos. ¿Quieres hacer algo por tu cuenta, aunque ya esté hecho? Pues hazlo. Y si se trata de un código que ya está hecho, luego puedes compararlo con tu código.

Se aprende mucho -pero mucho- leyendo código de otras personas. Yo he aprendido mucho viendo el código fuente de módulos que hay en CPAN, leyendo los ejemplos de libros como el Perl CookBook, viendo las soluciones en foros como este o en perlmoks.org

De estos tres, Perl CookBook fue fantástico: docenas de ejemplos reales, con su correspondiente solución y una breve descripción de por qué se eligió esa solución.

Hay otros libros para aprender Perl que están muy bien, como por ejemplo Learning Perl. En http://learn.perl.org/ tienes recursos para aprender Perl, poco a poco. En estos foros hay un subforo llamado Formación, con enlaces a tutoriales y manuales, ejemplos, retos...

ostpulse escribiste:entonces entro en dudas de que si, por ejemplo, usase un módulo en vez de fork estaría por decir de alguna forma "aprendiendo menos" porque abordo el problema desde la facilidad de una herramienta creada por alguien el cual sí entiende fork y yo no entiendo fork y por eso hago uso de su módulo...
La documentación que trae con Perl, y que accedes con perldoc (parte traducida), te permite dar una visión de lo más básico del lenguaje (a veces, demasiado básico). Pero... es demasiado extensa. Por fortuna, también trae tutoriales, unos pocos. En perl.pod tienes un índice de toda la documentación (ejecuta perldoc perl).

Es cierto que, si usas un módulo, te pierdes muchas cosas, y al final, no terminas de aprender. Por estos foros verás a muchos programadores que usan módulos para hacer muchas cosas, pero luego, su propio código, es un poco penoso.

Entonces, está mejor aprender lo básico (entender lo que hace fork()), hacer unos cuántos ejemplos, y luego, a la hora de resolver un problema, pues si es algo corto puedes resolver por ti mismo, en lugar de tirar de un módulo. Si el problema es mayor, buscar el módulo más adecuado. Y eso no quita que, por curiosidad, veas el código de ese módulo, para ver cómo el autor lo resolvió ;)

ostpulse escribiste:Entonces, la verdad, agradecería una forma de guiarme en el estudio de Perl porque ganas tengo y de sobra pero no encuentro la forma de guiarme y dado a eso muchas veces empiezo y lo dejo en cuestión de días dado que no sé por dónde seguir o cómo seguir.
Aprender Perl / Por dónde empezar

ostpulse escribiste:Me cuesta reconocer que a diferencia de otros autodidactas del asunto, logran formarse muy bien estructurándose ellos mismos los estudios, sin embargo y aunque me avergüenza siento que debo tener algo por lo que guiarme porque mis pautas de aprendizaje son muy dispersas: un día estudio hashes y el otro día estudio forks... Entonces me pierdo intentando darme una base sólida y no solo con Perl sino con cualquier cosa que intente empezar.
La dispersión es mala, pero también el aburrimiento. Dedícale el tiempo justo a cada cosa. El saber cuánto depende de la importancia de esa cosa. Si te va a servir o no para el futuro. O si solo quieres pasar el rato.

Es cierto, también, que las personas que tienen una base de informática tienen una facilidad mayor para entender ciertas cosas. En Internet tienes sitios donde puedes aprender. Por ejemplo, algo que considero básico, es aprender lo que son Estructuras de datos. Y muchos otros temas.

ostpulse escribiste:Entre mi reflexión de novel y otras cosas, intentaré mejorar en calidad de código y escribir de forma más ordenada. Creo que había un documento que hablaba de cómo escribir código Perl para que sea legible.
El Perl Best Practices es el Santo Grial del estilo de programación en Perl. Si no puedes acceder a él -algo raro-, haz un perldoc perlstyle, y en la Web (traducido al español). Es un resumen de las reglas más importantes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Integrando youtube-dl en Chrome con RainVid

Notapor ostpulse » 2015-03-07 06:27 @310

Hola, explorer :)

Muy agradecido por la guía :) lo pondré en práctica en mis siguientes códigos y ¡¡gracias!!

Ha sido muy placentero leer la crítica y, la verdad, la respuesta me ha encantado, muy estructurada, amena y concisa, ¡¡además de animadora :D !!
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados