Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Presenter

Presenter

Control de presentaciones para eventos en vivo.

Armá la lista de oradores, tocá GO y la presentación sale al aire en modo moderador de PowerPoint — con animaciones y video con audio, tal como fue creada.


Windows PowerPoint Electron Node

Licencia Tests Dependencias


Gratis · Instalador .exe · No hace falta saber programar


Qué es

Presenter es la mesa de control de un evento con varios oradores. Los .pptx se sueltan en la ventana, se ordenan como cards y se lanzan de a uno.

Las presentaciones se abren en PowerPoint real. Nunca se convierten a imágenes ni a PDF: las animaciones, las transiciones y el video con audio embebido funcionan porque quien las reproduce es PowerPoint, no un visor.

Important

Requiere Windows con PowerPoint instalado y licenciado. Toda la automatización se hace por COM — no hay modo Mac, Linux ni web.


🔴 Tally al aire La card muestra en rojo lo que la sala está viendo
🟠 Tally armado Cargado y listo, todavía sin salir
🎬 Audio verificado Cada video del deck se audita antes del evento
80 ms por diapositiva Conexión COM caliente, sin relanzar procesos
💾 Playlist persistente El orden de oradores sobrevive al cierre

Contenido

Para usar la app

Para tocar el código


Instalar

No hace falta saber programar ni instalar nada más. Es un programa normal de Windows.

  1. Descargar el instaladorPresenter-Setup-<versión>.exe
  2. Doble clic. Elegís la carpeta y te deja accesos en el escritorio y en el menú de inicio.
  3. Abrir Presenter. Listo.

Note

Windows va a decir "editor desconocido". Es esperable.

El instalador todavía no está firmado con certificado, así que SmartScreen muestra una pantalla azul de advertencia. Para instalar igual: Más información → Ejecutar de todas formas.

Si preferís no correr un ejecutable sin firmar —criterio razonable en una máquina de control ajena— el código está entero acá arriba y podés compilarlo vos mismo.

Antes del primer evento

Necesitás Detalle
Windows 10 u 11
PowerPoint Instalado y licenciado (probado con 16.0)
Monitores Dos, con el proyector como pantalla extendida

Abrí la app y mirá el riel de arriba. Ahí te dice si el equipo está listo:

Lo que dice el riel Qué significa Qué hacer
PowerPoint 16.0 · 2 salidas Todo en orden Nada, a operar
1 · sin extendida Falta el segundo monitor Enchufar el proyector y extender el escritorio
sin conexión No encuentra PowerPoint Verificar que PowerPoint esté instalado y licenciado

El contador de salidas es en vivo: si el proyector se enchufa con la app ya abierta, el riel pasa solo de 1 · sin extendida a 2 sin reiniciar nada.

La vista de moderador no necesita que la configures en la cinta de PowerPoint: la app la activa en cada lanzamiento.


Cómo se opera

La app usa el mismo lenguaje que un switcher de video. Quien haya operado uno ya sabe leerla.

Señal Significa
Franja roja en la card Está al aire. Es lo que la sala ve en este momento.
Franja ámbar en la card Está armada. Cargada y lista, pero todavía no salió.
Botón GO Manda al aire lo que está armado.
GO en rojo, con "reemplaza" Al tocarlo se corta la presentación que está al aire.

Esos dos colores no se usan en ningún otro lado de la interfaz. Una mirada de reojo responde "¿qué está al aire?" antes de leer una sola palabra.

Flujo de un evento

flowchart LR
    A["📥 Soltar .pptx"] --> B["🔍 Análisis<br/><sub>portada · videos · audio</sub>"]
    B --> C["↕️ Reordenar<br/><sub>según oradores</sub>"]
    C --> D["🟠 Clic = armar<br/><sub>no lanza nada</sub>"]
    D --> E["🔴 GO = al aire"]
    E --> F["⌨️ Avanzar<br/><sub>app o PowerPoint</sub>"]
    F -.->|siguiente orador| D

    style A fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style B fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style C fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style D fill:#1c212a,stroke:#ffb020,color:#ffb020
    style E fill:#1c212a,stroke:#ff4438,color:#ff4438
    style F fill:#1c212a,stroke:#272e3a,color:#e8ebf0
Loading
  1. Arrastrar los .pptx a la ventana. Cada archivo se analiza una sola vez.
  2. Reordenar las cards arrastrándolas, según el orden de oradores.
  3. Clic en una card para armarla. Clic no lanza nada: solo prepara.
  4. GO para mandarla al aire.
  5. Avanzar las diapositivas desde la app o desde PowerPoint, indistintamente.

