Descargar videos de sitios de streaming

Ahora que el título de este post tiene tu atención, debo aclarar que este método puede funcionar en algunos sitios pero no en otros. En particular, lo he usado para descargar de las páginas de Televisa y TV Azteca. La única forma de averiguar si funciona en la página de tu preferencia es probarlo.

En este post usaré Firefox, cURL y FFmpeg para descargar los videos así que si eres, por ejemplo, usuario de Chrome debes buscar en otro lugar.

Read More

Ripear DVD con FFmpeg, Recargado

Hace tiempo escribí algunos posts con instrucciones para ripear un DVD usando FFmpeg. En esos posts mencionaba que primero deberías probar con Handbrake antes de intentar ripear el DVD de la forma difícil desde la línea de comandos usando MPlayer y FFmpeg. Entonces, ¿cuál es la razón para escribir este post? ¿Cuál es el problema con Handbrake?. El problema de Handbrake es el típico problema de Linux de interfaces de usuario terribles 😦 . Si eres como yo y quieres ripear todos los títulos de un DVD, con Handbrake tienes que seleccionar un título, configurar las opciones, agregarlo a la cola de tareas y después seleccionar el siguiente título y repetir 😦 . Aunque el proceso puede tomar solamente unos cuantos clicks, cuando te encuentras con un DVD con muchos títulos, esos son algunos cientos de clicks más de los que quiero hacer; sin mencionar que tienes que escribir manualmente el nombre para cada uno de los archivos de salida ya que Handbrake te sugerirá el mismo nombre para todos los títulos sin importar si ya tienes uno con ese nombre en la cola de tareas. No entiendo como el programa “especializado” para ripear DVDs no tiene una opción para seleccionar varios o todos los títulos de un DVD 😦 .

Read More

Instalar Allegro 4 / Allegro 5

Recientemente el blog ha recibido algunas visitas de búsquedas relacionadas con Allegro (principalmente en su versión 4.x). En posts anteriores escribí la forma de compilar Allegro para Debian Jessie ya que la versión en el repositorio estable era muy antigua pero Debian Stretch ya tiene una versión más reciente en el repositorio estable así que, si eres usuario de Linux, la forma más sencilla de instalar Allegro es instalar los paquetes correspondientes desde el gestor de paquetes de tu distro.

Para Allegro 4 basta con instalar los paquetes liballegro4.4 y liballegro4-dev.  También se pueden instalar las librerías de soporte para Allegro 4 como liballeggl4.4, libguichan-allegro, libjpgalleg4.4, libloadpng4.4, liblogg4.4 y sus respectivos paquetes de desarrollo *-dev. Nota que también está en el repositorio el paquete libopenlayer que ofrece acelaración por hardware para Allegro 4 pero si quieres acelaración por hardware deberías optar mejor por Allegro 5.

Para instalar Allegro 5 debes instalar todos sus paquetes y addons: liballegro5.2, liballegro-acodec5.2, liballegro-audio5.2, liballegro-dialog5.2, liballegro-image5.2, liballegro-physfs5.2, liballegro-ttf5.2, liballegro-video5.2 y sus respectivos paquetes de desarrollo *-dev.

También puedes instalar la documentación instalando los paquetes allegro4-doc y allegro5-doc.

Ahora bien, si eres usuario de Windows, puedes compilar Allegro manualmente o puedes descargar las librerías precompiladas desde esta página. Nota que estos archivos contienen las librerías para compilar programas usando Allegro y también contienen los archivos DLL necesarios para ejecutar los programas de Allegro. Yo solía usar estas versiones cuando usaba Windows y el compilador MinGW. Notarás que estas librerías precompiladas de Allegro son un poco antiguas, con la versión 5.0.10 de Allegro 5 y se pueden instalar en versiones viejas de MinGW o MS Visual Studio. Para versiones más recientes de Allegro o para instalar en compiladores más recientes puedes usar las versiones precompiladas directo de la página de Allegro que incluye varias opciones para instalar las versiones más recientes de Allegro en compiladores recientes.

En corto No. 12 -FFmpeg AV1

Si eres usuario de Firefox, es probable que en días recientes hayas visto notificaciones de Mozilla sobre el codec de video AV1 que promete una compresión de video incluso mayor a la de x265/HEVC mientras que, al mismo tiempo, es un formato abierto y libre de regalías.

