From 71b7163d5499bcccde556e19f24449d0aa28235e Mon Sep 17 00:00:00 2001 From: Bernard <63512176+BernardJen@users.noreply.github.com> Date: Fri, 23 Jan 2026 11:03:27 +0100 Subject: [PATCH] docs: update documentation to reflect current state TODO.md: - Mark completed items (DVD screensaver, CI/CD, Windows compatibility) - Reorganize priorities (High/Medium/Low instead of P1-P4) - Remove outdated items CHANGELOG.md: - Add all Electron v2.x releases with correct dates - Separate Electron (2026) and Python legacy (2025) sections - Add release links README.md: - Add download links section - Update keyboard shortcuts (add Space for freeze) - Add DVD screensaver to features - Simplify development instructions - Mark Python version as legacy Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 221 +++++++++++++++++++++++++++++++++++++-------------- README.md | 110 ++++++++++++------------- TODO.md | 68 +++++++--------- 3 files changed, 238 insertions(+), 161 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 522fbf1..4864307 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,24 +5,134 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.5.3] - 2024-12-24 +--- -### Added +## Electron Version (v2.x) + +### [2.2.1] - 2026-01-23 + +#### Fixed + +- Build artifacts now have correct version in filenames + +### [2.2.0] - 2026-01-19 + +#### Added + +- DVD-style bouncing logo screensaver when feeds lose signal + - Bouncing logo animation with color changes on bounce + - 5-minute delay before screensaver activates + - Activates when all feeds show no-signal + +#### Changed + +- Consolidated CI/CD into single workflow +- Improved release automation + +### [2.1.13] - 2026-01-16 + +#### Fixed + +- Center divider logo now constrained to fit within gap + +### [2.1.12] - 2026-01-16 + +#### Fixed + +- Center divider logo scales to fit height on wide screens + +### [2.1.11] - 2026-01-16 + +#### Fixed + +- Video capture retries at device max resolution if initial resolution is low + +### [2.1.10] - 2026-01-16 + +#### Fixed + +- Request exact 1920x1200 resolution from capture device + +### [2.1.9] - 2026-01-16 + +#### Fixed + +- Use min constraints to force higher video capture resolution + +### [2.1.8] - 2026-01-16 + +#### Fixed + +- Enable hardware acceleration for better video quality + +### [2.1.7] - 2026-01-16 + +#### Fixed + +- Improved video capture quality with higher resolution constraints + +### [2.1.5] - 2026-01-16 + +#### Fixed + +- Prevent video cropping in single view mode + +### [2.1.4] - 2026-01-16 + +#### Changed + +- Streamlined CI/CD pipeline + +### [2.1.0] - 2026-01-16 + +#### Added + +- Automatic releases triggered by conventional commits +- Version bumping based on commit types (feat/fix/etc.) + +### [2.0.0] - 2026-01-11 + +#### Added + +- Complete rewrite using Electron + electron-vite +- Native installers for macOS (.dmg) and Windows (.exe) +- Auto-updater with GitHub releases integration +- Dual/Single view modes with keyboard shortcuts +- Freeze frame functionality (Space key) +- Settings panel with input configuration +- No-signal detection with reference screenshot capture +- Center gap and border width sliders +- Logo overlay in center divider and single view mode +- Dropdown panel for settings access + +#### Changed + +- Switched from Python/PyQt6 to JavaScript/Electron +- Improved performance with WebRTC MediaDevices API +- Cleaner UI with modern styling + +--- + +## Python Version (v1.x) - Legacy + +### [1.5.3] - 2025-12-24 + +#### Added - File logging for bundled apps to help debug crashes - Global exception handler to catch and log crashes with full stack traces - Log file location: `%APPDATA%\Input Viewer\app.log` (Windows) -## [1.5.2] - 2024-12-24 +### [1.5.2] - 2025-12-24 -### Fixed +#### Fixed - Fixed Windows dual screen not working when both feeds use same input -- Mirror left feed to right display when using same camera input (avoids Windows camera lock) +- Mirror left feed to right display when using same camera input -## [1.5.1] - 2024-12-24 +### [1.5.1] - 2025-12-24 -### Fixed +#### Fixed - Fixed Windows crash when switching cameras (QImage memory issue) - Fixed no-signal animation not showing on Windows (missing mp4 in bundle) @@ -30,9 +140,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added error handling in camera worker thread to prevent freezes - Added icon.ico to Windows bundle -## [1.5.0] - 2024-12-24 +### [1.5.0] - 2025-12-24 -### Added +#### Added - Display Settings panel with configurable options: - Screensaver delay (10-300 seconds) @@ -42,101 +152,90 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Reset to Defaults button for display settings - Settings are saved to settings.json and applied in real-time -### Changed +#### Changed - Reduced default capture resolution from 4K to 1080p for better performance -## [1.4.6] - 2024-12-24 +### [1.4.6] - 2025-12-24 -### Fixed +#### Fixed - Fixed mouse shake detection to properly reveal cursor when hidden - Mouse tracking now enabled on all child widgets for reliable event capture - Improved shake detection algorithm with better direction reversal tracking -### Added +#### Added - Screensaver now exits on mouse shake (in addition to showing cursor) - Screensaver now exits on any keyboard input -## [1.4.5] - 2024-12-24 - -### Fixed - -- Fixed PyInstaller spec file asset paths (assets now bundled from `assets/` folder) - -## [1.4.3] - 2024-12-24 - -### Fixed +### [1.4.0] - 2025-12-24 -- Updated PyInstaller spec file with correct module references +#### Added -## [1.4.0] - 2024-12-24 - -### Added - Threaded camera capture with `CameraWorker` for non-blocking frame reads - `HoverIcon` base class for reusable icon widgets with hover effects -- Shared stylesheet constants in `widgets/base.py` - Architecture documentation (`input_viewer/ARCHITECTURE.md`) -- Feature testing checklist (`TESTING.md`) -### Changed +#### Changed + - Camera feeds now run in background threads (~60fps capture) - UI timer only handles display, not blocking I/O -- Refactored `SettingsIcon`, `AudioIcon`, `InfoIcon` to use `HoverIcon` base -- Simplified `ScreenSaver` into smaller focused methods -- Reduced code duplication in input switching logic -- Cleaned up `ToggleSwitch` - removed deprecated callback -### Performance +#### Performance + - Smoother frame rate due to parallel camera capture - Reduced UI blocking during frame reads - Better CPU utilization with threaded workers -## [1.3.0] - 2025-12-16 +### [1.3.0] - 2025-12-16 + +#### Changed -### Changed - Updated capture resolution to 4K (3840x2160) at 30Hz -- Added "By Labs for _Space" attribution in info panel +- Added attribution in info panel -## [1.2.0] - 2025-12-16 +### [1.2.0] - 2025-12-16 + +#### Changed -### Changed - Replaced no-signal detection with vision model using multi-vector feature extraction -- No-signal detection now compares against reference image (elgato_no_source.png) +- No-signal detection now compares against reference image - Uses cosine similarity on color histograms, spatial intensity, edge density, and statistical features -- Only checks every 100 frames (~3.3s at 30Hz) for efficiency -- Fixes false positives on dark/grey applications and presentations -### Improved -- Mock no-signal mode now cycles through 3 test screens: elgato_no_source.png, zed.png, and uniform grey +### [1.0.0] - 2025-12-13 -## [1.0.0] - 2025-12-13 +#### Added -### Added - Multi-input video feed display - Layout modes: Dual view, Single left, Single right - Direct input selection with number keys 1-4 - Settings panel with toggle switches for input configuration - Live settings reload without app restart - Custom no-signal animation -- Verbose logging mode with colored output -- Test modes: mock sources, signal cycling, always no-signal - Fullscreen support - Input name overlay when switching inputs - Keyboard shortcuts info panel -### Configuration -- `settings.json` for input configuration (name, enabled, default) -- Customizable side margins and center gap -- Works with any capture card - -### Keyboard Shortcuts -- `D` - Dual view -- `L` - Single left view -- `R` - Single right view -- `1-4` - Select input directly -- `F11/F` - Toggle fullscreen -- `Q` - Quit - +[2.2.1]: https://github.com/LAB271/input-viewer/releases/tag/v2.2.1 +[2.2.0]: https://github.com/LAB271/input-viewer/releases/tag/v2.2.0 +[2.1.13]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.13 +[2.1.12]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.12 +[2.1.11]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.11 +[2.1.10]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.10 +[2.1.9]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.9 +[2.1.8]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.8 +[2.1.7]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.7 +[2.1.5]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.5 +[2.1.4]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.4 +[2.1.0]: https://github.com/LAB271/input-viewer/releases/tag/v2.1.0 +[2.0.0]: https://github.com/LAB271/input-viewer/releases/tag/v2.0.0 +[1.5.3]: https://github.com/LAB271/input-viewer/releases/tag/v1.5.3 +[1.5.2]: https://github.com/LAB271/input-viewer/releases/tag/v1.5.2 +[1.5.1]: https://github.com/LAB271/input-viewer/releases/tag/v1.5.1 +[1.5.0]: https://github.com/LAB271/input-viewer/releases/tag/v1.5.0 +[1.4.6]: https://github.com/LAB271/input-viewer/releases/tag/v1.4.6 +[1.4.0]: https://github.com/LAB271/input-viewer/releases/tag/v1.4.0 +[1.3.0]: https://github.com/LAB271/input-viewer/releases/tag/v1.3.0 +[1.2.0]: https://github.com/LAB271/input-viewer/releases/tag/v1.2.0 [1.0.0]: https://github.com/LAB271/input-viewer/releases/tag/v1.0.0 diff --git a/README.md b/README.md index 6d513ab..7f9f316 100644 --- a/README.md +++ b/README.md @@ -1,120 +1,112 @@ # Input Viewer -[![CI](https://github.com/LAB271/input-viewer/actions/workflows/ci.yml/badge.svg)](https://github.com/LAB271/input-viewer/actions/workflows/ci.yml) +[![CI/CD](https://github.com/LAB271/input-viewer/actions/workflows/ci.yml/badge.svg)](https://github.com/LAB271/input-viewer/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/LAB271/input-viewer)](https://github.com/LAB271/input-viewer/releases/latest) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) A lightweight video input viewer — **OBS without the complexity**. View and manage capture card feeds with a clean, simple interface designed for users who need to display video inputs without the overhead of full streaming software. -## Versions +## Download -This repository contains two implementations: +Download the latest release for your platform: -| Version | Location | Stack | Status | -|---------|----------|-------|--------| -| **Electron** | [`input_viewer_electron/`](input_viewer_electron/) | Electron + JavaScript | **Recommended** | -| **Python** | [`input_viewer_python/`](input_viewer_python/) | PyQt6 + OpenCV | Legacy | +- **macOS**: [Input Viewer.dmg](https://github.com/LAB271/input-viewer-releases/releases/latest) +- **Windows**: [Input Viewer Setup.exe](https://github.com/LAB271/input-viewer-releases/releases/latest) -### Electron Version (Recommended) - -The Electron version is faster, has native installers with auto-updates, and provides a smoother experience. - -```bash -cd input_viewer_electron -npm install -npm start -``` - -See [input_viewer_electron/README.md](input_viewer_electron/README.md) for full details. - -### Python Version - -The original Python implementation using PyQt6 and OpenCV. - -```bash -cd input_viewer_python -pip install -e . -python input-viewer.py -``` +The app includes auto-updates and will notify you when new versions are available. ## Features - **Multi-input display** — View one or two video feeds side by side -- **Layout switching** — Dual view or single feed centered (D/L/R keys) +- **Layout switching** — Dual view or single feed centered - **Direct input selection** — Number keys 1-4 to switch inputs instantly +- **Freeze frame** — Pause any feed with Space key - **Settings panel** — Configure inputs with toggle switches -- **No-signal detection** — Custom animated overlay when source disconnects +- **No-signal detection** — Custom overlay when source disconnects +- **DVD screensaver** — Bouncing logo when feeds lose signal - **Fullscreen support** — Designed for dedicated display setups +- **Auto-updater** — Automatic updates from GitHub releases - **Any capture card** — Works with any video capture device -- **Auto-updater** — (Electron) Automatic updates from GitHub releases ## Keyboard Shortcuts -| Key | Action | -|-----|--------| -| `D` | Dual view (both feeds) | -| `L` | Single view: left feed centered | -| `R` | Single view: right feed centered | -| `1-4` | Select input directly | -| `F11` / `F` | Toggle fullscreen | -| `Escape` | Exit fullscreen (or quit if windowed) | -| `Q` | Quit | +| Key | Action | +| ----------- | ----------------------------------- | +| `D` | Dual view (both feeds) | +| `S` | Single view (selected feed centered)| +| `1-4` | Select input directly | +| `Space` | Freeze/unfreeze current feed | +| `F11` / `F` | Toggle fullscreen | +| `Escape` | Exit fullscreen | +| `Q` | Quit | -Hover over the ⓘ icon in the top-left corner for the shortcuts panel. +Hover over the top edge to reveal the settings dropdown panel. ## Configuration ### Settings Panel -Click the ⚙ gear icon in the top-right corner to open the settings panel: +Click the ⚙ gear icon to open the settings panel: - **Toggle inputs** on/off - **Set default input** (shown at startup) - **Rename inputs** for easy identification -- Changes are saved automatically and applied in real-time +- **Adjust center gap** between feeds +- **Adjust border width** on sides +- Changes are saved automatically ### settings.json -Settings are stored in `settings.json`: +Settings are stored in the app's user data directory: ```json { - "inputs": [ - {"index": 0, "name": "Laptop", "enabled": true, "default": true}, - {"index": 1, "name": "Desktop", "enabled": true, "default": false}, - {"index": 2, "name": "Input 3", "enabled": false, "default": false}, - {"index": 3, "name": "Input 4", "enabled": false, "default": false} - ] + "inputs": [ + {"index": 0, "name": "Laptop", "enabled": true, "default": true}, + {"index": 1, "name": "Desktop", "enabled": true, "default": false}, + {"index": 2, "name": "Input 3", "enabled": false, "default": false}, + {"index": 3, "name": "Input 4", "enabled": false, "default": false} + ], + "centerGap": 100, + "borderWidth": 50 } ``` ## Development -### Electron +### Prerequisites + +- Node.js 20+ +- npm + +### Setup ```bash cd input_viewer_electron npm install -npm start # Development mode -npm run build # Build installers +npm run dev # Development mode with hot reload +npm run build # Build for production ``` -### Python +### Building Installers ```bash -cd input_viewer_python -pip install -e ".[dev]" -make test -make lint +npm run build:mac # Build macOS DMG +npm run build:win # Build Windows installer ``` -## Hardware Setup +## Hardware Works with: + - **Any capture card** — USB or PCIe capture devices - **Any display** — Adapts to your screen resolution - **Platforms**: macOS, Windows +## Legacy Python Version + +The original Python implementation is available in [`input_viewer_python/`](input_viewer_python/) but is no longer maintained. Use the Electron version for the best experience. + ## License [MIT License](LICENSE) © 2025 LAB271 diff --git a/TODO.md b/TODO.md index 7c54637..3e45de6 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,6 @@ # TODO - Input Viewer Electron -## ✅ Completed +## Completed - [x] Dual camera feed display (side by side) - [x] Video quality (1920x1080 @ 30fps) @@ -21,38 +21,30 @@ - [x] **Edit input names** - Rename inputs in settings - [x] **Enable/disable inputs** - Toggle switches in settings - [x] Auto-updater with dialog prompts (uses public releases repo) -- [x] No-signal overlay (basic) +- [x] No-signal detection with reference screenshot capture - [x] Screen aspect ratio detection (auto D/S on startup) - [x] Dropdown panel (hover arrow at top) - [x] Center gap slider (adjustable divider width) - [x] Border width slider (left/right black borders) - [x] Logo overlay in single view mode - ---- - -## 🔴 P1 - Must Have - -Essential features for release: - -- [ ] **Update GitHub workflows** - Fix release.yml for electron-vite - - Test build on macOS and Windows - - Publish to input-viewer-releases repo -- [ ] **Windows compatibility** - Test and fix Windows-specific issues - - Camera permissions handling - - Path separators and file system - - Code signing for Windows builds -- [ ] **Elgato no-signal detection** - Detect capture card "no signal" screen - - Template matching for Elgato screens - - Custom animated overlay when no signal detected -- [ ] **DVD-style screensaver** - When feeds lose signal +- [x] **DVD-style screensaver** - When feeds lose signal - Bouncing logo animation - Color changes on bounce + - 5-minute delay before activation +- [x] **CI/CD Pipeline** - Automated releases + - Build on macOS and Windows + - Auto version bump from conventional commits + - Publish to input-viewer-releases repo +- [x] **Windows compatibility** - Tested and working + - Camera permissions handling + - Windows installer (.exe) + - Auto-updater works on Windows --- -## 🟠 P2 - Should Have +## High Priority -Important features from Python version: +### User Experience - [ ] **Thumbnails panel** - T key to open - Live preview of all inputs @@ -63,38 +55,32 @@ Important features from Python version: --- -## 🟡 P3 - Nice to Have +## Medium Priority -Polish and enhancement features: +### Polish -- [ ] **Layout animations** - Smooth transitions -- [ ] **Cursor shake detection** - Show cursor on shake -- [ ] **Audio controls** - ♪ panel - - Volume sliders +- [ ] **Layout animations** - Smooth transitions between views +- [ ] **Cursor shake detection** - Show cursor on shake movement +- [ ] **Audio controls** - Volume panel + - Volume sliders per input - Mute buttons --- -## 🔵 P4 - Future Ideas +## Low Priority / Future Ideas -- [ ] **Multi-view mode** - Display different inputs on each screen - - Dual view shows same input on both sides - - Multi-view shows different inputs per panel -- [ ] **CI testing** - Add automated tests to CI pipeline +- [ ] **Multi-view mode** - Different inputs on each screen panel +- [ ] **Picture-in-picture layout** - Small preview in corner +- [ ] **Keyboard shortcut customization** - User-configurable keys +- [ ] **Touchscreen controls** - Enhanced touch support +- [ ] **CI testing** - Automated tests in pipeline - Unit tests for core logic - Integration tests for video capture - [ ] Test mode flags (`--mock`, `--no-signal`) -- [ ] Keyboard shortcut customization -- [ ] Picture-in-picture layout -- [ ] Recording functionality -- [ ] Streaming output (NDI, virtual camera) -- [ ] Color correction / brightness controls -- [ ] Restart to install update button -- [ ] **Touchscreen controls** - Enhanced touch support for touchscreen displays --- -## 🔮 Future Exploration: Tauri +## Future Exploration: Tauri Consider migrating to [Tauri](https://tauri.app/) for: