Saltar a contenido

Pipeline

Descripción del flujo técnico completo, desde los archivos de audio hasta la web.


Flujo general

Archivos FLAC / DSF
        │
        ▼
   drscan.sh
  (dr14meter + mediainfo)
        │
        ▼
   tracks_dr.csv
        │
        ▼
   create_db.sh
  (importa CSV → SQLite)
        │
        ▼
   music.db  (fuente de verdad)
        │
        ├──▶ generate_conclusions.py  →  JSON (tablas, KPIs, insights)
        │
        └──▶ generate_charts.py       →  PNG (gráficas matplotlib)
                        │
                        ▼
                  mkdocs build
                        │
                        ▼
                  site/  (nginx → dr.priet.us)

Paso 1 — Escaneo de audio: drscan.sh

El script recorre los directorios de FLAC y DSF en paralelo (3 hilos). Por cada archivo extrae metadatos con mediainfo y calcula el DR con dr14meter.

Para no reprocesar archivos ya analizados, deja un marcador archivo.flac.dr_done junto a cada pista. Borrando esos marcadores se fuerza un re-scan completo.

#!/usr/bin/env bash
set -u

BASE_FLAC="...Media/rips"
BASE_DSF="...Media/dsf"
OUT="...Media/tracks_dr.csv"
DRBIN="$HOME/.local/bin/dr14meter"
THREADS=3

Extracción de metadatos

El artista se resuelve con una cadena de fallbacks para cubrir etiquetados inconsistentes: campo MusicBrainz → Album/Performer → Performer → nombre de carpeta. Se descartan listas de músicos (campos con ;) y se limpian ruidos como (guitar).

# 1. campo MusicBrainz / moderno
artist=$(mediainfo --Inform="General;%ARTISTS%" "$f")

# 2. fallback clásico
[[ -z "$artist" ]] && artist=$(mediainfo --Inform="General;%Album/Performer%" "$f")

# 3. fallback por carpeta
[[ -z "$artist" ]] && artist="${base%% - *}"

Álbum y título siguen la misma lógica: metadata embebida primero, nombre de fichero o carpeta como último recurso.

Calidad técnica del archivo

Además de los metadatos musicales, el script extrae información sobre la naturaleza técnica de cada archivo:

Campo Qué mide
sample_rate_hz Frecuencia de muestreo (44100 Hz, 96000 Hz, 2822400 Hz para DSD64…)
bit_depth Profundidad de bits (16, 24, 32 bit PCM; 1 bit DSD)
channels Número de canales (2 = estéreo)
duration_s Duración en segundos
bitrate_kbps Tasa de bits en kbps
dsd_rate Etiqueta legible para DSF: DSD64, DSD128, DSD256, DSD512
sample_rate=$(mediainfo --Inform="Audio;%SamplingRate%" "$f")
bit_depth=$(mediainfo --Inform="Audio;%BitDepth%" "$f")
channels=$(mediainfo --Inform="Audio;%Channels%" "$f")

# DSD rate label derivado de la frecuencia de muestreo
case "$sample_rate" in
    2822400)  dsd_rate="DSD64"  ;;
    5644800)  dsd_rate="DSD128" ;;
    11289600) dsd_rate="DSD256" ;;
    22579200) dsd_rate="DSD512" ;;
    *)        dsd_rate="NA"     ;;
esac

Cálculo de DR

result=$("$DRBIN" -f "$f" 2>&1 < /dev/null)
dr=$(echo "$result" | grep -Eo "DR[[:space:]]*[0-9]+" | head -n1 | grep -Eo "[0-9]+")
dr=${dr:-NA}

dr14meter analiza el fichero y devuelve el valor DR según el algoritmo crest factor del estándar DR Database. El resultado se parsea con grep para extraer solo el número.

Escritura concurrente al CSV

Como el script procesa varios archivos en paralelo, usa flock para garantizar escrituras atómicas al CSV sin que las líneas se entrelacen:

(
    flock 200
    echo "$line" >> "$OUT"
) 200>"$LOCK"

Paso 2 — Importación a SQLite: create_db.sh

Importa el CSV resultante a una base de datos SQLite con la tabla tracks y crea vistas precalculadas (albums, artists, genres) para acelerar las consultas frecuentes.


Paso 3 — Generación de datos para la web

Dos scripts Python leen music.db y generan los artefactos estáticos:

generate_conclusions.py — produce los JSON que alimentan las páginas de conclusiones e insights: resumen global, top álbumes, top artistas, géneros, décadas, álbumes excepcionales y artistas consistentes.

generate_charts.py — genera las seis gráficas matplotlib (histograma, formato, género, década, top artistas, top álbumes) y escribe graficas.md con las captions calculadas desde los datos reales.

# Regenerar todo
python3 docs/generate_conclusions.py
python3 docs/generate_charts.py

Paso 4 — Build y publicación

~/.local/bin/mkdocs build

MkDocs compila los archivos Markdown y los artefactos estáticos (PNGs, JSONs) en el directorio site/, que nginx sirve directamente como dr.priet.us.

No hay paso de deploy separado: el build escribe directamente en la raíz que sirve el servidor web.

# Ciclo completo
make data && make build