Decidí hacer pruebas con este nuevo codec usando FFmpeg. Lo primero que noté es que la versión de FFmpeg en el repositorio estable de Debian aún no soporta este formato, así que tuve que ir directo a la página de FFmpeg donde me llevé la grata sorpresa de que ahora se ha unido a la creciente lista de software para que ofrece static builds, ejecutables precompilados y listos para usar para Linux. Ya en posts anteriores he mencionado lo difícil que era conseguir ejecutables listos para usar en Linux, lo que solía dejarte solamente dos opciones: usar una versión vieja del software o compilarlo tú mismo. Al parecer esto empieza a cambiar ya que cada vez veo más programas para Linux que ofrecen versiones listas para usar ya sea en forma de static builds o como contenedores de Docker, Flatpak, etc., y esto me alegra.

Volviendo a FFmpeg, la página ofrece la alternativa de instalarlo usando los repositorios de backports o deb-multimedia, o bien el ya mencionado static build. Descargué el static build y después de descomprimirlo estaba listo para usar; sin embargo, al intentar codificar un video usando el codec AV1 descubrí que la velocidad de codificación era de ~0.02 fps, en otras palabras, es imposible de usar 😦 .

Actualmente el codec AV1 está clasificado como experimental en FFmpeg por una razón y no está listo para el uso cotidiano. No hace mucho tiempo, el codec x265 también era muy lento en FFmpeg pero ha sido optimizado desde entonces. Es lógico pensar que seguramente el codec AV1 también será optimizado una vez que esté correctamente implementado. Hasta entonces, habrá que esperar.

Queja Firefox

Me siento culpable por escribir esto, he sido un usuario de Firefox literalmente desde su primera versión y aunque he probado otros navegadores siempre regreso a Firefox pero, ¡diablos!, hasta yo tengo que reconocer que los desarrolladores de Mozilla a veces toman decisiones de diseño bastante estúpidas. No es de sorprender que en los últimos años Firefox perdiera presencia y se convirtiera en un navegador de nicho usado solamente por nerds y fans del software libre (nerds). La gente normal evita Firefox como la plaga, incluso me ha pasado que cuando alguien me ve abrir Firefox me miran con lástima y me dicen “¿Por qué no bajas el Chrome? Es gratis”.

Ya antes escribí un post sobre la molestia generalizada que causó entre sus propios usuarios cuando Firefox decidió quitar el soporte para complementos que no usaran Web Extensions. Por suerte el NoScript se adaptó rápidamente al nuevo modelo pero la decisión afectó a muchos complementos, ¡incluso algunos propios de Mozilla!, que ya no son compatibles 😦 . No más Scrapbook, no más soporte para guardar archivos MAFF (de vuelta al horrible sistema de .html + carpeta), ¡hasta el complemento de Mozilla para checar si tus complementos son compatibles es incompatible!.

firefox-addons

Luego está la idea de Mozilla de “notificaciones no intrusivas” cuando Firefox te pregunta si quieres guardar tus contraseñas o recibir notificaciones de páginas, el mensaje no desaparecerá y se quedará estorbando hasta que no lo cierres manualmente 😦 . Por otro lado, cuando quieres control manual del reproductor de video integrado de Firefox (no un reproductor Javascript como el de youtube sino el reproductor nativo de Firefox) haces click sobre el video para que tenga el focus del teclado para poder poner y quitar la pausa con el teclado pero el focus desaparece sin razón aparente obligándote a usar el mouse 😦 .

Y aún hay más, como una de las decisiones de diseño más estúpidas de Firefox en la que hace tiempo cambiaron el comportamiento de la barra de direcciones de algo que era confiable y tenía sentido a un comportamiento al azar porque “oh, so random!”. No, en serio, en versiones anteriores de Firefox, cuando empezabas a escribir en la barra de direcciones, la primer sugerencia siempre era la página que visitabas con más frecuencia, así que podía ser www.google.com o monstrochan.org/l/, las sugerencias siempre eran consistentes así que podías escribir unas cuantas letras y después presionar Abajo y Enter y estabas en la página que querías visitar. Ahora, en cambio, tienes que perder tiempo revisando las sugerencias porque nunca sabes si la primera sugerencia es la página que quieres visitar, el dominio principal que nunca visitas (como la página principal de monstrochan.org) o una búsqueda en Google de lo que has escrito en la barra de direcciones 😦 .

Por último, la más reciente molestia con Firefox y la que me hizo escribir este post. Firefox te permite personalizar la barra de herramientas pero ¿cuál es el caso si cada que se instala una actualización ignora tu configuración personalizada 😦 ?.

firefox-2

Barra de herramientas personalizada

firefox-1

Barra de herramientas después de cada actualización de Firefox

