{"id":50505063,"url":"https://github.com/lucasftas/app-presentation-png-vmix","last_synced_at":"2026-06-02T15:02:10.955Z","repository":{"id":358182260,"uuid":"1214039418","full_name":"lucasftas/app-presentation-png-vmix","owner":"lucasftas","description":"Presenter view pra palestrantes em lives com vMix — slide atual + próximo sincronizado, controlado via tray icon do Windows.","archived":false,"fork":false,"pushed_at":"2026-05-16T04:34:35.000Z","size":392,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T06:41:57.833Z","etag":null,"topics":["broadcast","livestream","presenter-view","python","slideshow","tray-icon","vmix","windows"],"latest_commit_sha":null,"homepage":"https://github.com/lucasftas/app-presentation-png-vmix/releases/latest","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucasftas.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T03:39:15.000Z","updated_at":"2026-05-16T04:34:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lucasftas/app-presentation-png-vmix","commit_stats":null,"previous_names":["lucasftas/app-presentation-png-vmix"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/lucasftas/app-presentation-png-vmix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucasftas%2Fapp-presentation-png-vmix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucasftas%2Fapp-presentation-png-vmix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucasftas%2Fapp-presentation-png-vmix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucasftas%2Fapp-presentation-png-vmix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucasftas","download_url":"https://codeload.github.com/lucasftas/app-presentation-png-vmix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucasftas%2Fapp-presentation-png-vmix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33827068,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["broadcast","livestream","presenter-view","python","slideshow","tray-icon","vmix","windows"],"created_at":"2026-06-02T15:02:10.201Z","updated_at":"2026-06-02T15:02:10.933Z","avatar_url":"https://github.com/lucasftas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🎥 Apresentador vMix\n\n### Presenter View pra palestrantes em lives com vMix\n\n**O palestrante vê o slide atual + próximo no tablet, sincronizado automaticamente.**\nO operador controla tudo do seu PC. Sem mexer no tablet do palestrante durante o show.\n\n[![Release](https://img.shields.io/github/v/release/lucasftas/app-presentation-png-vmix?style=flat-square\u0026color=2ea043)](https://github.com/lucasftas/app-presentation-png-vmix/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-3b82f6.svg?style=flat-square)](https://www.python.org/)\n[![vMix 29](https://img.shields.io/badge/vMix-29%2B-f2b705.svg?style=flat-square)](https://www.vmix.com/)\n[![Platform: Windows](https://img.shields.io/badge/platform-Windows%2010%2F11-0078d4.svg?style=flat-square)](#)\n\n![preview do icone](assets/icon.png)\n\n\u003c/div\u003e\n\n---\n\n## 🤔 Por que existe?\n\nEm lives onde os slides são projetados **pelo vMix** (não pelo PowerPoint direto), o *Presenter View* nativo do PowerPoint simplesmente **não funciona**. O palestrante fica sem saber o que vem a seguir, dependendo do operador ou de um monitor de confidence que só mostra o slide atual.\n\nEste app preenche essa lacuna:\n\n- 🔌 Conecta na **API HTTP do vMix** (rede local)\n- 🔍 Detecta automaticamente qual palestrante está **ao vivo** — mesmo quando o slide aparece como overlay de um input composto com câmera\n- 🖼️ Exibe uma página web com **slide atual + próximo** (e mais metadados)\n- 📱 Funciona em qualquer tablet/notebook na mesa do palestrante\n\n---\n\n## ✨ Features\n\n### 🎬 Pro palestrante\n\n- **Modo apresentador** estilo PowerPoint com slide atual + próximo + barra de progresso\n- **Controle remoto embutido** — menu hambúrguer pra avançar/voltar/ir direto num slide, sem precisar do vMix\n- **Modo kiosk** (tela cheia limpa, sem cursor) em monitor dedicado\n- Banner **\"Fulano entrando em breve\"** quando você está em Preview do vMix\n- **\"FIM\"** destacado quando o slideshow acaba\n- **Suporte a input List (VideoList)** — playlist mista de slides + vídeos; cada vídeo aparece como um frame com tag **\"VÍDEO\"** e duração\n- Ajuste de proporção atual/próximo por slider\n\n### ⚙️ Pro operador\n\n- **Dashboard web completo** pra gerenciar palestrantes sem editar JSON\n- **Grid de miniaturas** ao adicionar palestrante — confirma visualmente se a pasta é a correta\n- **Detecção automática de padrões no vMix** — sugere pares blank↔slideshow\n- **File browser estilo explorer** com drives, atalhos detectados, match automático de pasta por nome\n- Badges de saúde por palestrante: `✓ OK` / `⚠ GUID órfão` / `✕ Pasta inacessível` / `⚠ Filename não bate`\n- **Proximidade dos clientes conectados** — chip mostra quantos tablets estão assistindo agora\n- **\"Gerar frames dos vídeos\"** — pré-extrai (ffmpeg) um frame de cada vídeo de um input List, com barra de progresso\n\n### 🖥️ System tray nativo Windows\n\n- Ícone na bandeja com **controle completo do vMix** por palestrante (avançar/voltar/reset)\n- **Notificações** em eventos críticos: vMix offline, palestrante no ar, servidor parou\n- **\"Projetar em monitor\"** — abre modo apresentador em tela cheia no monitor escolhido (inspirado no OBS \"Fullscreen Projector\")\n- Editar IP do vMix direto do tray via dialog\n- Copiar URL do palestrante pra clipboard com 1 clique\n- Liberar porta no firewall do Windows com 1 clique\n- Ícone troca pra ⚠️ quando vMix está offline \u003e10s\n\n### 🛡️ À prova de show ao vivo\n\n- **Port fallback** — se 5000 estiver ocupada, tenta 5001, 5002...\n- **Single-instance guard** — duplo duplo-clique não abre 2 cópias conflitantes\n- **Health check interno** — detecta se o próprio servidor HTTP morreu e notifica\n- **Recovery de config corrompido** — backup automático, app sobe sempre\n- **Timeout em share de rede (UNC) lento** — share caído não trava o dashboard\n- **File watcher do config** — editar `config.json` externamente recarrega automaticamente\n- **Logs com rotação** em `logs/YYYY-MM-DD.log`\n- **Match ancorado de filename** — resolve ambiguidade `slide 1.png` vs `slide 10.png`\n\n---\n\n## 🚀 Quick start\n\n### 1. Baixe o portable\n\n[**⬇️ Baixar `Iniciar Apresentador.exe` — release mais recente**](https://github.com/lucasftas/app-presentation-png-vmix/releases/latest)\n\n**Exe único** (~95 MB) — app + ffmpeg embutidos. Sem instalação, sem dependências: baixe e duplo-clique.\n\nOu veja [todas as releases](https://github.com/lucasftas/app-presentation-png-vmix/releases).\n\n### 2. Duplo-clique no `Iniciar Apresentador.exe`\n\n- Ícone aparece na **bandeja do Windows** perto do relógio\n- Sem janela preta, sem poluição visual\n- Single-instance: não rola abrir 2 cópias por engano\n\n### 3. Clique no ícone → Dashboard abre no browser\n\n- Adicione palestrantes: escolha o input `Photos` do vMix, navegue até a pasta dos slides, confirme pelo **grid de miniaturas**, salve\n- Rede? O banner de boot mostra `http://192.168.x.x:5000/` — abra essa URL no browser do tablet do palestrante\n- Pronto. Quando você passar slide no vMix, o tablet sincroniza em **≤500 ms**\n\n---\n\n## 🎯 Pra quem serve\n\n- **Produtores de live** (eventos, cursos, pitches) que passam slides pelo vMix\n- **Palestrantes remotos** que só têm um tablet na mesa e precisam ver o próximo slide\n- **Igrejas / lives de culto** com 2-3 pregadores e apresentações separadas\n- **Workshops online** com múltiplos palestrantes durante o dia\n\nFunciona especialmente bem quando:\n- Você tem **múltiplos palestrantes no mesmo evento** (a app detecta qual está ao vivo)\n- Os slides entram como **blank composto** (input Colour com Photos em overlay) — padrão comum em lives com câmera+slide\n\n---\n\n## 🏗️ Como funciona (arquitetura em 3 linhas)\n\n```\n                          [ config.json ]\n                                │\n┌──────────────┐       ┌────────┴────────┐       ┌──────────────┐\n│ vMix (8088)  │◀──────│ Apresentador    │──────▶│ Tablet web   │\n│ XML API      │       │ server.py       │       │ :5000/       │\n│ (polling     │       │ + tray          │       │ (palestrante)│\n│  500ms)      │       │ + projetor      │       └──────────────┘\n└──────────────┘       └────────┬────────┘\n                                │\n                       ┌────────┴────────┐\n                       │ Dashboard /admin│\n                       │ (operador)      │\n                       └─────────────────┘\n```\n\n**Detecção em 3 prioridades:**\n\n1. Input diretamente em Program é um palestrante? → usa\n2. Input em Program é Colour com Photos em overlay? → usa (blanks composto)\n3. Alguma das 16 overlays globais aponta pra Photos? → usa\n\nO filename atual (`title` do XML do vMix) é matched contra os arquivos da pasta com sort natural.\n\n---\n\n## 🛠️ Stack\n\n- **Backend:** Python 3.11+ stdlib pura (`http.server`, `urllib`, `xml.etree`, `ctypes`, `tkinter`, `concurrent.futures`) + `pystray` + `Pillow`\n- **Frontend:** HTML/CSS/JS vanilla (sem build step)\n- **Vídeo:** `ffmpeg` + `ffprobe` (frames e duração dos vídeos de inputs List) — embutidos no exe\n- **Distribuição:** PyInstaller `--onefile` + `--noconsole` → exe único (~95 MB, ffmpeg incluído)\n- **Plataforma:** Windows 10/11 (tray icon + `ctypes.windll`)\n\n**139 testes unittest** cobrindo config, filesystem, vMix parsing (Photos e List), match ancorado, frames de vídeo, resiliência, projetores e tray.\n\n---\n\n## 🖼️ Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\n### Modo apresentador (o que o palestrante vê)\n![hero](assets/icon_alert.png)\n\n*Slide atual (verde) menor à esquerda, próximo (amarelo) maior à direita, barra de progresso azul, nome do palestrante e contador no rodapé.*\n\n\u003c/div\u003e\n\n---\n\n## 📦 Releases\n\n- 🟢 **v1.1.0** — Suporte a input List (VideoList): playlist mista slides + vídeos, frames de vídeo via ffmpeg, exe único\n- **v1.0.0** — Primeira release pública (MIT, open-source)\n- **v0.8.0** — \"Projetar Prévia\" estilo OBS: abre modo apresentador em tela cheia limpa no monitor escolhido\n- **v0.7.0** — À prova de falhas silenciosas: port fallback, single-instance, health check, file watcher\n- **v0.6.0** — Tray icon nativo com menu completo + notificações\n- **v0.5.0** — Layout escalado, proporção sincronizada entre tablets, preview palestrante\n- **v0.4.0** — Pacote portable amigável pra leigo\n- **v0.3.0** — À prova de show ao vivo: match ancorado, recovery, grid de miniaturas\n\n[Veja o CHANGELOG completo](CHANGELOG.md) · [Todas as releases](https://github.com/lucasftas/app-presentation-png-vmix/releases)\n\n---\n\n## 🧪 Desenvolvimento\n\n```bash\n# Clone\ngit clone https://github.com/lucasftas/app-presentation-png-vmix.git\ncd app-presentation-png-vmix\n\n# Rodar direto com Python\ncp config.example.json src/config.json\npython src/server.py\n\n# Testes (stdlib puro, sem pytest)\npython -m unittest discover tests/ -v\n\n# Build do exe único (requer ffmpeg/ffprobe no PATH — embutidos no exe)\npip install pyinstaller pystray Pillow\nscripts\\build.bat\n# Saída: dist/Iniciar Apresentador.exe\n```\n\n---\n\n## 📡 API REST (integrações)\n\n| Endpoint | Método | Descrição |\n|---|---|---|\n| `/` | GET | Modo apresentador (HTML) |\n| `/admin` | GET | Dashboard (HTML) |\n| `/state` | GET | Estado atual do palestrante ao vivo (JSON) |\n| `/admin/api/config` | GET/POST | Config atual + persistência |\n| `/admin/api/health` | GET | Diagnóstico por palestrante |\n| `/admin/api/vmix_control` | POST | `{action: \"next\\|prev\\|goto\\|reset\", guid, index?}` |\n| `/admin/api/monitors` | GET | Monitores detectados no Windows |\n| `/admin/api/projetor_abrir` | POST | Abre projetor em tela cheia num monitor |\n| `/admin/api/preview?pasta=` | GET | Lista imagens da pasta (miniaturas do modal) |\n\nMais 8 endpoints — veja o [código do server](src/server.py) ou rode `grep \"sub ==\" src/server.py`.\n\n---\n\n## 🤝 Contribuindo\n\nIssues e PRs bem-vindos! Em especial:\n\n- 📸 **Screenshots reais de uso** pra colocar no README\n- 🐛 Relatos de bugs em produção com vMix\n- 🌍 Testes em outras versões do vMix (27, 28, 29, 30+)\n- 💡 Ideias de integrações (OBS overlay, Companion, Stream Deck)\n\nAbra uma [issue](https://github.com/lucasftas/app-presentation-png-vmix/issues) ou mande um PR.\n\n---\n\n## 📜 Licença\n\nMIT — [veja LICENSE](LICENSE). Pode usar livremente em eventos comerciais.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Gostou? ⭐ dá uma estrelinha aí — ajuda a descobrir que tem gente usando.**\n\nFeito pra funcionar em live, testado em live, publicado em live.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucasftas%2Fapp-presentation-png-vmix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucasftas%2Fapp-presentation-png-vmix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucasftas%2Fapp-presentation-png-vmix/lists"}