Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

Arreglando mi copia de Guias Nintendo

Publicado: 2025-02-25

Etiquetas: Juegos, Linux, Proyectos


Buenos días, tardes o noches:

Hace un mes escribí un artículo comentando que había descargado todo el contenido de Guías Nintendo por si acaso Nintendo la cerraba sin previo aviso. Terminaba aquel texto diciendo que había bajado de Youtube todos los vídeos de las guías pero que muchos estaban en formato MKV y los estaba convirtiendo a MP4.

Vídeos

Estas semanas no he tenido excesivo tiempo libre pero poco a poco he ido reemplazando los enlaces a Youtube por los vídeos convertidos para que así las guías sean autocontenidas y no dependen de nada externo. Las guías que tenían pocos vídeos las he revisado a manos pero otras con cientos de enlaces las he tenido que automatizar. A medida que iba encontrando errores fue mejorando el script de conversión. La versión final es esta:

#!/bin/sh

HTML=$1
DST=$(dirname $HTML)
VIDEOS=./videos/

echo Replacing the first Youtube link in $HTML with a video from $VIDEOS


LINK=$(grep -oE 'https?://(www\.)?youtube\.com/embed/[a-zA-Z0-9_-]+\?rel=0' $HTML -m 1)

if [ -z "$LINK" ]
then
	echo "\e[31mYT Link not found\e[0m"
	exit
fi


echo Found YT link $LINK

ID=$(echo $LINK | cut -d/ -f 5 | cut -d? -f1)

if [ -z "$ID" ]
then
	echo "\e[31mId not found\e[0m"
	exit
fi

echo YT id $ID


VIDEO=$(cd $VIDEOS && ls *$ID*mp4)

if [ -z "$VIDEO" ]
then
	echo mp4 not found looking for webm...

	VIDEO=$(cd $VIDEOS && ls *$ID*webm)

	if [ -z "$VIDEO" ]
		then
		echo "\e[31mVideo not found\e[0m"
		exit
	fi
fi

Dado un fichero HTML, busca un enlace a Youtube dentro de él, extrae el identificador, luego busca un vídeo descargado que tenga el mismo identificador y reemplaza el enlace. En caso de error muestra un mensaje en rojo y para. Visualmente el resultado es prácticamente igual pero en vez de mostrar el vídeo de Youtube (primera imagen) se incrusta un vídeo que está en la propia página (segunda imagen).

Guía de Super Mario Maker for Nintendo 3DS. Muestra un vídeo de Youtube

Guía de Super Mario Maker for Nintendo 3DS. Muestra un vídeo en formato MP4