La mayoría de estas molestias son cosas sencillas que no deben requerir mucho trabajo o código para corregirse pero entonces, ¿por qué siguen existiendo estas fallas o apareciendo nuevas molestias con cada nueva versión de Firefox?. Pareciera que los desarrolladores están más preocupados agregando nuevas animaciones inútiles o cambiando la paleta por colores pastel para complacer a la nueva sociedad SJW en lugar de trabajar en hacer que la interfaz trabaje de una forma confiable y consistente 😦 .

Hibernación en Debian Stretch

En un episodio más de la saga de “¡¿Por qué hasta las cosas más simples tienen que fallar épicamente en Linux?!”, en esta ocasión hablaré sobre la opción de hibernar en Debian Stretch. El menú de apagado de LXDE (y de cualquier otro escritorio, supongo) muestra prominentemente las opciones de apagar, reiniciar, suspender e hibernar. Las primeras dos opciones no necesitan más explicación. A grandes rasgos, la opción de suspender apaga todos los dispositivos pero mantiene el voltaje en la memoria RAM de manera que cuando reinicies la PC todo estará tal como lo dejaste. La opción de hibernar es muy parecida a la opción de suspender pero esta vez el estado de la PC se guarda en el disco duro (efectivamente se guarda en el disco duro una copia de todo lo que está en la RAM) y después la PC se apaga completamente, no se mantiene el voltaje en ningún dispositivo y, cuando reinicias la PC, el sistema restaurará la copia de la RAM de manera que la PC volverá al estado en que estaba antes de apagarla.

Mi problema en esta ocasión es que, mientras que la opción de suspender funciona correctamente, al seleccionar la opción de hibernar en Debian Stretch lo que obtengo es que la pantalla se apaga y el disco duro se pone a trabajar como si estuviera guardando la copia de la RAM pero después, ¡boom!, estoy de vuelta en la pantalla de inicio de Debian porque la hibernación falló 😦 . Como es usual en estos casos, no hay un mensaje de error o alguna información útil para saber cual fue el problema; como es usual, estás a ciegas 😦 .

Para no hacer este post tan largo, resulta que Linux hiberna usando el espacio de swap, esta es una solución ingeniosa y que tiene sentido y debe ser la razón por la que siempre te recomiendan crear una partición de swap mínimo con el mismo tamaño que tu memoria RAM (algunas fuentes recomiendan incluso el doble de la RAM) pero, en mi caso, cuando instalé Linux en un disco de 10 GB para probarlo, no podía usar la mitad del disco duro como swap así que elegí crear una partición de swap de apenas 464 MB así que cuando la carga promedio de RAM en mi sistema con algunos programas abiertos es de ~1.5 GB era obvio que no cabía en la partición de swap y por lo tanto sería imposible hibernar con todos mis programas abiertos pero… si cierro todos mis programas la carga de RAM está por debajo de los 400 MB, suficiente para que quepan en la partición de swap y que el sistema pueda hibernar de forma correcta, ¿cierto?. ¡NO! ¡La hibernación sigue fallando aún con una carga de apenas ~350 MB en la RAM!. Maldición 😦 .

¿Por qué pasar tantos problemas si igual estoy cerrando todos mis programas? Bueno, mantener mis puntos de montaje manuales y el estado de pointerkeys son razón para preferir la hibernación a un apagado total, sin mencionar que el arranque desde el estado de hibernación es un poco más rápido que un arranque normal.

Entonces, ¿por qué la hibernación no puede guardar ~350 MB de RAM en uso en una partición swap de 464 MB?. Resulta que Linux mantiene en caché en la RAM los programas y archivos que has abierto recientemente en caso de que quieras abrirlos otra vez, esto es bueno, Linux administra la RAM así que no tienes que preocuparte por este caché ya que Linux lo liberará automáticamente si tus programas en ejecución solicitan más memoria. Aunque el caché de archivos en RAM es bueno para el uso de la PC, la hibernación no libera este caché (en mi opinión, debería) y eso causa que la memoria usada por el caché sea marcada como memoria en uso a pesar de que en realidad sean solamente ~350 MB los que están siendo usados por programas activos, así que para poder lograr que el sistema entre en modo de hibernación es necesario borrar manualmente el caché en la RAM y, para variar, esto requiere usar algunos oscuros y arcanos comandos desde la línea de comandos:

monstruosoft@debian:~$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches' 
[sudo] password for monstruosoft: 
monstruosoft@debian:~$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
monstruosoft@debian:~$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