Al cambiar de orador, la presentación anterior se cierra antes de abrir la siguiente. Si hay algo al aire, la app pide confirmación nombrando ambas.

Teclado

Funciona mientras haya algo al aire, sin necesidad de que la vista de moderador esté en primer plano.

Tecla Acción
· espacio · AvPág Avanzar
· RePág Retroceder
B Pantalla en negro / volver
Home Volver a la diapositiva 1

Lo que muestra cada card

  • Portada de la primera diapositiva.
  • Cantidad de diapositivas.
  • En qué diapositiva está cada video.
  • Estado del audio de esos videos: Audio OK, Sin audio (rojo) o Audio sin verificar (ámbar).

Tip

El audio es lo que falla en silencio delante del público. Un deck que no puede demostrar que tiene sonido lo dice en la card, antes del evento.


Compilar desde el código

A partir de acá el README es técnico. Si solo querés usar la app, con instalar y operar ya está.

Hace falta Node.js 20 o superior.

npm install
npm start          # abre la app
npm test           # 106 tests, runner nativo de Node
npm run dist       # genera dist/Presenter-Setup-<versión>.exe

Warning

Atención con Electron. En algunas instalaciones npm install baja el paquete pero no el binario. Si npm start falla:

node node_modules/electron/install.js

y verificar que exista node_modules/electron/dist/electron.exe.

Verificar sin abrir la app

npm run probe                          # versión de PowerPoint y cantidad de monitores
node bin/analyze.js "ruta\deck.pptx"   # qué detecta en un archivo
node bin/ingest.js "ruta\deck.pptx"    # el análisis completo, con caché

Cómo funciona por dentro

Cuatro capas, cada una con un solo trabajo.

flowchart TD
    UI["<b>src/app</b><br/>Electron · main, preload, renderer"]
    PL["<b>src/playlist</b><br/>caché de análisis · orden de oradores"]
    AN["<b>src/analyzer</b><br/>lectura del .pptx · portadas · audio"]
    LA["<b>src/launcher</b><br/>automatización COM"]
    PS["<b>src/powershell</b><br/>runner compartido"]
    PPT(["PowerPoint<br/>16.0"])
    FS[("%APPDATA%\Presenter\store")]

    UI --> PL
    UI --> LA
    PL --> AN
    PL --> FS
    AN --> PS
    LA --> PS
    PS -->|COM| PPT

    style UI fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style PL fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style AN fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style LA fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style PS fill:#1c212a,stroke:#272e3a,color:#e8ebf0
    style PPT fill:#14171c,stroke:#ff4438,color:#ff4438
    style FS fill:#14171c,stroke:#ffb020,color:#ffb020
Loading
Capa Responsabilidad
src/launcher Automatización COM: abrir, forzar modo moderador, cerrar el deck anterior, avanzar diapositivas.
src/analyzer Leer el .pptx como zip y renderizar portadas por COM cuando el archivo no trae ninguna.
src/playlist Caché del análisis y persistencia del orden de oradores.
src/powershell Runner compartido de scripts .ps1.
src/app Proceso principal de Electron, puente seguro y superficie de control.

Decisiones de diseño

Conviene conocerlas antes de tocar el código.

El modo moderador se fuerza por lanzamiento

Se aplica SlideShowSettings.ShowPresenterView en cada apertura, en vez de depender del tilde "Usar vista de moderador" de la cinta.

Ese tilde es un estado global que cualquiera puede cambiar sin querer — incluido el orador anterior mientras probaba su deck.

El audio se detecta sin ffmpeg

src/analyzer/media-audio.js recorre el árbol de boxes ISO-BMFF (moov → trak → mdia → hdlr) buscando una pista de sonido.

Evita instalar ffmpeg en una máquina de control, y solo lee el encabezado del archivo — no decodifica nada.

Un único proceso PowerShell mantiene la conexión COM abierta

src/launcher/show-session.ps1 reporta la posición y ejecuta los comandos. Medido en la máquina de control:

Operación Proceso por comando Proceso caliente
Avanzar una diapositiva 791 ms (picos de 7,9 s) 80 ms

Un pico de 7,9 segundos delante del público no es aceptable. De ahí el proceso persistente.

Los reintentos son selectivos

PowerPoint rechaza llamadas COM mientras está ocupado (RPC_E_CALL_REJECTED).

  • Los comandos del operador reintentan, porque fueron pedidos a propósito.
  • El sondeo de posición no reintenta: saltea el tick.

El indicador puede atrasarse; la proyección nunca se interrumpe.

