Commit Graph
96 Commits
Author SHA1 Message Date
infoandClaude Sonnet 5 66ecf55ea9 docs: OpenWiki-Dokumentation und Auto-Update-Workflow hinzufügen
Fügt generierte OpenWiki-Docs (Architektur, Domain, Betrieb, Tests, Workflows)
sowie den GitHub-Actions-Workflow zur automatischen Aktualisierung hinzu.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 14:53:30 +02:00
info c69dddd8f5 docs(claude): add behavioral guidelines for LLM coding 2026-06-15 15:01:57 +02:00
infoandClaude Sonnet 4.6 8abaf39a3a feat(claude): bump-version Skill auf uv version --bump umgestellt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 16:43:00 +02:00
info fb671003d2 docs: update README with microphone monitoring and dependency changes 2026-05-14 19:13:26 +02:00
infoandClaude Sonnet 4.6 c29505fac8 feat(claude): bump-version Skill hinzugefügt
Neuer projektspezifischer Skill, der bei Commit-Anfragen automatisch
fragt ob die Version (pyproject.toml, SemVer) mit gebumpt werden soll,
und bei direkten Release-Anfragen Version + Commit + Git-Tag erstellt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:52:59 +02:00
infoandClaude Sonnet 4.6 8aed8b7e8b chore: bump version to 1.3.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:47:25 +02:00
infoandClaude Sonnet 4.6 1f8adc5ce0 fix(app): Recorder-Stop vor Ersatz + create_monitor in Tests mocken
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:19:01 +02:00
infoandClaude Sonnet 4.6 8e05c5b62d feat(app): Mikrofon-Monitor in App integriert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 18:15:59 +02:00
info d0aca751bd feat(tray): set_warning() für Tray-Tooltip-Warnung 2026-05-14 18:12:21 +02:00
info 2e29f1729b feat(microphone): Win32Monitor via IMMNotificationClient mit Polling-Fallback 2026-05-14 18:11:17 +02:00
info 7095b0b325 feat(microphone): PollMonitor meldet fehlendes Gerät sofort beim Start 2026-05-14 17:40:36 +02:00
info de6c61aeb3 feat(microphone): PollMonitor mit Geräteerkennung (TDD) 2026-05-14 17:37:24 +02:00
info 02496fb708 feat(microphone): Protocol + create_monitor() Factory-Skeleton 2026-05-14 17:35:59 +02:00
info 67687a9b43 feat(notify): notify-py + _notification.py Wrapper 2026-05-14 17:33:37 +02:00
infoandClaude Sonnet 4.6 9d53ff7eee docs: Implementierungsplan für Mikrofon-Monitor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:29:57 +02:00
infoandClaude Sonnet 4.6 8bbc97a204 docs: Spec für Mikrofon-Monitor (Geräteüberwachung + Benachrichtigung)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 17:21:54 +02:00
infoandClaude Opus 4.6 bead04ff09 feat(tray): Modell-Lade-Wartebalken plattformübergreifend anzeigen
Entfernt den Windows-only-Guard in App.__init__, damit der Dialog mit
indeterminatem ttk.Progressbar auch unter Linux erscheint, wenn das Laden
länger als 500 ms dauert. Ersetzt das literale \u2026 im Label durch das
Zeichen … und passt Spec/Plan an den tatsächlichen Umsetzungsstand an
(Timeout-basierter Wartebalken statt tqdm-Monkey-Patch, da die Xet-Engine
Python-tqdm bypasst).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 20:58:21 +02:00
infoandClaude Sonnet 4.6 16fccffa97 build: Version auf 1.2.0 anheben (Windows SMTC Media-Pause)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 18:22:57 +02:00
info 265ca3c212 feat(media): Factory dispatcht auf win32 zum SmtcController 2026-04-16 18:16:51 +02:00
info 802e06acd9 feat(media): SmtcController.resume() stellt nur eigene Pausen wieder her 2026-04-16 18:15:16 +02:00
info 89edf23de9 feat(media): SmtcController.pause() erkennt und pausiert PLAYING-Sessions 2026-04-15 20:14:36 +02:00
info 2863da0a68 test(media): winrt-Import in test_media_smtc.py plattformabsichern 2026-04-15 20:13:14 +02:00
infoandClaude Sonnet 4.6 ed03d954a6 feat(media): SmtcController Skeleton mit circuit-breaker
Circuit-breaker-Pattern: Nach erstem Fehler beim SMTC-Manager-Zugriff
bleibt _broken=true und verhindert alle weiteren Zugriff-Versuche.
Logs Warnung einmalig und cleart _paused.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 20:11:02 +02:00
info 83e97f8599 build: pywinrt als win32-Dependency hinzufügen 2026-04-15 20:09:39 +02:00
infoandClaude Sonnet 4.6 3ee18f7f2b docs: Implementierungsplan für Windows SMTC Media-Controller
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 20:07:05 +02:00
infoandClaude Sonnet 4.6 a7b5bd2241 docs: Spec auf pywinrt umgestellt (winsdk veraltet)
winsdk wird seit fast 3 Jahren nicht mehr gepflegt; pywinrt ist der
aktive Nachfolger. Alle Paketnamen, Imports und Dependencies aktualisiert,
API gegen echte pywinrt-Installation auf Windows verifiziert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 20:02:25 +02:00
infoandClaude Sonnet 4.6 0beb8aeb7c docs: Spec für Windows SMTC Media-Controller
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 19:34:41 +02:00
infoandClaude Opus 4.6 a1baee59f6 fix(app): Aktive Medien-Pausen vor Config-Reload fortsetzen
Beim Ersetzen des Media-Controllers (z. B. wenn der User die
Checkbox deaktiviert) wurden ggf. noch pausierte Player nicht mehr
fortgesetzt. Jetzt wird resume() auf dem alten Controller aufgerufen,
bevor er ersetzt wird.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 19:13:48 +02:00
infoandClaude Opus 4.6 343240fec1 fix(media): Circuit-Breaker für D-Bus-Connect-Fehler
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>
2026-04-15 19:13:17 +02:00
infoandClaude Opus 4.6 5ca22d6699 docs: [media]-Abschnitt in config.example.toml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 19:04:25 +02:00
infoandClaude Opus 4.6 9dfea1e3ef feat(settings): Checkbox für Medien-Pause während Aufnahme
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 19:02:04 +02:00
infoandClaude Opus 4.6 c0fe0f90df feat(app): Medien pausieren bei Aufnahmestart, fortsetzen bei Stopp
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 19:00:06 +02:00
infoandClaude Opus 4.6 b5d6ae6ecc feat(media): MprisController fängt Player- und Bus-Fehler sauber ab
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:58:42 +02:00
infoandClaude Opus 4.6 f23ee1249d feat(media): MprisController.resume() stellt nur eigene Pausen wieder her
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:57:40 +02:00
infoandClaude Opus 4.6 c98a935dbc feat(media): MprisController.pause() via dbus-next
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:56:36 +02:00
infoandClaude Opus 4.6 87bd1a3e50 build: dbus-next als Linux-Dependency hinzufügen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:55:15 +02:00
infoandClaude Opus 4.6 b881dacdf0 refactor(media): speculatives _paused-Feld aus MprisController-Stub entfernen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:54:33 +02:00
infoandClaude Opus 4.6 184df1594e feat(media): Protocol, Factory und Noop-Controller
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:50:55 +02:00
infoandClaude Sonnet 4.6 71602f0ece feat(config): pause_media_during_recording-Flag
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 21:26:36 +02:00
infoandClaude Opus 4.6 52b9ac0a34 docs: Implementation-Plan für Media-Pause während Aufnahme
9 Tasks in TDD-Reihenfolge: Config-Feld, Protocol/Factory/Noop,
dbus-next Dependency, MprisController (pause, resume, Fehlertoleranz),
App-Integration, Tray-Checkbox, Beispiel-Config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 21:21:15 +02:00
infoandClaude Opus 4.6 f981bbcec5 docs: Spec für Media-Pause während Aufnahme
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>
2026-04-14 21:14:19 +02:00
info 34dddcc043 Merge branch 'master' of https://code.vitaligraf.de/info/whisper-local 2026-04-12 12:55:08 +02:00
infoandClaude Sonnet 4.6 1e4bb6638c chore: Version auf 1.1.0 erhöhen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 12:54:14 +02:00
infoandClaude Sonnet 4.6 753dbc555e fix: tqdm-Patch durch Timeout-basierten Wartebalken ersetzen
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>
2026-04-12 12:49:31 +02:00
info e31230fd84 fix: winfo_viewable durch explizites Flag ersetzen, unbenutzte Imports entfernen 2026-04-12 12:36:18 +02:00
info faf9ac4c8b feat: App lädt Whisper-Modell auf Windows mit Fortschrittsdialog 2026-04-12 12:33:37 +02:00
info 3d9f95b3ee fix: root.withdraw() vor messagebox statt destroy() 2026-04-12 12:32:40 +02:00
info c26dfa38d1 fix: root.destroy() erst nach Fehlerbehandlung aufrufen 2026-04-12 12:31:59 +02:00
info 3067499c88 feat: load_model_with_progress mit tkinter-Fortschrittsdialog 2026-04-12 12:30:48 +02:00
info 44c8d8ed84 fix: TkProgressTqdm Typ-Signatur und Test-Isolation verbessert 2026-04-12 12:29:34 +02:00
info e92f5f59fb feat: TkProgressTqdm leitet tqdm-Fortschritt an Queue weiter 2026-04-12 12:28:13 +02:00
info 3a580990ea feat: Transcriber akzeptiert optionales vorgeladenes WhisperModel 2026-04-12 12:26:20 +02:00
infoandClaude Sonnet 4.6 e0893917c1 docs: Implementierungsplan für Model-Download-Fortschrittsdialog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 12:24:34 +02:00
infoandClaude Sonnet 4.6 4d163294f4 docs: Design-Spec für Model-Download-Fortschrittsdialog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 12:19:30 +02:00
infoandClaude Opus 4.6 7b9c4451bb docs: README mit Installation, System-Deps und Nutzung
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>
2026-04-11 21:53:09 +02:00
infoandClaude Opus 4.6 d682003509 build: PyGObject als Linux-Dep für pystray AppIndicator-Backend
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>
2026-04-11 21:47:12 +02:00
info 1153890ea9 build: pystray/Pillow/sv-ttk/darkdetect für Linux freigeben 2026-04-11 21:33:51 +02:00
info db1f55aee1 test: MagicMock im Linux-create_tray-Test für Stil-Konsistenz 2026-04-11 21:32:49 +02:00
info 149289510f feat: create_tray() dispatcht auf Linux zu PystrayApp 2026-04-11 21:30:19 +02:00
infoandClaude Sonnet 4.6 d780960381 fix: EvdevHotkeyListener.stop() cancelt Tasks und schließt Devices
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 21:21:57 +02:00
infoandClaude Sonnet 4.6 107508eeb9 fix(evdev): Resource-Leak und Handling unbekannter Keycodes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 21:19:07 +02:00
infoandClaude Sonnet 4.6 80a01903e8 feat: Linux-Hotkey-Record via evdev
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 21:16:21 +02:00
info f380828309 refactor: Windows-Hotkey-Record in eigenes Modul auslagern 2026-04-11 21:13:10 +02:00
info 64bd584181 refactor: rename Win32TrayApp to PystrayApp 2026-04-11 21:09:39 +02:00
infoandClaude Opus 4.6 2793e7bd44 docs: Implementation-Plan für Linux-Tray & Settings-Dialog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 21:04:01 +02:00
infoandClaude Opus 4.6 514e9fef9c docs: Design-Spec für Linux-Tray & Settings-Dialog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 20:59:27 +02:00
infoandClaude Sonnet 4.6 007006d2ab chore: .gitignore um *.zip und build/ erweitern
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:04:57 +02:00
infoandClaude Sonnet 4.6 05ff5765bf feat: Windows-Packaging mit PyInstaller (ZIP ohne Python-Installation)
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>
2026-04-11 12:01:02 +02:00
infoandClaude Sonnet 4.6 7319ff6299 fix: App beendet sich nicht mehr nach Hotkey-Änderung in Einstellungen
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>
2026-04-11 11:15:55 +02:00
infoandClaude Sonnet 4.6 71806cd0b8 feat: integrate tray icon, settings dialog, and config reload into App
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 21:21:29 +02:00
infoandClaude Sonnet 4.6 ad60da4a38 feat: add create_tray() factory with platform dispatch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 21:17:05 +02:00
infoandClaude Sonnet 4.6 cba0340c76 feat: add SettingsDialog with hotkey recording and microphone selection
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 21:15:34 +02:00
infoandClaude Sonnet 4.6 32c40827e0 feat: add hotkey conflict detection and microphone listing helpers
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>
2026-04-10 21:13:00 +02:00
info 2630d4c7a5 feat: add system theme detection for sv-ttk 2026-04-10 21:11:18 +02:00
info 9a1b96d178 feat: add Win32TrayApp and NoOpTray with state management 2026-04-10 21:09:10 +02:00
infoandClaude Sonnet 4.6 eb74e4787f feat: add AppState enum and programmatic tray icon generation
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>
2026-04-10 21:07:48 +02:00
info c21344dfc2 build: add pystray, Pillow, sv-ttk, darkdetect as Windows dependencies 2026-04-10 21:06:34 +02:00
info 8b64d66326 feat: add stop() method to HotkeyListener protocol and PynputHotkeyListener 2026-04-10 21:05:20 +02:00
info 1d19a197c7 feat: add optional device parameter to Recorder 2026-04-10 21:03:57 +02:00
info 484df3b9fd fix: escape special characters in save_config TOML output 2026-04-10 21:02:36 +02:00
info 1637314c1d feat: add microphone field and save_config to Config 2026-04-10 21:01:08 +02:00
info 3a938ca35b chore: add .worktrees to .gitignore 2026-04-10 20:59:17 +02:00
info 796f301250 docs: add tray icon implementation plan 2026-04-10 20:54:17 +02:00
infoandClaude Sonnet 4.6 600048f356 docs: add tray icon + settings dialog design spec
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:44:42 +02:00
infoandClaude Sonnet 4.6 87eaaa0f6a docs: extend CLAUDE.md with language and uv run conventions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:24:04 +02:00
infoandClaude Sonnet 4.6 71c19370e5 docs: add CLAUDE.md with project context for Claude Code sessions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:18:24 +02:00
infoandClaude Opus 4.6 9c058a1ec8 fix: use ydotool + wl-copy for text insertion on KDE Wayland
Replace wtype (unsupported on KDE) with ydotool key for Ctrl+V
simulation. Use wl-copy for clipboard-based insertion to avoid
ydotool type's QWERTZ/QWERTY layout mismatch. Use DEVNULL instead
of PIPE for wl-copy to prevent hanging on its forked background
process.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 21:26:51 +02:00
info edece0488d fix: listen on all matching input devices, not just the first keyboard 2026-04-06 20:50:44 +02:00
info 8210430986 feat: add systemd user service unit 2026-04-06 20:30:09 +02:00
infoandClaude Sonnet 4.6 3a0f70da0b feat: add main entry-point with asyncio event loop
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:29:45 +02:00
infoandClaude Sonnet 4.6 70d2b6d6e4 feat: add inserter module with clipboard paste and restore
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:28:18 +02:00
infoandClaude Sonnet 4.6 0e9db0b60e feat: add transcriber module with faster-whisper integration
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:26:53 +02:00
infoandClaude Sonnet 4.6 949eb679e1 feat: add recorder module with sounddevice audio capture
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:25:31 +02:00
infoandClaude Sonnet 4.6 ef6ff5b35b feat: add hotkey module with evdev push-to-talk listener
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:23:48 +02:00
infoandClaude Sonnet 4.6 8224fdcc3f feat: add config module with TOML loading and defaults
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:22:25 +02:00
info e8b73de84a chore: project setup with dependencies and entry-point 2026-04-06 20:20:57 +02:00