Después de ejecutar los comandos anteriores, la memoria en uso reportada será solamente la que está siendo usada por los programas activos, no más archivos en caché. Ahora es posible seleccionar la opción de hibernar y la PC entrará correctamente en modo de hibernación. Puedes poner estos comandos junto con el comando systemctl hibernate en un script y ejecutar el script cuando quieras poner la PC en modo de hibernación.

Para entender mejor lo que está pasando, veamos el uso de memoria antes y después de limpiar el caché:

# Uso de memoria habitual con varios programas abiertos
# 1.3 GB en uso, 1.6 GB en el caché, 2.2 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924     1398856      959596       96980     1617472     2190836
Swap:        475132       42668      432464
# Uso de memoria después de cerrar todos los programas
# 400 MB en uso, 2.5 GB en el caché, 3.2 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924      408548     1015396       23796     2551980     3254324
Swap:        475132       42664      432468
# Uso de memoria después de limpiar el caché en RAM
# 380 MB en uso, 120 MB en el caché, 3.4 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924      383188     3471164       23796      121572     3399740
Swap:        475132       42664      432468

Todos estos problemas para hibernar si tu partición de swap es pequeña se podrían resolver fácilmente si el comando para hibernar liberara automáticamente el caché en RAM pero como siempre, Linux tiene que hacer incluso las cosas más sencillas terriblemente complicadas 😦 . Oh, olvidé mencionar que si tienes archivos en directorios ramfs, como /dev/shm, es mejor que los borres manualmente también o la hibernación intentará mantenerlos y podría incrementar el tamaño de la copia de la RAM que se tiene que almacenar en tu partición swap.

Convertir video para reproductor de DVD LG DP122

Muchos reproductores de DVD antiguos de la marca LG tienen soporte para reproducir archivos de video MPEG4 (no confundir con MP4) basado en los codecs Xvid o DivX. Estos codecs eran los más populares en el internet de hace unos años antes de la llegada de codecs como x264. Si, como yo, tienes uno de estos antiguos reproductores de DVD y quieres convertir un video al formato MPEG4 para poder reproducirlo, debes tener en cuenta las siguientes condiseraciones:

  • Revisa que tu reproductor de DVD tenga el logo MPEG4 o DivX.

  • El formato contenedor debe ser AVI, recuerda que es un reproductor antiguo.

  • El codec de video debe ser Xvid o DivX.

  • El codec de audio debe ser MP3.

  • El FourCC de video debe ser XVID o DIVX.

  • Los formatos soportados por tu DVD pueden ser diferentes, revisa la documentación.

Para convertir un video al formato necesario para reproducirlo en el DVD usaremos FFmpeg:

monstruosoft@debian:~$ ffmpeg -i video.mkv -c:v mpeg4 -vtag XVID -c:a mp3 -b:a 128k -q:v 4 salida.avi

La opción -vtag hará que FFmpeg use el FourCC XVID en lugar del valor predeterminado FMP4 que no es reconocido por el reproductor de DVD.

Grabar DVD en Debian Stretch

Después de años sin grabar un DVD, hace poco me vi en la necesidad de volver a utilizar el arcano arte de usar el quemador de discos de mi PC. En el pasado escribí un par de posts sobre las herramientas para grabar CD/DVD en Linux pero no puedo creer que nunca escribí un post con las instrucciones para grabar un disco con esas herramientas. En posts anteriores mencioné que tuve malas experiencias con algunas herramientas GUI y había otras con las que simplemente no podía soportar su horrible interfaz gráfica así que la línea de comandos era la última alternativa.

Desde que actualicé a Debian Stretch no recuerdo haber grabado un solo DVD así que no es de sorprender que no tuviera instalada ninguna herramienta GUI en mi sistema. Después de años sin grabar un DVD tampoco recordaba las instrucciones para hacerlo así que probé con cdw, un programa con una interfaz gráfica pero en modo de consola. Desafortunadamente cdw me marcaba errores con el disco DVD-RW que intentaba utilizar 😦 , esto me hizo preguntarme, tal como me lo preguntaba hace años, ¿por qué una tarea tan básica como quemar un disco tiene que ser tan complicada en Linux? Tienes que pelear con el software porque ¡las herramientas hechas para una tarea específica fallan al intentar llevar a cabo esa tarea! ¡Esta es una de las razones por las que Linux nunca será apto para un usuario común y corriente!.

cdw-error

Por cierto, para borrar un DVD: wodim dev=/dev/sr0 blank=fast

