Repository navigation
Releases: levtos/Title_classifier
Release list
v3.5.1
Full Changelog: v3.5.0...v3.5.1
v3.5.0 · Quell-Entität sichtbar + im Reconfigure änderbar
Behebt, dass die beim Anlegen gewählte Quell-Entität eines Watchers danach weder sichtbar noch änderbar war (GitLab ha-platform/control#52). Rein additiv — keine Änderung am Watcher-/Stash-Slot-Modell und keine Klassifizierungslogik.
- Reconfigure zeigt und ändert
source_entity: Der bestehende Reconfigure-Flow (Top-Level-Watcher und Stash-Slot-Subentries) enthält jetzt die beobachtete Quell-Entität, vorbelegt mit dem aktuellen Wert und editierbar. Der Name bleibt fest — er definiert denentity_id-Slug (sensor.title_classifier_<slug>_enum/raw/catalog) und damit den Automationsvertrag. - Verlustfrei: Eine geänderte Quelle bindet beim automatischen Reload nur den Runtime-Beobachter neu. Katalogdaten (Postgres, gekeyt über scope/media_type/signal_type/Titel), Entity-IDs,
unique_idund die Trennung der vier Stash-Slots bleiben unverändert. - Sichtbar ohne Reconfigure: Die Enum-/Raw-/Katalog-Sensoren jedes Watchers tragen jetzt
source_entity,online_entityundartwork_entity_idals Attribute — die Verdrahtung je Slot ist damit direkt in den Entwicklerwerkzeugen prüfbar.
Tests: 216 passed. Voller Changelog: siehe CHANGELOG.md.
v3.4.0 · Inbox-Status erledigt, 5-Watcher-Übersicht, Variantenmodus
3.4.0 - 2026-07-12 — Inbox-Status „erledigt", 5-Watcher-Übersicht, Variantenmodus
Zusammenhängender UX-/Logik-Umbau (GitLab ha-platform/control#27). Drei
unabhängige Zustände pro Katalogeintrag: enum (0 ist gültig), neu
reviewed_at (NULL = offen, gesetzt = erledigt) und hidden_at (Ignorieren,
unverändert inkl. Auto-Unhide-Grace).
- Datenmodell/Migration: additive Spalte
tc_v3_catalog.reviewed_at;
einmaliger, idempotenter Backfill im Schema-Apply (guarded DO-Block):
ALLE Bestandseinträge gelten als erledigt (COALESCE(hidden_at, updated_at)),
die Inbox startet nach dem Upgrade leer. Nur neue Titel beginnen offen. - Inbox = Arbeitswarteschlange: Filter jetzt
reviewed IS NULLstatt
„Enum 0"; Aktionen „Erledigt" einzeln + als Stapel; Enum-Speichern schließt
NICHT stillschweigend ab; Enum-0-Titel können bewusst erledigt werden.
Wording: „Neue Titel prüfen", „versteckt" → „ignoriert". - Stash: das Enum-1-Seeding (FLEET-43) setzt im selben Vorgang
reviewed_at— Stash-Titel erscheinen weiterhin nie in der Inbox. - Erneute Sichtung setzt
reviewed_atnie zurück (kein Auto-Reopen); die
Auto-Unhide-Grace betrifft ausschließlichhidden_at. - Übersicht: genau 5 Watcher. Ein Watcher pro Context; HomePod/PC/PS5/
Apple TV als Einzelkarten ohne Gruppenrahmen, Stash als EINE Karte mit vier
kompakten Slot-Zeilen (x/4 Slots online). Statistiken dedupliziert:
„Einträge" aus dem Union-Store, „Offen" (statt „Unklassifiziert") über die
geteilte reviewed-Definition — vorher zählten die 4 Stash-Slots + Apple TV
denselben video-Katalog fünffach. Statusleiste nutzt dieselben Definitionen. - Katalog: Struktur-Filter (Master/Varianten/eigenständig), Status-Filter
(offen/erledigt), Kandidaten-Badge (⛓) und 🪄 Variantenmodus jetzt auch im
Katalog; Tab „Ausgeblendet" → „Ignoriert"; Badge „Enum 0" ersetzt durch
„offen"; Detailpanel mit „Erledigt"/„Wieder öffnen". - Fortlaufender Variantenmodus: Queue über alle Kandidaten-Cluster
(pickAllClusters+ purer Zustandsautomat), Aktionen „Als Variante
speichern & weiter", „Kein Master — eigenständig erledigen", „Überspringen",
„Zurück", „Beenden"; erfolgreiche Zuordnung erledigt die offenen Mitglieder;
Snapshot-Technik gegen Poll-Umsortierung; keine neue Stapel-Backend-API. - WS/API additiv:
list_entries/entry_detailliefernreviewed+
reviewed_at; neuer Commandtitle_classifier/v3/set_reviewed;
Export/Import transportiertreviewed_at. Sensor-Entity-IDs/-Slugs,
Effective-Enum-Resolver und alle HA-Contracts unverändert; die vier
Stash-Slots bleiben im Backend getrennte Subentries. - Tests: +24 pytest (reviewed-Modell, Stash-Seeding, Schema-Invarianten,
API/IO), +34 Vitest (Inbox-Filter, Queue, Struktur-/Status-Filter,
5-Watcher-Statistik); Suiten 213/127 grün.
v3.3.3 · Übersicht: Master-Gruppe pro Typ (UI-only)
Integration: Title Classifier (title_classifier) — v3.3.3
UI-only: the Overview now groups watchers by context into one collapsible master block per type. Several watchers of the same context (e.g. Stash Slot 1..4) sit under a single "Stash" master header instead of loose flat cards.
STASH ▾ 4 Master · 2/4 aktiv · Enum 1
├ Stash Slot 1 · Overcharged Breeding · 1
├ Stash Slot 2 · River & Victor · 1
├ Stash Slot 3 · — inaktiv — · 0
└ Stash Slot 4 · — inaktiv — · 0
Change
- New pure helper
groupSourcesByContext(unit-tested): groups sources by context in first-appearance order and precomputes the master aggregate — total, active/online counts, highest active enum, active titles. Overview.tsxrenders one collapsible master header per group (label · count badge ·Master · X/N aktiv · Enum <max>); the existingWatcherCards (incl. inline enum/apply) are unchanged underneath.- CSS for the group/header (
styles.css). Frontend bundle rebuilt (vite).
Deliberately NOT in this PR
No new entity, no aggregate sensor, no downstream/contract/WS change — grouping is purely visual. (The "real aggregate master sensor" option was declined by the user for now.)
Gates
tsc --noEmit: OKvitest: 98 passed (+5 forgroupSourcesByContext)pytest: 198 passed (Python unchanged)- manifest JSON valid · manifest 3.3.3
🤖 Generated with Claude Code
v3.3.2 · Multi-Watcher/Slot: nested watcher subentries visible
Title Classifier title_classifier v3.3.2 — Multi-Watcher/Slot: nested watcher subentries visible
Fixes that several watcher subentries under one parent (e.g. Stash Slot 1..4) are managed and shown separately in the v3 overview.
Root cause
A watcher subentry ran (own runtime, sensors, catalog sightings) but was invisible to the overview, shared catalog gather, and post-mutation refresh: all_v3_runtimes / select_v3_runtimes only read bucket["runtime"] (top-level), while subentry runtimes live in bucket["subentry_runtimes"]. Only a single Stash watcher appeared.
Changes (Title Classifier only)
select_v3_runtimesnow includes top-level v3 runtimes and every subentry runtime;all_v3_runtimesdelegates to it. Multiple watchers with the samecontext(e.g.stash) appear separately and share one catalog.- Watcher-subentry flow rejects a name whose entity-id slug is already taken by any watcher (top-level or subentry) — new
name_takenerror (EN/DE). Each slot needs a unique name. - New pure
watcher_name_slughelper keeps the collision check aligned with thesensor.title_classifier_<slug>_*entity-id contract.
Model
One watcher per slot entity (Option A) using existing stash slot entities — no new attribute field, no A | B string-splitting (one title-key/sighting per slot).
Not touched / safety
No changes to Stash / Jellyfin / other integrations. No migration, no DB cleanup, no overwriting of existing enums, no frontend changes.
Gates
py_compile OK · JSON valid · pytest 198 passed (+5). HACS-ready.
PR #68 · merge eced311 · tag v3.3.2.
Title Classifier v3.3.1
Title Classifier v3.3.1
Adhoc-Hotfix fuer Invalid handler specified, wenn Watcher hinzufuegen versehentlich von einem flachen Watcher-Eintrag wie Stash statt vom Title Classifier DB-Hub gestartet wird.
watcher-Subentry-Flow ist als Kompatibilitaetspfad auch auf bestehenden Top-Level-Watcher-Eintraegen registriert; der DB-Hub bleibt der kanonische Parent.- Subentry-Runtimes und Sensoren werden auch unter einem solchen Legacy-Parent korrekt geladen.
- Hub-Setup bindet den DB-Pool nun korrekt, bevor Subentry-Runtimes gestartet werden.
- Claude-Hinweis: Der kanonische Weg bleibt
Title Classifier DB->Watcher hinzufuegen; der Legacy-Parent-Pfad ist nur ein Adhoc-Kompatibilitaetsnetz fuer HA-UI-Starts von flachen Watcher-Eintraegen. - Keine Migration, keine DB-Bereinigung, keine Downstream-Contract-Aenderung.
Checks:
python -m compileall custom_components\title_classifierpython -m pytest -q-> 193 passed, 1.pytest_cachepermission warning on Windows
v3.3.0 · Watcher Subentries
Title Classifier → v3.3.0 · Watcher Subentries · HACS-ready
- Watcher können jetzt als Config-Subentries unter dem „Title Classifier DB"-Hub angelegt werden — sie erscheinen als verschachtelte Geräte unter einem Eintrag statt als separate Top-Level-Einträge („Hub → Watcher hinzufügen").
- Ermöglicht mehrere überwachte Quellen/Slots sauber als eigene Watcher — z. B. Stash-Slots und später Jellyfin. Stash ließ sich vorher nicht sauber als einzelner Watcher/Sub-Watcher hinzufügen; der Subentry-Ansatz ist die Voraussetzung dafür.
- Bestehende flache Watcher bleiben kompatibel (HP/PC/PS5/TV, flache Stash-Slots) — beide Wege koexistieren, additiv.
- Entity-IDs bleiben name-basiert stabil (
sensor.title_classifier_<name>_*). - Keine Migration, keine DB-Bereinigung, keine Downstream-Contract-Änderung.
- Vorbereitung für sauberere Multi-Watcher-Setups.
Umsetzung: WatcherRuntimeV3/Sensoren via Adapter von ConfigEntry entkoppelt; Hub startet pro Subentry Runtime + Sensoren (config_subentry_id); reine Formular-Daten in HA-freies flow_data.py ausgelagert + unit-getestet. Gates: pytest 193 passed, py_compile alle Module, JSON valide.
v3.2.3
What's Changed
Full Changelog: v3.2.2...v3.2.3
v3.2.2 — Diagnose als Modal
title_classifier / Entity-Title-Mapper → v3.2.2 · HACS-ready
UX-Korrektur zu v3.2.1: Trace ist keine eigene Menüseite mehr, sondern eine Diagnoseansicht als Modal aus dem Katalog. Rein Frontend — keine neue API, kein Backend-Refactor, keine Migration.
- Trace-Menüpunkt entfernt — Navigation wieder klar (Übersicht · Inbox · Katalog · Import/Export · Einstellungen).
- Trace als Diagnose-Modal im Katalog: Button „Diagnose öffnen" im Detailpanel öffnet ein großes React-Overlay (schließbar per Button/Escape/Klick-außerhalb).
- Große Diagnose zeigt den Eintragstitel prominent oben, darunter Medienart, Quelle/Context, Status; breite 2-Spalten-Karten + Sichtungstabelle.
- Standalone-Trace-Seite + Hash-Deep-Link entfernt; Mini-Trace im Katalog bleibt kompakt; Katalog-Aktionen (Gruppe/Hidden) und Inbox-Detailpanel unverändert.
- Keine globale Audit-Historie, solange keine Einzel-Events gespeichert werden; keine neue Backend-API; keine Artwork-Daten gespeichert.
Gates grün: vitest 91 · tsc+vite build · node --check · py_compile · pytest 189 (kein Backend-Change).
v3.2.1 — Trace Full View
title_classifier / Entity-Title-Mapper → v3.2.1 · HACS-ready
Hybrid-Trace: kompakt im Katalog, groß auf der eigenen Seite. Rein Frontend — keine neue API, kein Backend-Refactor, keine Migration.
- Trace Full View ergänzt: die Trace-Seite ist jetzt die große, mehrspaltige Diagnoseansicht für den gewählten Katalogeintrag (Entscheidung, beteiligte Faktoren, Vererbung/Varianten, Sichtungstabelle).
- Katalog-Detailpanel-Trace kompakter: nur noch Mini-Zusammenfassung + Button „Trace groß öffnen" (Übergabe über stabile Entry-ID, keine UUID-Eingabe).
- Deep-Link + Reload-Persistenz via URL-Hash
#trace/<id>; saubere Empty-/Loading-/Not-found-States statt weißer Seite; passive Polls zerstören die Seite nicht. - Kein Duplikat-Code:
buildTraceViewteilt die Logik zwischen Panel-Mini und Trace-Seite (baut aufexplainEffectiveEnum/sortSightingsaus v3.2.0). - Keine globale Audit-Historie, solange keine Einzel-Events gespeichert werden; keine Auto-Gruppierung; keine Artwork-Daten gespeichert.
- Inbox-Detailpanel und Katalog-Aktionen (Gruppe/Hidden) unverändert.
Gates grün: vitest 96 · tsc+vite build · node --check · py_compile · pytest 189 (kein Backend-Change).