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