Todo el trabajo pesado ocurre al soltar los archivos, nunca al lanzar
Operación Costo
Leer portada embebida del zip ~10 ms
Renderizar portada por COM ~1800 ms
Segunda apertura, ya cacheado ~3 ms
Nada cosmético bloquea el show

Portada faltante, audio no verificable, PowerPoint ocupado o un deck ilegible avisan, pero no impiden que el resto de la lista salga al aire.


Límites conocidos

Estos comportamientos son deliberados o están medidos. No son bugs pendientes.

Límite Motivo
El contador de posición se atrasa durante videos largos. PowerPoint rechaza llamadas COM mientras reproduce. Se prefiere un contador atrasado antes que arriesgar un tirón en la proyección.
Los videos .wmv y .avi informan "audio sin verificar". La detección nativa cubre mp4, m4v y mov. Un falso "tiene audio" sería peor que una advertencia honesta.
El total de diapositivas ignora diapositivas ocultas y presentaciones personalizadas. Se usa Slides.Count, que es el total real del archivo.
Los videos enlazados (no embebidos) se marcan pero no se analizan. El archivo vive fuera del .pptx y puede no viajar con él.

Desarrollo

Los tests usan archivos reales: .pptx construidos como zip y bytes ISO-BMFF armados a mano, no mocks. La automatización COM se prueba con un ejecutor inyectado, sin depender de PowerPoint.

src/
  launcher/    COM: lanzamiento, transición y control del show
  analyzer/    lectura del .pptx y renderizado de portadas
  playlist/    caché e ingesta
  powershell/  runner compartido de scripts
  app/         Electron: main, preload y renderer
bin/           herramientas de línea de comandos para verificar sin la UI
test/          suite completa

Una sola dependencia de runtime: adm-zip.

Note

Verificación en vivo. Los tests protegen las refactorizaciones, pero los problemas más serios de este proyecto aparecieron operando la app a mano con PowerPoint en movimiento, no en la suite. Antes de un evento conviene ensayar con la cantidad real de oradores, encadenando cambios y con un video largo en el medio.


Dónde queda la lista guardada

La playlist sobrevive al cierre:

Archivo Contenido
session.json Orden de oradores
playlist.json Metadatos del análisis
thumbnails/ Portadas renderizadas

Los tres dentro de %APPDATA%\Presenter\store\.

Es una carpeta propia, no Cache. En Windows Cache y cache son el mismo directorio, y ese lo administra Chromium para su caché HTTP: purga cuando quiere y se llevaría la lista puesta. src/app/paths.js decide la ubicación y sus tests fallan si vuelve a caer en un nombre reservado por Chromium.

Caution

%APPDATA%\Presenter la deriva Electron del nombre del producto. Si alguna vez se renombra la app, Windows pasa a mirar una carpeta nueva y vacía: la lista aparece en blanco aunque los archivos viejos sigan ahí. Para recuperarla hay que copiar session.json, playlist.json y thumbnails/ de la carpeta anterior a la nueva.


Empaquetado

npm run dist

Deja el instalador en dist/Presenter-Setup-<version>.exe. Es un instalador NSIS asistido: el operador elige la carpeta y le quedan accesos en el escritorio y en el menú de inicio.

Por qué asar: false. La app maneja PowerPoint lanzando powershell.exe contra los .ps1 de src/launcher/, resueltos por __dirname. PowerShell es un proceso externo y no sabe leer adentro de app.asar, así que empacar rompería todos los comandos del show en runtime.

El icono sale de build/icon.ico por convención de electron-builder: alcanza con dejar el archivo ahí y volver a correr npm run dist, no hay que tocar package.json. Ver build/README.md.

Warning

El instalador no está firmado. Windows va a mostrar el aviso de SmartScreen con "editor desconocido" al ejecutarlo. Los datos de MateCode aparecen igual en Panel de control → Programas, pero sin firma nadie los puede verificar.


Roadmap

  • Reemplazar el wordmark placeholder por la marca definitiva: Presenter.
  • Empaquetar con electron-builder para instalar en la máquina de control.
  • Dejar el icono de MateCode en build/icon.ico.
  • Firmar el instalador con un certificado de code signing a nombre de MateCode, para que Windows no muestre "editor desconocido" al instalar.
  • Ensayo completo con 6 a 8 presentaciones reales.

Presenter · Hecho por MateCode

Licencia MIT — usalo, modificalo y compartilo libremente.
Software libre para la comunidad técnica de eventos.

About

Desktop control surface for live event presentations, launching PowerPoint decks in presenter view via COM. Electron.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages