Skip to content

Releases: levtos/Title_classifier

v3.5.1

Choose a tag to compare

@github-actions github-actions released this 28 Jul 00:10

Full Changelog: v3.5.0...v3.5.1

v3.5.0 · Quell-Entität sichtbar + im Reconfigure änderbar

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 22 Jul 08:35

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 den entity_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_id und die Trennung der vier Stash-Slots bleiben unverändert.
  • Sichtbar ohne Reconfigure: Die Enum-/Raw-/Katalog-Sensoren jedes Watchers tragen jetzt source_entity, online_entity und artwork_entity_id als 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

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 12 Jul 15:16

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 NULL statt
    „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_at nie zurück (kein Auto-Reopen); die
    Auto-Unhide-Grace betrifft ausschließlich hidden_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_detail liefern reviewed +
    reviewed_at; neuer Command title_classifier/v3/set_reviewed;
    Export/Import transportiert reviewed_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)

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 07 Jul 06:02
26bf25e

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.tsx renders one collapsible master header per group (label · count badge · Master · X/N aktiv · Enum <max>); the existing WatcherCards (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: OK
  • vitest: 98 passed (+5 for groupSourcesByContext)
  • 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

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 07 Jul 05:48
eced311

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_runtimes now includes top-level v3 runtimes and every subentry runtime; all_v3_runtimes delegates to it. Multiple watchers with the same context (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_taken error (EN/DE). Each slot needs a unique name.
  • New pure watcher_name_slug helper keeps the collision check aligned with the sensor.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

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 06 Jul 20:42
520057b

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_classifier
  • python -m pytest -q -> 193 passed, 1 .pytest_cache permission warning on Windows

v3.3.0 · Watcher Subentries

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 06 Jul 20:22
05d587f

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

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 05 Jul 09:17
ebb0ebf

What's Changed

  • feat(title_classifier): Diagnose-Zugang vereinheitlicht (v3.2.3) by @levtos in #65

Full Changelog: v3.2.2...v3.2.3

v3.2.2 — Diagnose als Modal

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 05 Jul 08:36
a82a2c2

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

Choose a tag to compare

@Levtos-Acc Levtos-Acc released this 05 Jul 08:10
beb5fd7

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: buildTraceView teilt die Logik zwischen Panel-Mini und Trace-Seite (baut auf explainEffectiveEnum/sortSightings aus 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).