Media Hacklab
Laboratorio universitario de experimentación e innovación en intelixencia artificial e xornalismo
Este repositorio contén o código fonte e documentación do proxecto GallaecIA Media Hacklab, un sistema automatizado para a xestión e visualización de contidos multimedia educativos.
O proxecto está deseñado para servir como plataforma de publicación e arquivo histórico de proxectos académicos, con optimización automática de recursos multimedia e unha interface retro-futurista.
Nota importante: Este repositorio contén unicamente a estrutura base do proxecto e non inclúe datos persoais nin contidos multimedia reais.
Sistema de creación e actualización automática de galerías multimedia, acordeóns e bloques de contido, sen necesidade de editar HTML manualmente. Inclúe detección automática de cambios por timestamps e preservación de edicións manuais. Permite manter sempre actualizada a web cos últimos proxectos, vídeos e audios.
Deseño baseado en HTML5, CSS3 (Grid/Flexbox) e JavaScript vanilla, sen dependencias de frameworks pesados. Interface retro-futurista inspirada en terminais, optimizada para dispositivos móbiles e escritorio con compatibilidade cross-browser e multiplataforma.
Scripts en Python e Bash con compatibilidade multiplataforma (Linux, macOS, Windows, FreeBSD) para optimizar vídeo/audio, xerar miniaturas, controlar o seguimento de arquivos e automatizar a xeración de bloques HTML e metadatos. Detección automática do sistema operativo e procesamento paralelo eficiente. Facilita o mantemento e reduce erros humanos.
Almacenamento de metadatos e configuración en arquivos JSON, sen necesidade de bases de datos externas. Inclúe protección con .htaccess para evitar execución de scripts e accesos indebidos.
Formulario web para documentar a metodoloxía de cada proxecto, con almacenamento estruturado en JSON e panel de xestión para o profesorado.
Separación clara entre datos persoais e repositorio open source. Protección de cartafoles sensibles e arquivos xerados automaticamente para evitar filtracións.
Aplicación web progresiva con Service Worker, cache offline, instalación en dispositivos móbiles e escritorio. Inclúe notificacións e funcionalidade offline avanzada.
O proxecto segue unha organización modular para facilitar o mantemento e a ampliación:
gallaecia_media_hacklab/
├── index.html # Páxina principal do sitio web
├── directorio.html # Índice navegable do repositorio (este arquivo)
├── viewcode.html # Visualizador de código fonte desde o navegador
├── memoria.html # Documentación técnica e memoria do proxecto
├── index_construcion.html # Páxina temporal por mantemento ou despregamento
├── README.md # Documentación básica e guía de uso do proxecto
├── AUTHORS # Información de autoría e contribuidores do proxecto
├── LICENSE-CODE # Licenza GPL v3.0 para código fonte
├── LICENSE-CONTENT # Licenza CC BY-NC-SA 4.0 para contidos educativos
├── .gitignore # Configuración para excluír arquivos/cartafoles en Git
├── .htaccess # Configuración de seguridade para o servidor Apache
├── generar_galeria.py # Script principal para analizar directorios e xerar bloques HTML
├── bloques_galeria.html # Bloques HTML xerados para a galería de proxectos actuais
├── bloques_video.html # Bloques HTML xerados para a galería de vídeos actuais
├── bloques_audio.html # Bloques HTML xerados para a galería de audios actuais
├── bloques_acordeon.html # Bloques HTML para acordeóns de proxectos arquivados
├── bloques_acordeon_video.html # Bloques HTML para acordeóns de vídeos arquivados
├── bloques_acordeon_audio.html # Bloques HTML para acordeóns de audios arquivados
├── __pycache__/ # Arquivos temporais xerados automaticamente por Python
├── assets/ # Recursos estáticos do sitio (CSS, JS, imaxes, miniaturas)
│ ├── css/ # Follas de estilo CSS
│ │ ├── styles.css # Estilos principais da web
│ │ └── styles.min.css # Estilos minificados para produción
│ ├── js/ # Scripts JavaScript
│ │ ├── bundle.js # Funcionalidade principal e modais
│ │ ├── bundle.min.js # Scripts minificados para produción
│ │ └── pwa-manager.js # Xestor de PWA e Service Worker
│ ├── img/ # Imaxes de interface (iconos, logos, etc.)
│ └── thumbs/ # Miniaturas xeradas automaticamente
│ ├── proxectos/ # Miniaturas de proxectos web
│ ├── video/ # Miniaturas de vídeos
│ └── audio/ # Miniaturas de audio
├── proxectos/ # Proxectos web completos de estudantes
│ ├── curso_actual/ # Proxectos do curso vixente
│ │ └── [ano_académico]/ # Organización por ano académico (ex: 2024-25)
│ │ └── [nome_autor]/ # Proxecto individual (cartafol por autor)
│ └── arquivo/ # Proxectos de cursos anteriores
│ └── [ano_académico]/ # Organización por ano académico
│ └── [nome_autor]/ # Proxecto individual arquivado
├── video/ # Contido de vídeo (proxectos, reportaxes, etc.)
│ ├── curso_actual/ # Vídeos do curso vixente
│ │ └── [ano_académico]/ # Organización por ano académico
│ │ └── [nome_autor]/ # Vídeo individual
│ └── arquivo/ # Arquivo histórico de vídeos
│ └── [ano_académico]/ # Organización por ano académico
│ └── [nome_autor]/ # Vídeo individual arquivado
├── audio/ # Contido de audio (podcasts, entrevistas, etc.)
│ ├── curso_actual/ # Audios do curso vixente
│ │ └── [ano_académico]/ # Organización por ano académico
│ │ └── [nome_autor]/ # Audio individual
│ └── arquivo/ # Arquivo histórico de audios
│ └── [ano_académico]/ # Organización por ano académico
│ └── [nome_autor]/ # Audio individual arquivado
├── datos/ # Metadatos persistentes en JSON
│ ├── info_curso.json # Información xeral do curso actual
│ ├── proyectos_actuales.json # Metadatos de proxectos actuais
│ ├── video_actual.json # Metadatos de vídeos do curso actual
│ ├── audio_actual.json # Metadatos de audios do curso actual
│ ├── cursos_anteriores.json # Resumo de cursos anteriores
│ └── autores.json # Normalización e metadatos de autores
├── logs/ # Arquivos de seguimento para optimización e tracking
│ ├── videos_procesados.json # Rexistro de vídeos xa optimizados
│ └── audio_procesados.json # Rexistro de audios xa optimizados
├── metodoloxia/ # Sistema de fichas metodolóxicas (formulario e dashboard)
│ ├── metodoloxia.html # Formulario web para crear fichas metodolóxicas
│ └── dashboard_metodoloxias.html # Panel de xestión de fichas metodolóxicas (só profesorado)
├── metodoloxia_fichas/ # Fichas metodolóxicas en formato JSON (unha por proxecto)
│ ├── metodologia_proxecto_web_[autor].json # Ficha metodolóxica de proxecto web
│ ├── metodologia_video_[autor].json # Ficha metodolóxica de vídeo
│ └── metodologia_audio_[autor].json # Ficha metodolóxica de audio
├── scripts/ # Scripts de automatización e mantemento
│ ├── control_fichas_metodoloxia.py # Control de sincronización de fichas metodolóxicas
│ ├── optimizar_videos.sh # Optimización de vídeos con ffmpeg
│ ├── optimizar_audio.sh # Normalización e optimización de audio
│ ├── marcar_archivos_procesados.sh # Sistema de tracking para evitar reprocesamento
│ ├── convertir_videos_ios.sh # Converter vídeos para compatibilidade iOS/Safari
│ └── minificar.sh # Minificación automática de CSS e JS
├── backup/ # Copias de seguridade automáticas con timestamps (uso local)
│ └── auto_[YYYYMMDD_HHMMSS]/ # Backup automático antes de cada execución de generar_galeria.py
│ ├── index.html # Copia da páxina principal
│ ├── bloques_*.html # Bloques HTML xerados
│ └── datos/ # Todos os arquivos JSON de metadatos
├── repo/ # Repositorio base open source (estrutura limpa para compartir)
│ ├── README.md # Documentación do repositorio open source
│ ├── index.html # Plantilla base do sitio
│ ├── memoria.html # Documentación técnica
│ ├── directorio.html # Índice navegable
│ ├── viewcode.html # Visualizador de código
│ ├── generar_galeria.py # Script principal
│ ├── assets/ # Recursos estáticos (CSS, JS, imaxes)
│ ├── scripts/ # Scripts de automatización
│ └── datos/ # Exemplos de arquivos JSON (sen datos reais)
├── service-worker.js # Service Worker para funcionalidade PWA
├── manifest.json # Manifesto de aplicación web progresiva
└── requirements.txt # Dependencias Python do proxecto
| Arquivo | Descrición | Accións |
|---|---|---|
| generar_galeria.py | Script principal que analiza directorios, xera bloques HTML e actualiza o index.html automaticamente | Ver código Descargar |
| optimizar_videos.sh | Script para normalizar, comprimir e optimizar arquivos de vídeo con ffmpeg | Ver código Descargar |
| optimizar_videos_paralelo.sh | Versión optimizada con procesamiento paralelo avanzado para arquivos de vídeo | Ver código Descargar |
| optimizar_audio.sh | Script para normalizar volume e converter formatos de audio a MP3 optimizado | Ver código Descargar |
| marcar_archivos_procesados.sh | Sistema de tracking que evita reprocesar arquivos xa optimizados e mantén limpos os rexistros. | Ver código Descargar |
| convertir_videos_ios.sh | Script especializado para converter vídeos con perfís H.264 incompatibles a formato compatible con iOS Safari. | Ver código Descargar |
| index.html | Plantilla base do sitio que é actualizada automaticamente polos scripts | Ver código Descargar |
| styles.css | Estilos CSS que implementan a interface retro-futurista con acordeóns e galerías | Ver código Descargar |
| bundle.js | JavaScript para manexo de navegación, acordeóns e modais multimedia | Ver código Descargar |
| manifest.json | Manifesto de aplicación web progresiva (PWA) con configuración para instalación offline | Ver código Descargar |
| service-worker.js | Service Worker que xestiona cache offline e funcionalidade PWA | Ver código Descargar |
| pwa-manager.js | Xestor PWA para instalación automática e navegación contextual (web vs PWA) | Ver código Descargar |
| datos/ | Exemplos de arquivos JSON para metadatos e persistencia | Ver código Descargar |
| README.md | Documentación principal do proxecto con instrucións de instalación e uso | Ver código Descargar |
| memoria.html | Documentación técnica completa e memoria do proxecto | Ver código Descargar |
| index_construcion.html | Páxina temporal de "En construción" para despregamentos ou mantemento | Ver código Descargar |
| control_fichas_metodoloxia.py | Comproba sincronización entre fichas metodolóxicas e contidos reais | Ver código Descargar |
| viewcode.html | Visualizador de código fonte para consultar arquivos do repositorio desde o navegador | Ver código Descargar |
| directorio.html | Índice navegable do repositorio (este mesmo arquivo) | Ver código Descargar |
| metodoloxia.html | Formulario web para crear fichas metodolóxicas dos estudantes | Ver código Descargar |
| dashboard_metodoloxias.html | Panel de xestión de fichas metodolóxicas para o profesorado | Ver código Descargar |
| minificar.sh | Script automatizado para minificar CSS y JavaScript para producción | Ver código Descargar |
brew install ffmpeg / apt install ffmpeg)pip install mutagen)brew install jq / apt install jq)brew install parallel / apt install parallel)brew install node / apt install nodejs npm)pip install Pillow)pip install selenium + driver)proxectos/curso_actual/[ano_académico]/[nome_autor]/ — Proxectos do curso actualproxectos/arquivo/[ano_académico]/[nome_autor]/ — Proxectos de cursos anterioresvideo/curso_actual/[ano_académico]/[nome_autor]/ — Vídeos do curso actualvideo/arquivo/[ano_académico]/[nome_autor]/ — Vídeos de cursos anterioresaudio/curso_actual/[ano_académico]/[nome_autor]/ — Audios do curso actualaudio/arquivo/[ano_académico]/[nome_autor]/ — Audios de cursos anteriores
metodoloxia/metodoloxia.html e envíanlla ao profesor.metodoloxia_fichas/.bash scripts/marcar_archivos_procesados.sh
Windows (CMD):
bash scripts/marcar_archivos_procesados.sh
Windows (PowerShell):
bash scripts/marcar_archivos_procesados.sh
Nota: Require Git Bash, WSL ou instalación de Bash en Windows
bash scripts/optimizar_videos.sh
bash scripts/optimizar_audio.sh
Windows:
bash scripts/optimizar_videos.sh
bash scripts/optimizar_audio.sh
Nota: Os scripts detectan automaticamente o sistema operativo
bash scripts/convertir_videos_ios.sh
Windows:
bash scripts/convertir_videos_ios.sh
Nota: Só procesa vídeos con perfiles H.264 incompatibles
python3 generar_galeria.py
Windows:
python generar_galeria.py
python3 scripts/control_fichas_metodoloxia.py
Windows:
python scripts/control_fichas_metodoloxia.py
# Opción A - Script automatizado (recomendado):
bash scripts/minificar.sh
# Opción B - Comandos manuais:
npx clean-css-cli -o assets/css/styles.min.css assets/css/styles.css
npx terser assets/js/bundle.js -o assets/js/bundle.min.js --compress --mangle
find . \( -name ".DS_Store" -o -name "Thumbs.db" -o -name "*.swp" -o -name "*.swo" -o -name "*.tmp" -o -name "*.bak" \) -delete
Windows (PowerShell):
Get-ChildItem -Path . -Recurse -Force | Where-Object { $_.Name -match '\.(DS_Store|swp|swo|tmp|bak)$|^Thumbs\.db$' } | Remove-Item -Force
Windows (CMD):
for /r . %i in (.DS_Store Thumbs.db *.swp *.swo *.tmp *.bak) do @if exist "%i" del /f /q "%i"
bloques_*.html, datos/*.json, logs/, assets/thumbs/) e as fichas metodolóxicas non deben subirse a repositorios públicos.O sistema está deseñado para ser facilmente personalizable e ampliable:
Para engadir novos contidos, utiliza a seguinte estrutura obrigatoria (nomes normalizados, sen espazos nin tildes):
proxectos/curso_actual/[ano_académico]/[nome_autor]/video/curso_actual/[ano_académico]/[nome_autor]/audio/curso_actual/[ano_académico]/[nome_autor]/
Ao final de cada curso académico, debes mover manualmente os contidos do curso actual ás carpetas arquivo/ correspondentes.
Os scripts detectarán automáticamente estes contidos archivados e actualizarán a web e os metadatos históricos.
Os parámetros principais do sistema (nomes de curso, autores, etc.) pódense modificar nos arquivos JSON da carpeta datos/.
Non edites manualmente os arquivos xerados automáticamente (bloques_*.html, datos/*.json) salvo casos moi concretos, xa que se sobrescriben en cada execución dos scripts.
assets/css/styles.css para cambiar cores, fontes ou o diseño da interface.assets/img/ para adaptar a identidade visual.O sistema utiliza varios scripts para automatizar tarefas repetitivas e manter unha xestión eficiente do contido multimedia:
Script principal que automatiza a xeración e actualización de galerías.
Exemplo de saída:
🚀 Executando con detección automática por timestamps...
🚀 Iniciando xeración de galería...
⚡ Modo: Detección automática por timestamps
✅ Respaldo creado en backup/auto_20250611_200951
🔄 Iniciando procesamento de contidos...
Procesando curso actual...
✅ Preservando edición manual de: index.html
Procesando arquivos de audio do curso actual...
✅ Preservando edición manual de: audio1.mp3
Procesando arquivos de video do curso actual...
✅ Preservando edición manual de: video1.mp4
Actualizando index.html...
✓ Sección proxectos actualizada
✓ Sección video actualizada
✓ Sección audio actualizada
✅ Index.html actualizado automáticamente con éxito!
🎉 ¡PROCESO FINALIZADO CON ÉXITO!
Sistema de tracking que evita reprocesar arquivos xa optimizados e mantén limpos os rexistros.
logs/Exemplo de saída:
=== Marcando arquivos de vídeo como procesados ===
Procesando directorio: video/curso_actual
✓ Marcado: video/curso_actual/2024-25/estudante1/video1.mp4
✓ Marcado: video/curso_actual/2024-25/estudante2/video2.mp4
=== Resumen de marcado ===
Arquivos de vídeo marcados como procesados: 62
Arquivos de vídeo excluídos: 0
Arquivos de audio marcados como procesados: 55
Arquivos de audio excluídos: 0
Limpeza completada.
Comproba a sincronización entre as fichas metodolóxicas (metodoloxia_fichas/) e os contidos reais (proxectos, vídeos, audios).
metodoloxia_fichas/ e compara cos contidos actuaisExemplo de saída:
Fichas metodolóxicas FALTANTES:
- metodologia_audio_estudante1.json
- metodologia_video_estudante2.json
- metodologia_proxecto_web_estudante3.json
Fichas metodolóxicas SOBRANTES:
- metodologia_proxecto_web_estudante_antigo.json
✓ Proxectos: 12 fichas, 12 contidos (sincronizado)
⚠ Vídeos: 8 fichas, 10 contidos (faltan 2 fichas)
⚠ Audio: 5 fichas, 8 contidos (faltan 3 fichas)
Procesa e optimiza vídeos para mellorar a carga web e reducir o espazo de almacenamento.
Exemplo de saída:
📂 Escaneando directorios...
📹 Encontrados 25 arquivos de video
📝 Procesando arquivos...
Procesando: [██████████████████████████████] 100%
✅ Procesamento completado
Arquivos procesados: 12
Arquivos convertidos: 8
Arquivos optimizados: 4
Arquivos renombrados: 3
Miniaturas xeradas: 12
Detecta e converte vídeos con perfiles H.264 incompatibles a formato compatible con iOS Safari.
Exemplo de saída:
🔧 SCRIPT DE CONVERSIÓN DE VÍDEOS PARA COMPATIBILIDAD iOS
==========================================================
🔄 Procesando: video/curso_actual/2024-25/pablo_gonzalez_garcia/video2.mp4
📊 Codec actual: h264xHigh 4:2:2
🔧 Convirtiendo a formato compatible con iOS...
✅ Conversión exitosa. Original guardado como: video2_original.mp4
==========================================================
📊 RESUMEN:
• Total de vídeos procesados: 4
• Conversiones exitosas: 4
• Errores: 0
Procesa e normaliza arquivos de audio para garantir calidade uniforme.
Exemplo de saída:
=== Optimizador de Audio - Só Arquivos Novos ===
Arquivos previamente procesados: 45
Procesando directorio: audio/curso_actual/2024-25/
✓ Convertido: podcast_episodio1.wav → podcast_episodio1.mp3
Tamaño: 25.8MB → 3.2MB (87% redución)
✓ Optimizado: entrevista.mp3 (128kbps → 192kbps)
=== Estadísticas ===
Arquivos de audio encontrados: 12
Arquivos procesados: 3
Arquivos convertidos a MP3: 2
Arquivos MP3 optimizados: 1
Tamaño actual da carpeta audio: 45.2MB
Permite editar os nomes dos autores nos metadatos para mostrar tildes, ñ, etc. correctamente na web.
Opción A - Editor interactivo (recomendado):
python3 generar_galeria.py --editar-autoresdatos/autores.jsonOpción B - Edición manual de arquivos:
datos/autores.json cun editor de código ou texto plano"nome_carpeta": "Nome Con Acentos"python3 generar_galeria.pyExemplo:
Introduce o nome da carpeta que queres editar: josefina_torres_pereiro
Nome actual: Josefina Torres Pereiro
Introduce o novo nome: Josefina Torres Pereiro ✓
Nome actualizado: josefina_torres_pereiro → Josefina Torres Pereiro ✓
Minifica automáticamente os arquivos CSS e JavaScript para optimizar a carga en produción.
Exemplo de saída:
🚀 GallaecIA Media Hacklab - Minificador de Assets
============================================
🔍 Verificando paquetes npm requeridos...
📦 Minificando bundle.js...
🎨 Minificando styles.css...
✅ Minificación completada. Arquivos actualizados:
- assets/js/bundle.min.js
- assets/css/styles.min.css
📊 Estadísticas de compresión:
JS: 45230 → 23145 bytes (-49%)
CSS: 18420 → 12890 bytes (-30%)
Todos os scripts están probados e funcionan en:
Os scripts detectan automaticamente o sistema operativo e adaptan os comandos.
O sistema está deseñado para funcionar como unha cadea de procesamento automatizada e segura:
1. ENGADIR CONTIDOS
└── Os arquivos de contidos deben colocarse nas carpetas correspondentes:
proxectos/curso_actual/[ano]/[autor]/ # Proxectos do curso actual
proxectos/arquivo/[ano]/[autor]/ # Proxectos de cursos anteriores
video/curso_actual/[ano]/[autor]/ # Vídeos do curso actual
video/arquivo/[ano]/[autor]/ # Vídeos de cursos anteriores
audio/curso_actual/[ano]/[autor]/ # Audios do curso actual
audio/arquivo/[ano]/[autor]/ # Audios de cursos anteriores
2. CREACIÓN DE FICHAS METODOLÓXICAS
├── metodoloxia/metodoloxia.html
│ └── Os estudantes crean fichas para cada proxecto/vídeo/audio
└── Profesor recopila arquivos JSON en metodoloxia_fichas/
3. ANÁLISE E MARCADO
└── scripts/marcar_archivos_procesados.sh
└── Identifica arquivos novos ou modificados
└── Actualiza e limpa os logs (logs/*.json)
4. PROCESAMENTO MULTIMEDIA
├── scripts/optimizar_videos.sh
│ └── Optimiza vídeos novos (compresión, normalización, miniaturas)
└── scripts/optimizar_audio.sh
└── Optimiza audios novos (normalización, formas de onda)
5. XERACIÓN DE CONTIDO E METADATOS
└── generar_galeria.py [--force-regenerate]
├── Modo normal: Preserva edicións manuais cando os arquivos fonte non cambiaron
├── --force-regenerate: Sobrescribe todo con datos do HTML/multimedia
├── Crea respaldo automático en backup/auto_YYYYMMDD_HHMMSS/
├── Analiza estrutura e metadatos
├── Xera bloques HTML para cada tipo de contido:
│ ├── bloques_galeria.html (proxectos actuais)
│ ├── bloques_video.html (vídeos actuais)
│ ├── bloques_audio.html (audios actuais)
│ └── bloques_acordeon_*.html (contido arquivado)
└── Actualiza index.html e os arquivos JSON en datos/
6. SINCRONIZACIÓN DE FICHAS METODOLÓXICAS
└── scripts/control_fichas_metodoloxia.py
└── Comproba que cada proxecto, vídeo e audio teña a súa ficha metodolóxica asociada
└── Informa de fichas faltantes ou sobrantes
7. MINIFICACIÓN PARA PRODUCIÓN
└── scripts/minificar.sh
├── Minifica CSS automaticamente: assets/css/styles.css → assets/css/styles.min.css
├── Minifica JavaScript automaticamente: assets/js/bundle.js → assets/js/bundle.min.js
└── Prepara arquivos optimizados para despregamento en produción
8. LIMPEZA E SUBIDA A PRODUCIÓN
└── Limpa arquivos temporais e ocultos:
find . \( -name ".DS_Store" -o -name "Thumbs.db" -o -name "*.swp" -o -name "*.swo" -o -name "*.tmp" -o -name "*.bak" \) -delete
└── Non subas a repositorios públicos: logs, miniaturas, fichas metodolóxicas nin arquivos xerados automaticamente
O sistema pode executarse manualmente ou configurarse como tarefa programada (cron) para actualizacións periódicas.
Este proxecto utiliza un sistema de licenzas duais para distinguir entre código e contido:
Licenciado baixo GNU General Public License v3.0
Inclúe:
generar_galeria.py, scripts/)assets/, arquivos .html).gitignore, etc.)Licenciado baixo Creative Commons BY-NC-SA 4.0
Inclúe:
metodoloxia/)Para consultas sobre licenciamento comercial do contido educativo:
Alberto Quian - alberto.quian@usc.es
Universidade de Santiago de Compostela
Departamento de Comunicación
Avaliamos cada caso considerando o beneficio para a comunidade educativa e a sustentabilidade do proxecto.
Doutor en Investigación en Medios de Comunicación
Facultade de Ciencias da Comunicación
Universidade de Santiago de Compostela
📄 Ver información completa de autoría