Metal Globe
En vivo usablePuse 195 679 bandas de metal sobre un globo 3D, filtrable por país, género y década.
195 679 bandas de metal de 153 países sobre un globo 3D navegable: filtros por país, género y década, con fichas y treemap que vuelven legible un catálogo imposible de leer en tabla.
Tecnología
- Frontend
- Visualización
- Scraping
Sector
- Música & cultura
Problema
Encyclopaedia Metallum tiene el dato -casi 200 000 bandas- pero su propio sitio es una lista plana e imposible de filtrar. No hay forma de ver de dónde sale una escena, cómo se compara un país con sus vecinos, o cómo cambian los géneros por región sin recorrer cientos de tablas paginadas.
Enfoque
Scraper propio sobre Encyclopaedia Metallum, pipeline de datos y una visualización sin frameworks, construida para sobrevivir tanto a una conexión lenta como a una escena 3D exigente al mismo tiempo.
Metal Archives no tiene API pública y, al momento de este build, sus páginas están detrás de un
desafío Cloudflare Turnstile que bloquea tanto a requests como a navegadores headless. La vía
que funcionó fue Scrapling sobre Camoufox (un Firefox sigiloso): un humano resuelve el desafío
una vez, y esa misma sesión de navegador ya caliente recorre todos los países sin ser desafiada
de nuevo -un lanzamiento nuevo del navegador genera un fingerprint distinto y vuelve a ser
bloqueado-, así que el scraping corre como una sola sesión local continua en vez de un job
distribuido.
Las bandas, géneros y metadatos por ciudad alimentan un pipeline en Python que resuelve la taxonomía de géneros, geocodifica países y arma un único JSON que consume el frontend. El globo en sí es WebGL escrito a mano con three.js: fronteras TopoJSON reales proyectadas sobre una esfera, pines por ciudad y un nivel de detalle que muestra países nombrados y paneles de treemap a medida que la cámara pasa de vista planetaria a continental y a país -sin más librería de gráficos o globo que three.js y ECharts para los paneles laterales-.
El index.html original de 4 408 líneas enviaba todo -markup, estilos y lógica- en un solo
archivo. Hoy se parte limpio en index.html, styles.css, data.js y app.js, con las
banderas cargadas en lazy por país en vez de empaquetadas de entrada.
Resultado
- bandas indexadas
- 195.679
- países cubiertos
- 153
- líneas del HTML principal tras el split
- 496
web/data/bands_index.json
web/data/atlas_data.json
web/index.html
Estándares
| Calidad de software (ISO/IEC 25010) | No se corrió un checklist formal de ISO/IEC 25010. La mantenibilidad se atacó directo: el monolito de 4 408 líneas se partió en index.html + styles.css + data.js + app.js sin cambiar un píxel. |
|---|---|
| Rendimiento web (Core Web Vitals) | no medido |
| Accesibilidad (WCAG 2.2) | no medido |
| Software de investigación (FAIR4RS) | n/a — no es software de investigación |
| Higiene de seguridad | Sin secretos en el repo. El estado de sesión del navegador en data/cache/*_state.json queda gitignoreado antes de hacer público el repo. |
| Reproducibilidad | El pipeline de scraping está totalmente scripteado (scraper/*.py), pero Cloudflare Turnstile exige un clic humano por sesión, así que una corrida desde clon limpio no es automática de punta a punta. |
| Metodología de benchmark | sin benchmark declarado |
| Documentación de datos / modelo | n/a |
| Versionado y registro de cambios | Sin SemVer ni CHANGELOG; historial de commits plano en GitHub. |
Qué haría después
- Partir app.js (2 959 líneas) igual que ya se hizo con index.html, en módulos por función.
- Sumar el filtro género × país (hoy solo unidireccional) propuesto como siguiente iteración.
- Superar el clic manual de Cloudflare en el scraping, o documentarlo como restricción permanente en vez de pendiente.