Nach dem ersten fehlgeschlagenen Bus-Connect wird der Controller
dauerhaft deaktiviert, statt bei jedem Hotkey-Druck einen neuen
Connect-Versuch zu starten.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Design-Dokument für automatisches Pausieren laufender MPRIS-Player
während einer Whisper-Aufnahme, mit Resume nach Aufnahme-Stop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
huggingface_hub nutzt jetzt Xet (Rust-Engine) fuer model.bin-Downloads,
welche Python-tqdm komplett bypassen. Der Dialog erschien deshalb nie.
Neuer Ansatz: Nach 500ms Wartezeit wird ein indeterminater Wartebalken
angezeigt -- sowohl bei Downloads als auch bei langsamer Initialisierung.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dokumentiert Linux- und Windows-Setup, inklusive der zuvor fehlenden
System-Pakete libayatana-appindicator und gobject-introspection für
das Tray-Icon unter KDE/Wayland.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ohne python-gobject wählt pystray im uv-Venv das _xorg-Backend, das
unter KDE/Wayland kein funktionierendes Tray-Menü liefert. Mit
PyGObject als expliziter Linux-Dep greift pystray._appindicator
(libayatana-appindicator) und das Menü funktioniert.
System-Deps (nicht automatisch): libayatana-appindicator,
gobject-introspection — im README dokumentiert bzw. nachzutragen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fügt Build-Infrastruktur hinzu, mit der whisper-local als
selbständiges Windows-ZIP-Paket ohne Python-Installation
bereitgestellt werden kann.
- whisper_local.spec: PyInstaller onedir-Konfiguration für Windows 64-bit
mit allen nativen DLLs (ctranslate2/CUDA, pywin32, PortAudio,
onnxruntime, av/FFmpeg) und Hidden Imports für platform-bedingte Backends
- build.ps1: Build-Skript das versioniertes ZIP erstellt (.\build.ps1 -Clean)
- transcriber.py: portabler Modell-Cache neben der EXE im gebündelten Modus
- pyproject.toml: pyinstaller>=6.0 als [build]-Abhängigkeitsgruppe, v1.0.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
run() wartete auf den Hotkey-Task direkt; beim Neustart des Listeners
wurde dieser Task beendet und run() kehrte zurück. Jetzt wartet run()
auf ein asyncio.Event (_quit_event), das nur durch _quit() gesetzt wird.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implementiere drei Hilfsfunktionen in _settings.py:
- check_hotkey_conflict(): Prüft mit Win32 RegisterHotKey ob eine Taste belegt ist
- list_microphones(): Gibt alle Eingabegeräte als (name, index) Tupel zurück
- pynput_to_evdev_key(): Konvertiert pynput Keys zu evdev Key-Namen
Alle Tests (9 neue + 9 existierende) bestehen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements Task 5 of the TDD plan: creates the tray package with
AppState enum (WAITING, RECORDING, TRANSCRIBING) and a create_icon()
function that generates colorized microphone icons via Pillow.
- whisper_local/tray/__init__.py: empty package marker
- whisper_local/tray/_tray.py: AppState enum
- whisper_local/tray/_icon.py: icon generation with state-specific colors
- tests/test_tray.py: comprehensive test coverage for icon creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>