¡Mi primer programa para desacargar videos de YT!

in GEMS2 years ago


screenshot_2022_02_28_23_15_08_251_com.miui.videoplayer.jpg
Una noche de programación.



Hace un par de días atrás, en uno de mis momentos de ocio en la PC, intentaba descargar unos tutoriales de Youtube, y se me ocurrió hacer mi propio programa para descargar los videos de la página.

Ésta idea estuvo dando vueltas en mi cabeza por un rato, pues, el asunto de hacer un programa así era algo complicado para mi -desconocía como funcionan y por dónde empezar-, pero aún así decidí intentarlo y... ¡lo logré!. Hoy voy a compartir contigo parte del proceso.

Antes de continuar pido que me disculpes si mi redacción no es tan buena, aún no se me da eso de escritor.

Primero lo primero...

LA IDEA Y CÓMO SURGIÓ.

El programa que usaba regularmente para descargas volvía la tarea algo tediosa en ocasiones, puesto que el enlace de descarga tiene un tiempo límite de disponibilidad, y cuando este caduca el programa me pide usar la opción de "refrescar o actualizar" dicho enlace, pero, NO LO HACE POR SI SOLO 😐, esto implicaba para mi:

  1. volver a youtube.
  2. buscar el video nuevamente.
  3. seleccionar la calidad del video.
  4. esperar a que el programa lo detecte para que pueda mostrar el boton "Download".

Muchos dirán que no ven el problema en eso, pero cuando tienes una pésima conexión a Internet, el tener que realizar de nuevo todos esos pasos se torna incluso frustrante -súmale a cada paso el tiempo de espera o el tener que recargar la página porque dicho tiempo se terminó y volver a esperar, ahora multiplícalo por los videos que están en la cola de descarga-. Asi que me dije "necesito un programa que me permita descargar el video y omitir esos pasos si ocurre algún fallo en la descarga", y ¡voalá!, nació la idea.

EL DISEÑO DEL PROGRAMA.

Esta etapa es fundamental en el desarrollo de cualquier aplicación. Nos permite tener una idea de lo que vamos a desarrollar, cómo debería funcionar y cómo lo vamos a desarrollar -el punto de partida y de referencia-.

Identificar la tarea o función principal del programa es el primer paso y ya la tenemos, ahora es momento de las preguntas clave: ¿cómo vamos a desarrollarlo?, ¿cual tecnología sería la mejor?, ¿cómo va a lucir?, ¿de qué manera vamos a darle los datos (la URL y la calidad) del video?, ¿cómo será la estructura del proyecto?, entre otras que van saliendo a la luz a medida que avanzamos.

-Es aquí donde empieza el desarrollo-.

Basándonos en la función principal, necesitamos una manera de darle al programa la Url del video a descargar. Eso lo haremos mediante una interfaz gráfica -no queremos abrir el archivo del programa pegar la Url y guardar los cambios en él cada vez que se quiera descargar un video-.

Decidí usar la consola de comandos (CMD) como interfaz, para minimizar al máximo el uso de recursos RAM y CPU de la PC y ahorrar algo de tiempo al no tener que diseñar una sólo para ese propósito.
Esto significa que lo que voy a desarrollar será un programa de línea de comandos.

La dirección donde guardará el video será en la carpeta "Descargas" de la PC y en formato "mkv".


image.png

Usaré como tecnología a Node-js, que en esencia es un entorno de ejecución para Javascript (lenguaje de programación interpretado), la razón de esto es que "Node" me permite desarrollar aplicaciones web, de escritorio, y más. Perfecto para este mini proyecto porque usaremos módulos diseñados para lo que queremos hacer -no reinventaré la rueda, es poco o nada práctico-.

Hasta ahora tengo más o menos claro qué debo hacer:

  1. crear la línea de comandos personalizada que tome los datos necesarios.
  2. buscar las herramientas o módulos necesarios para la tarea de descarga.
  3. aprender e implementar dichos módulos.


1era parte.

HORA DE ESCRIBIR ALGO DE CÓDIGO!.

Empecemos por crear la línea de comandos y el script que ejecutará. Para ello debo:

  • Crear las carpetas y el archivo "bin.js" -según la estructura prediseñada-.
  • Dar la instrucción al script de mostrar un mensaje, (sólo para saber si el comando funciona).
  • Iniciar el proyecto de Nodejs para generar el archivo de configuración con la información básica del proyecto.
  • Establecer la configuración necesaria para crear el comando personalizado y la ruta hacia el script que hará todo el trabajo.
  • Convertir el proyecto en una nueva línea de comandos.
  • Comprobar que funcione.


20220524_121307_1_.gif
Configurando línea de comando personalizada.

¡Listo, ya tengo nuestra línea de comandos personalizada!.

-Hora de hacer que tome los datos necesarios-.


En este punto debo volver a la etapa de diseño para determinar cómo va a pedir los datos finalmente.
Decidí que el programa luego de tomar inicialmente la URL, muestre una lista de opciones para elegir el formato y la calidad, usando para ello el módulo Inquirer que me facilita la tarea de hacer la CMD dinámica para este propósito, luciendo finalmente así:


ezgif_4_0b0238144f.gif
Interfáz terminada.

Hasta ahora he cumplido con la primera parte del objetivo.


2da parte.

PROCESO DE INVESTIGACIÓN.

En esta etapa me dediqué a buscar, comprender y luego a comparar los diferentes módulos que puedan realizar la tarea de descarga para determinar cuál sería el indicado.

Transcurrido un tiempo, encontré el que mejor se ajusta a mi necesidad "ytdl-core". Con él puedo obtener el título del vídeo, el nombre del autor, tamaño o peso del archivo y lo mejor de todo... La calidad del audio y video, además de la opción de descargarlos por separado, por lo que puedo obtener el audio de un vídeo musical y guardarlo como mp3.


3ra parte.

IMPLEMENTANDO YTDL-CORE.

Aquí empecé a escribir el código para la tarea principal del programa, iniciando las pruebas con vídeos de baja calidad (140p a 360p) y de un tiempo de reproducción bastante corto para comprobar que todo marchaba bien. Luego de unos minutos había terminado. -O ESO PENSABA-.


por_queeeee.png

El programa ya funcionaba, así que comencé a descargar algunos tutoriales con una mejor resolución o calidad (480p - 720p ) suficientes para mi, pero !¿adivina qué?! ¡LOS VÍDEOS AHORA NO TIENEN AUDIO!.

Descubrí que la mayoría de las veces los vídeos de YouTube con una calidad o resolución superior a 360p no vienen con el audio incluido. Así comprendí que ésta era la principal razón del módulo para descargar audio y vídeo por separado.


haaa_ya.png

Esto lo aprendí por las malas tras haber descargado 6 tutoriales de 1 a 3 horas de duración cada uno sin antes leer detenidamente el apartado de la documentación del módulo donde explica claramente esto.



TRES COSAS MÁS POR RESOLVER.

El tener que realizar la descarga de esta manera traía consigo otros problemas e interrogantes:

  1. ¿Cómo unir audio y vídeo en un sólo archivo?.
  2. ¿Cómo convertirlos a formato ".mkv" o ".mp3"?.
  3. ¿Que módulo me permitiría resolver las anteriores?.

DEVUELTA A LA INVESTIGACIÓN.

Encontré el módulo para estas nuevas tareas en la misma documentación de ytdl-core llamado ffmpeg-static, un módulo con binarios estáticos de la herramienta de línea de comandos ffmpeg.

En lengua terrestre, contiene todo el código requerido de dicha herramienta, por lo que no es necesario instalarla en la PC como un típico programa aparte.


a_adiendo_c_digo.gif
Añadiendo el nuevo código necesario.

Invertí un poco más de tiempo para comprenderlo y escribir el código adicional necesario y ¡Voala!. La App está totalmente funcional.


app_finished.gif
Programa terminado y funcionando.

Empecé con una idea, y termine con mi propio programa.

Aunque el programa ya realiza la tarea principal, le faltan unas funciones extras como: retomar la descarga desde el punto donde se quedó en caso de que ocurra un error durante el proceso y permitir crear una lista o cola de descarga. Estas funciones se las añadiré más adelante -por ahora estoy conforme-.


Dedicación. dedicación y más dedicación...


Si bien parece sencillo y fácil (que de hecho lo es), para mí no lo fue tanto. Como mencioné al principio "desconocía como funcionan estos programas", por lo que me tomó alrededor de 12 horas más o menos terminarlo.
La mayor parte del tiempo lo dediqué a investigar y entender qué hace y cómo funciona cada cosa, luego en refactorizar todo el código que escribí.

Programar y codificar es un tanto difícil, pero no necesariamente tiene que serlo a tal punto de convertirse en una actividad frustrante.
Creo que todo está en la práctica diaria y tener una sed de aprender y entender CÓMO FUNCIONA, PARA QUE SIRVE ESTO O AQUELLO, COMO SE IMPLEMENTA, QUE PUEDES Y NO PUEDES HACER....

Cuando de verdad entiendes verás qué fácil se torna todo el proceso. En este punto creo que cualquier cosa relevante a la rama de la programación en la que estés podrás hacerlo, habrán retos más difíciles pero no será tortuoso.

Procura siempre hacer las cosas a tu propio ritmo.

Gracias por dedicar tu valioso tiempo a leer este post. Espero que halla sido de tu agrado.

Saludos!. Hasta la próxima!.