Había juegos (Captain Toad y Yoshi's Woolly World concretamente) que salieron en varias consolas y las guías reutilizaban vídeos. Para no tener 2 copias de los mismos hice un script especial que usé solo en esas guías.

¿Está todo bien?

Tras varios días reemplazando y validando algunos a mano ya tenía todas las guías con su vídeos en MP3 pero tenía un problema. No podía saber si faltaba algo, si algún vídeo no se había descargado o si había algún problema. Eran varios miles de ficheros HTML. Me hubiera llevado meses mirarlos uno a uno.

Navegando aleatoriamente por algunas guías con el inspector de Firefox abierto encontré algunos errores casi imperceptibles como algún fondo de pantalla o un fichero llamado fondo_buscador.gif que se carga en prácticamente todas las páginas. Era una imagen alargada completamente blanca. Parece que su función es crear una pequeña separación entre el título de la guía y el menú.

Me puse a buscar una forma de detectar automáticamente todos los ficheros que dieran error 404 Not Found. Se me ocurrió una forma algo "bruta". Podía bajarme de nuevo la página entera desde mi servidor local y ver en los logs de Wget qué ficheros faltaban. En su día hice una guía para bajarse webs enteras con Wget que usé para descargar la web de Nintendo. Estaba decidido a usar este método aunque la página ocupaba ya 87 gigas entre texto, imágenes y vídeos así que iba a tardar bastante. Pero, por suerte antes de empezar encontré una opción mejor: Wget tiene el parámetro --spider que comprueba que las URLs existan sin bajárselas. Escribí otra guía sobre cómo hacerlo.

Arreglando enlaces rotos

La primera vez que lo ejecuté me indicó que había cientos de enlaces rotos. Inicié un proceso que duró varios días en los que elegía uno de esos enlaces rotos, lo arreglaba y volvía a ejecutar el spider de Wget para ver cuántos enlaces rotos quedaban.

Entre los enlaces rotos encontré 3 vídeos en los que el enlace de Youtube se había reemplazado mal y daban 404. En vez de mp4 la URL tenía extensión mp40. Con estos enlaces arreglados ya tengo bastante confianza en que todos los vídeos funcionan bien.

Otros enlaces que fallaban era las páginas de política de cookies y de condiciones del servicio. Estás páginas son irrelevantes para la conservación de las guías pero como soy un perfeccionista las descargué, arreglé sus CSS y me aseguré de que estuviera todo bien.

El siguiente grupo de enlaces rotos eran imágenes que aparecen mencionadas en los CSS pero que no se usan en ninguna parte. Igual que antes, por rizar el rizo y que no hubiera ni un error 404 las añadí.

Iconos

Los últimos enlaces rotos eran raros. Eran un montón de ficheros .ico en diversas guías. Esos ficheros no existían en la web oficial. Inicialmente pensé que serían algún tipo de iconos usados en versiones antiguas de la web que ya no estaban pero se habían quedado referenciados en los HTML. He observado que hay un montón de CSS y Javascript en la web que en verdad no se usa así que esto podía ser lo mismo. Pensé en dejarlos tal cual porque no parecían molestar pero luego comprendí de dónde salían. Como expliqué en el artículo anterior sobre Guías Nintendo tuve que eliminar un montón de extensiones .html que se habían colado cuando bajé la página. Una de las conversiones que hice estaba pensada para sustituir todos los "favicon.ico.html" for "favicon.ico". Usé este comando:

sed 's/.ico.html/.ico/g'

El problema es que el primer punto de la expresión en verdad es un elemento especial que reemplaza cualquier carácter de la cadena. Por tanto ".ico.html" también cazaba "sonico.html" o "psiquico.html" y los convertía en "so.ico" y "psiq.ico" respectivamente. Había cientos de enlaces terminados en ico.html que se habían convertido en .ico y por tanto daban error. Estuve un par de días mirando poco a poco qué palabras terminadas en ico necesitaba recuperar e hice un pequeño script para arreglar los enlaces que yo mismo había roto:

#!/bin/sh

F=$1

echo Processing $F

sed -e 's/monstruolo\.ico/monstruologico.html/g' "$F"  \
'-e s/\-a\.ico/-atico.html/g' \
'-e s/fee\.ico/feerico.html/g' \
'-e s/petro\.ico/petrofico.html/g' \
'-e s/triciclis\.ico/triciclistico.html/g' \
'-e s/pradoc\.ico/pradochico.html/g' \
'-e s/fondo_ci\.ico/fondo_civico.html/g' \
'-e s/superso\.ico/supersonico.html/g' \
'-e s/comboso\.ico/combosonico.html/g' \
'-e s/analo\.ico/analogico.html/g' \
'-e s/alqui\.ico/alquimico.html/g' \
'-e s/eo\.ico/eolico.html/g' \
'-e s/cri\.ico/critico.html/g' \
'-e s/pa\.ico/panico.html/g' \
'-e s/a\.ico/atico.html/g' \
> $F.tmp

mv "$F.tmp" "$F"

Tras esto, volví a ejecutar Wget para buscar enlaces rotos y me salió esto:

Found no broken links.

¡Victoria! Doy por concluido este pequeño proyecto de conservación. Le he dedicado más de lo que pensaba pero he aprendido bastante. Principalmente de Wget pero también he refrescado un poco mis conocimientos sobre cómo escribir scripts para el shell.

Página principal de Guías Nintendo

Algunos aspectos se podrían mejorar todavía más. Por ejemplo eliminando archivos repetidos (CSS e imágenes) que están en casi todas las guías. No me puse a hacerlo porque tengo todo este proyecto en un repositorio git así que eliminar ficheros no me va a ahorrar espacio ya que van a seguir en el historial. Además, lo que más ocupa son los vídeos. Borrar unos pocos kilobytes de cada guía no va a cambiar demasiado.

Emilio, te queremos

Finalmente quiero enviar un saludo.

En ninguna parte pone quién ha hecho las guías o creado la página pero hay indicios de que detrás de Guías Nintendo podría estar un tal Emilio. Primero, en algunos vídeos en los que hay Miis o hay que escribir un nombre suelen llamarse "Emilio".

También porque en algunas partes del HTML hay elementos con ese nombre. He encontrado estos en la página principal:

  document.getElementById('emilio').innerHTML=nombre[i];
//document.getElementById('emilio2').innerHTML=misTitulos[i];
  document.getElementById('emilio').innerHTML=nombre[i];
//document.getElementById('emilio2').innerHTML=misTitulos[i];
  document.getElementById('emilio').innerHTML=nombre[a];
//document.getElementById('emilio2').innerHTML=misTitulos[a];
	document.getElementById('emilio').innerHTML=nombre[i];
//document.getElementById('emilio2').innerHTML=misTitulos[i];
<div id="emilio"  style="border:none;color:#FFF;text-align:left;font-size:13px;font-weight:bold;position:relative;z-index:2;left: 15px; bottom: 0px;margin-top:-30px;">
<div id="emilio2"  style="border:none;color:#FFF;font-size:12px;text-align:right;position:relative;z-index:3;top: 5px; left: 0px; right: 10px; bottom: 0px;margin-top:-22px;margin-right:15px;">

Así que, probablemente, Emilio sea alguien muy relacionado con las guías. Al menos durante los últimos 10 años.

Emilio, si alguna vez lees esto: ¡Gracias por todo! Nos ha ayudado mucho a mí y seguro que a mucha más gente. Espero que te vaya todo bien.

Si alguna vez desparece Guías Nintendo subiré mi versión a algún sitio para que quien quiera pueda descargarla y usarla por su cuenta.


Artículo siguiente: Nostalgia
Artículo anterior: Enlaces rotos