En fin, tal parece que todas las herramientas GUI, ya sea gráficas o de consola, para quemar discos son terribles para esa tarea, no me quedaba más que usar la línea de comandos.

Grabar un DVD desde la línea de comandos es un proceso de dos pasos en Debian Stretch; primero debemos usar genisoimage para generar un archivo .iso que contenga los archivos que deseamos grabar. A continuación debemos grabar el archivo .iso al DVD usando una herramienta como wodim. Sí, sé que también escribí en el pasado un post sobre cómo instalar una versión actual de cdrtools pero esta vez no valía la pena hacer todo eso para grabar un simple DVD.

Para generar una estructura compleja de directorios con genisoimage es necesario usar la opción -graft-points, tal como lo indica la documentación, pero para grabar simplemente unos cuantos archivos al DVD podemos usar algo como:

monstruosoft@debian:~$ genisoimage -v -J -r -V ETIQUETA -o file.iso archivo1.txt archivo2.jpg
monstruosoft@debian:~$ wodim -v dev=/dev/sr0 -dao file.iso

El ejemplo anterior generará con genisoimage un archivo .iso que contiene los archivos archivo1.txt y archivo2.jpg y a continuación grabará el DVD usando wodim. Así que, básicamente, es necesario crear un archivo .iso temporal, lo que significa que si quieres grabar un DVD de 4 GBs necesitas generar en tu disco duro un archivo temporal de 4 GBs, eso apesta, ¿cierto?. Bueno, aquí es donde las pipes entran al rescate; es posible enviar la salida de genisoimage directamente a wodim ya sea usando una pipe:

monstruosoft@debian:~$ genisoimage -v -J -r -V ETIQUETA archivo1.txt archivo2.jpg | wodim -v dev=/dev/sr0 -tao -

o una named pipe:

monstruosoft@debian:~$ mkfifo my_pipe
monstruosoft@debian:~$ genisoimage -v -J -r -V ETIQUETA -o my_pipe archivo1.txt archivo2.jpg
monstruosoft@debian:~$ wodim -v dev=/dev/sr0 -tao my_pipe

Si obtienes un error al utilizar wodim junto con una pipe o named pipe es posible que necesites especificar el tamaño del archivo .iso con anticipación. Puedes obtener un cálculo del tamaño del archivo .iso que generará genisoimage usando el siguiente comando:

monstruosoft@debian:~$ genisoimage -R -q -print-size archivo1.txt archivo2.jpg
40296

El número que imprime el comando anterior es el tamaño en sectores de la imagen .iso que generará genisoimage para los archivos especificados. Conociendo con anticipación el tamaño del archivo .iso es posible usar la opción -dao de wodim usando una pipe o named pipe, por ejemplo:

monstruosoft@debian:~$ genisoimage -v -J -r -V ETIQUETA -o my_pipe archivo1.txt archivo2.jpg
monstruosoft@debian:~$ wodim -v dev=/dev/sr0 -dao -tsize 40296s my_pipe

Nota la s al final del valor del argumento -tsize, ésta indica que el valor está en sectores y no en bytes.

Tarea de programación C: El juego de la vida de Conway

El juego de la vida de Conway es una tarea clásica de cualquier curso de programación. El juego consiste en un conjunto de reglas sencillas que definen si las células en un tablero viven o mueren. Es interesante observar cómo estas sencillas reglas pueden formar patrones complejos.

conway

La versión del juego de la vida en este post fue escrita en C con Allegro 5 como un reto de programación de 24 horas y decidí usar un tablero de tamaño relativamente grande, una ventana de 800×600 pixeles donde cada pixel es una célula, ya que algunos patrones complejos son difíciles de observar si se elige un tablero muy pequeño.

Hay que tener en cuenta que, debido al límite de tiempo, sólo estaba enfocado en terminar el reto aunque el código no fuera muy eficiente, por lo que esta versión puede fácilmente llevarse el 100% del CPU. Tengo algunas ideas para optimizar el código, editaré este post cuando aplique los cambios.

Para compilar en Linux simplemente descarga el código desde github y compila usando cmake y make:

monstruosoft@debian:~/life$ mkdir build
monstruosoft@debian:~/life$ cd build
monstruosoft@debian:~/life/build$ cmake ..
monstruosoft@debian:~/life/build$ make

El programa también debe compilarse correctamente en Windows si tienes Allegro 5 instalado.

[EDIT:] He actualizado el código en github. Las optimizaciones que hice no ayudaron mucho a reducir el uso del CPU durante la simulación pero al menos se corrigió el uso del 100% del CPU cuando la simulación estaba inactiva.