# Changelog

Alle relevanten Aenderungen am VideoKonverter-Projekt.

## [4.2.0] - 2026-03-02

### TV Admin-Center, konfigurierbare Settings & Bugfixes

Neue Admin-Seite fuer TV-Backend-Verwaltung. Alle HLS-Streaming- und Watch-Status-Parameter
sind jetzt konfigurierbar statt hardcoded. HLS-Session-Monitoring mit Live-Uebersicht.

#### Neue Features

- **TV Admin-Center** (`/tv-admin`): Eigene Verwaltungsseite fuer TV-Backend, erreichbar ueber Navigation
  - HLS-Streaming-Einstellungen: Segment-Dauer, Erstes-Segment-Dauer, Session-Timeout, Max-Sessions
  - Batch-Pause-Toggle: Konvertierung bei Stream pausieren (SIGSTOP/SIGCONT)
  - Watch-Status-Schwelle: Ab wieviel Prozent gilt eine Episode als gesehen (Default 90%, Plex-Standard)
  - HTMX-Formular mit Live-Speichern
- **HLS-Session-Monitoring**: Tabelle mit aktiven Streaming-Sessions (Session-ID, Video, Qualitaet, Laufzeit, Inaktivitaet, Status)
  - Sessions einzeln beenden (Admin-Button)
  - Auto-Refresh alle 15 Sekunden
- **TV-User-Verwaltung verschoben**: QR-Code + CRUD von `/admin` nach `/tv-admin`
- **Konfigurierbare HLS-Konstanten**: Alle vorher hardcodierten Werte (Segment-Dauer 4s, Init-Dauer 1s, Timeout 5min, Max-Sessions 5) jetzt per Admin-UI und ENV-Variablen einstellbar
- **Max-Sessions-Limit**: HLS-Session-Erstellung wird abgelehnt wenn Limit erreicht

#### Bugfixes

- **Library Suchfeld**: Enter-Taste loest jetzt sofort den Filter aus (vorher: nur Input-Event)
- **Watch-Threshold**: Von hardcoded 95% auf konfigurierbaren Wert geaendert (Default 90%)
- **TV-Homepage Cover**: Kleinere Card-Groessen (180→150px Standard, 260→220px Wide) fuer bessere Uebersicht
- **Focus-Outline abgeschnitten**: `.tv-row` Padding/Margin-Fix damit Focus-Ring bei Karten vollstaendig sichtbar

#### Neue ENV-Variablen

- `VK_TV_WATCHED_THRESHOLD` - Gesehen-Schwelle in Prozent (Default: 90)
- `VK_TV_HLS_SEGMENT_SEC` - HLS-Segment-Dauer in Sekunden (Default: 4)
- `VK_TV_HLS_TIMEOUT_MIN` - HLS-Session-Timeout in Minuten (Default: 5)
- `VK_TV_HLS_MAX_SESSIONS` - Max. gleichzeitige HLS-Sessions (Default: 5)
- `VK_TV_PAUSE_BATCH` - Batch bei Stream pausieren (Default: true)

#### Neue API-Endpunkte

- `GET /api/tv/hls-sessions` - Aktive HLS-Sessions auflisten (mit Video-Name aus DB)
- `DELETE /api/tv/hls-sessions/{sid}` - HLS-Session beenden

#### Geaenderte Dateien (10 Dateien)

- `app/config.py` - `tv`-Sektion in Defaults, 5 ENV-Mappings, `tv_config` Property, Docstring
- `app/services/hls.py` - `_tv_setting()` Methode, Config statt Konstanten, Max-Sessions-Check, konfigurierbare Timeouts
- `app/server.py` - `config=self.config` an HLSSessionManager uebergeben
- `app/routes/pages.py` - `/tv-admin` Route + Handler, `POST /htmx/tv-settings` Save-Handler
- `app/routes/tv_api.py` - HLS-Sessions-API (GET/DELETE), `watched_threshold_pct` im Template-Context
- `app/templates/base.html` - Nav-Link "TV Admin" mit Active-State
- `app/templates/tv_admin.html` - **NEU**: Komplettes TV-Admin-Template (Settings, Sessions, Users)
- `app/templates/admin.html` - TV-Sektion + JS komplett entfernt
- `app/templates/tv/series_detail.html` - Threshold-Variable statt hardcoded 95
- `app/templates/library.html` - Enter-Key-Handler auf Suchfeld
- `app/static/tv/css/tv.css` - Card-Groessen reduziert, Focus-Outline-Fix

---

## [4.1.0] - 2026-03-02

### HLS-Streaming, GPU-VAAPI-Fix, Player-Umbau

Natives HLS-Streaming ersetzt die fragile ffmpeg-Pipe. Intel A380 GPU wird korrekt
fuer h264_vaapi-Transcoding genutzt. Player-UI komplett ueberarbeitet.

#### Neue Features

- **HLS-Streaming**: ffmpeg erzeugt .ts-Segmente + m3u8-Playlist in `/tmp/hls/{session_id}/`
  - hls.js Library fuer Non-Safari/Tizen Browser
  - API: `/tv/api/hls/start`, `/tv/api/hls/{sid}/playlist.m3u8`, `/tv/api/hls/{sid}/segment*.ts`
  - Auto-Cleanup inaktiver Sessions (5 Min Timeout)
- **SIGSTOP/SIGCONT**: Laufende Batch-Konvertierung wird waehrend HLS-Streaming pausiert und danach fortgesetzt
- **Codec-Erkennung**: `detectSupportedCodecs()` prueft Browser-Faehigkeiten vor Stream-Start
- **Quality-Auswahl**: UHD/HD/SD/LD im Player waehlbar
- **Loading-Spinner**: Sichtbarer Ladeindikator waehrend Stream-Initialisierung
- **Kompakt-Popup**: Statt grossem Overlay-Panel jetzt kompaktes Popup fuer Audio/Sub/Quality

#### GPU-Fix

- **Intel A380 VAAPI**: Korrekter Pipeline-Aufbau `-vaapi_device /dev/dri/renderD129 -vf 'format=nv12,hwupload' -c:v h264_vaapi`
- **CPU-Fallback**: Automatischer Wechsel auf `libx264 -preset veryfast` wenn GPU fehlschlaegt (Exit < 1s)

#### Geaenderte Dateien

- `Dockerfile` - hls.js Library, VAAPI-Pakete
- `entrypoint.sh` - /tmp/hls Verzeichnis
- `app/services/hls.py` - **NEU**: HLSSessionManager (600+ Zeilen)
- `app/services/queue.py` - SIGSTOP/SIGCONT Integration
- `app/routes/tv_api.py` - HLS-Endpunkte
- `app/static/tv/js/lib/hls.min.js` - **NEU**: hls.js Library
- `app/static/tv/js/player.js` - HLS-Integration, Codec-Erkennung, Kompakt-Popup
- `app/static/tv/css/tv.css` - Loading-Spinner, Popup-Styles
- `app/templates/tv/player.html` - HLS-Player-Markup
- `app/templates/tv/series_detail.html` - Tech-Info-Anzeige

---

## [4.0.3] - 2026-03-01

### JSON-Import-Fix, Player D-Pad-Navigation, Overlay-Bugfix

#### Bugfixes

- **JSON-Import**: `importer.py` konnte bei fehlenden Keys in TVDB-Daten abstuerzen - robusteres `.get()` Handling
- **Player D-Pad-Navigation**: Fernbedienung-Navigation im Player-Overlay funktionierte nicht korrekt auf Samsung TV
- **Overlay-Bugfix**: Player-Overlay schloss sich nicht zuverlaessig beim Druecken der Zurueck-Taste

#### Geaenderte Dateien

- `app/services/importer.py` - Robusteres JSON-Parsing
- `app/static/tv/js/player.js` - D-Pad Keydown-Handler, Overlay-Close-Fix

---

## [4.0.2] - 2026-03-01

### TV-App: FocusManager-Fix, Poster-Caching, Performance

#### Bugfixes
- **FocusManager Navigation**: Von der oberen Nav-Leiste nach unten navigieren springt jetzt direkt zu Content-Karten (Grid/Liste/Detail) statt bei Filter-Dropdowns und View-Switch-Buttons haengenzubleiben
- **Input/Select Editier-Modus**: Textfelder und Select-Dropdowns werden erst nach Enter-Bestaetigung editierbar - D-Pad Navigation kann jetzt ueber Formularfelder hinweg navigieren ohne haengenzubleiben
- **Content-Focus-Speicher**: `_lastContentFocus` merkt sich nur noch echte Content-Elemente (Karten, Listen-Eintraege), nicht mehr Filter/Controls

#### Performance
- **Poster-Caching mit Resize**: Poster-Bilder werden beim ersten Abruf lokal in `.metadata/` gespeichert und auf 300px Breite verkleinert (Pillow)
  - 80% kleinere Bilder (233KB → 47KB pro Poster)
  - Kein externer TVDB-Request mehr nach erstem Laden
  - Cache-Hit: ~10ms statt ~80ms
- **Content-Visibility**: Versteckte View-Container nutzen `content-visibility: hidden` fuer bessere Render-Performance

#### Geaenderte Dateien (4 Dateien, +211/-21 Zeilen)
- `app/routes/library_api.py` - On-Demand Poster-Download + Pillow-Resize-Cache
- `app/routes/tv_api.py` - `_localize_posters()` Helper fuer lokale Poster-URLs
- `app/static/tv/css/tv.css` - Input-Editing-Style, Content-Visibility
- `app/static/tv/js/tv.js` - FocusManager: Input-Modus, Nav→Content Fix, initFocus Fix

---

## [4.0.1] - 2026-03-01

### TV-App: UX-Verbesserungen & Bugfixes

#### Neue Features
- **Alphabet-Seitenleiste**: Vertikale A-Z Sidebar auf Serien-/Filme-Seite zum Filtern nach Anfangsbuchstabe
  - Buchstaben ohne Treffer automatisch abgedunkelt
  - Wird in Ordner-Ansicht versteckt
  - Responsive fuer Handy/Tablet
- **Genre-Select statt Chips**: Genre-Filter als Dropdown-Element (uebersichtlicher bei vielen Genres)
- **Player-Buttons**: Separate Symbole fuer Audio (Lautsprecher-SVG), Untertitel (CC-Badge), Qualitaet (HD-Badge)
  - CC-Button leuchtet wenn Untertitel aktiv, Quality-Badge zeigt aktuellen Modus (4K/HD/SD/LD)
  - Klick oeffnet Overlay direkt bei der entsprechenden Sektion
- **Gesehen-Markierung**: Buttons fuer "Episode gesehen" und "Staffel gesehen" in Serien-Detail
- **Batch-Thumbnails**: Neuer Button "Thumbnails" in der Bibliothek generiert alle fehlenden Episoden-Thumbnails im Hintergrund per ffmpeg
- **Redundanz-Markierung**: Duplikate in der Episoden-Tabelle werden jetzt orange markiert mit "REDUNDANT"-Badge
  - Ranking: Neuerer Codec > kleinere Datei
- **Rating-Sortierung**: Serien/Filme nach Bewertung sortierbar + Min-Rating-Filter

#### Bugfixes
- **tvdb_episode_cache**: Fehlende Spalten `overview` und `image_url` hinzugefuegt (Episoden-Beschreibungen funktionierten nicht)
- **Login-Form Flash**: Auto-Fill-Erkennung statt hartem Timeout (prueft 5x alle 200ms ob Browser Felder ausgefuellt hat)
- **Profil-Wechsel**: Zeigt jetzt alle User an (nicht nur die mit aktiver Session)
- **Debug-Prints entfernt**: Bereinigung aus server.py und tv_api.py
- **Route-Registrierung**: TV-API-Routen in `_setup_app()` verschoben (verhinderte 500-Fehler)

#### Neue API-Endpunkte
- `POST /api/library/generate-thumbnails` - Batch-Thumbnail-Generierung starten
- `GET /api/library/thumbnail-status` - Thumbnail-Fortschritt abfragen

#### Geaenderte Dateien (19 Dateien, +821/-122 Zeilen)
- `app/routes/library_api.py` - Batch-Thumbnails + aiomysql Import
- `app/routes/tv_api.py` - Gesehen-Status, Rating-Filter, Genre-Select
- `app/server.py` - Route-Registrierung Fix
- `app/services/auth.py` - Watch-Status DB-Methoden
- `app/services/library.py` - tvdb_episode_cache Spalten-Fix + Migration
- `app/static/css/style.css` - Redundanz-Zeilen-Style
- `app/static/js/library.js` - Redundanz-Erkennung, Batch-Thumbnails
- `app/static/tv/css/tv.css` - Player-Badges, Alphabet-Sidebar, Rating-Styles
- `app/static/tv/i18n/de.json` + `en.json` - Rating-Uebersetzungen
- `app/static/tv/js/player.js` - Overlay-Sections, Button-Updates
- `app/static/tv/js/tv.js` - Gesehen-Buttons, Alphabet-Filter
- `app/templates/library.html` - Thumbnails-Button
- `app/templates/tv/login.html` - Auto-Fill-Erkennung
- `app/templates/tv/movies.html` - Alphabet-Sidebar, data-letter
- `app/templates/tv/player.html` - Audio/CC/Quality-Buttons
- `app/templates/tv/profiles.html` - Alle User anzeigen
- `app/templates/tv/series.html` - Alphabet-Sidebar, data-letter
- `app/templates/tv/series_detail.html` - Gesehen-Buttons, Episoden-Beschreibungen

---

## [4.0.0] - 2026-03-01

### TV-App: Vollwertiger Streaming-Client

Kompletter Ausbau der TV-App von einfachem Browser zu einem Netflix-aehnlichen Streaming-Client
mit Multi-User, Einstellungen, Bewertungen, Merkliste und Internationalisierung.

#### Internationalisierung (i18n)
- JSON-basiertes Uebersetzungssystem (`static/tv/i18n/de.json`, `en.json`)
- Jinja2-Template-Funktion `t('key.subkey')` fuer alle Texte
- Neuer Service `app/services/i18n.py` mit Sprach-Loader und Fallback (DE)
- Pro-User Spracheinstellung (`ui_lang` in tv_users)
- Alle Templates komplett auf i18n umgestellt

#### Multi-User & Profil-Wechsel
- Quick-Switch: Profilauswahl-Screen (`/tv/profiles`) ohne erneutes Passwort
- Mehrere User pro Geraet (Client), Sessions ueber `vk_client_id` Cookie
- Profilfarben (Avatar-Kreis) pro User konfigurierbar
- "Angemeldet bleiben" Option beim Login (permanente vs. 30-Tage-Sessions)
- Neue DB-Tabelle `tv_clients` fuer Geraete-Einstellungen

#### Benutzer-Einstellungen (`/tv/settings`)
- Menusprache (DE/EN), Audio-Sprache, Untertitel-Sprache
- Theme-Auswahl (Dunkel/Mittel/Hell) mit Live-Vorschau
- Serien- und Film-Ansicht (Raster/Liste/Detail)
- Autoplay: An/Aus, Countdown-Dauer, Max. Folgen am Stueck
- Suchverlauf loeschen, Fortschritte zuruecksetzen

#### Themes (Dark/Medium/Light)
- CSS Custom Properties (`--bg-primary`, `--text-primary`, etc.)
- `data-theme` Attribut auf `<html>`, gespeichert pro User
- Dunkel (Standard), Mittel (grau), Hell (weiss)
- Alle TV-Seiten, Player, Settings, Login unterstuetzen Themes

#### 3 Ansichten (Grid / Liste / Detail)
- **Grid**: Poster-Kacheln im responsiven Grid (wie bisher)
- **Liste**: Kompakte 1-Zeile pro Eintrag mit Mini-Poster
- **Detail**: Groesseres Poster + Beschreibung + Metadaten
- View-Switcher (3 Icons oben rechts) auf Serien- und Filme-Seite
- Einstellung wird pro User gespeichert (getrennt fuer Serien/Filme)

#### Episoden-Darstellung (verbessert)
- Episoden-Thumbnails: TVDB-Bilder oder ffmpeg-Fallback (Frame bei 25%)
- Episodenbeschreibung aus TVDB-Cache angezeigt
- Watch-Progress-Balken pro Episode
- Gesehen-Haekchen bei >= 95% Fortschritt
- Episodennummer, Titel, Dauer, Codec-Info

#### Filter & Quellen-Tabs
- Quellen-Tabs oben: `[Alle] [Quelle 1] [Quelle 2]` (aus library_paths)
- Genre-Chips als Filter unterhalb der Tabs
- Sortierung: Name (A-Z/Z-A), Neueste, Episoden-Anzahl, Bewertung
- Alle Filter als URL-Parameter (`?source=1&genre=Action&sort=title&rating=3`)

#### Merkliste (Watchlist)
- Herz-Button auf Serien-/Film-Detailseiten (Toggle)
- Eigene Seite `/tv/watchlist` mit allen gemerkten Inhalten
- Tabs fuer Serien/Filme auf der Merkliste-Seite
- Neue DB-Tabelle `tv_watchlist` (user_id + series_id/movie_id)
- Navigation: Merkliste als eigener Tab

#### Bewertungssystem (Rating)
- 5-Sterne-Bewertung pro User auf Serien-/Film-Detailseiten
- Klickbare Sterne mit Hover-Effekt + Entfernen-Button
- Durchschnittsbewertung aller User angezeigt
- TVDB-Score als externes Rating-Badge
- Mini-Sterne in allen 3 Listen-Ansichten (Grid/Liste/Detail)
- Rating-Filter (Min. Sterne) und Sortierung nach Bewertung
- Neue DB-Tabelle `tv_ratings`, neue Spalte `tvdb_score`

#### Manueller Watch-Status
- Pro Episode: Gesehen/Nicht gesehen Toggle
- Pro Staffel: "Ganze Staffel als gesehen markieren"
- Pro Serie: "Serie als gesehen markieren"
- In Einstellungen: "Alle Fortschritte zuruecksetzen"
- Neue DB-Tabelle `tv_watch_status`

#### Player-Verbesserungen
- Naechste Episode: Overlay-Countdown (konfigurierbar 5-30 Sek.)
- "Schaust du noch?" Dialog nach X Folgen (Netflix-Style)
- Player-Overlay-Menue: Audio-Spur, Untertitel, Qualitaet, Geschwindigkeit
- Audio-Spur-Auswahl aus verfuegbaren Tracks
- Untertitel-Extraktion (SRT/ASS -> WebVTT) per ffmpeg
- Fernbedienung-navigierbar (FocusManager)

#### Streaming-Qualitaeten
- 4 Modi: UHD (Original), HD (1080p), SD (720p), Low (480p)
- Video copy wenn Original <= Ziel-Aufloesung, sonst Re-Encoding
- Audio nach Client-Config (Stereo/Surround/Original)

#### Suchverlauf
- Letzte Suchen werden gespeichert und angezeigt
- Loeschbar ueber Einstellungen oder einzeln

#### Queue-Bugfix
- `delete_source`-Flag wird jetzt korrekt aus der DB geladen (war immer `False`)
- Fix in `queue.py`: `job['delete_source']` statt hartcodiertes `False`

### Neue Dateien
- `app/services/i18n.py` - Internationalisierungs-Service
- `app/static/tv/i18n/de.json` - Deutsche Uebersetzungen (~200 Keys)
- `app/static/tv/i18n/en.json` - Englische Uebersetzungen (~200 Keys)
- `app/templates/tv/profiles.html` - Profilauswahl (Quick-Switch)
- `app/templates/tv/settings.html` - Benutzer-Einstellungen
- `app/templates/tv/watchlist.html` - Merkliste

### Geaenderte Dateien
- `app/services/auth.py` - Multi-User, Watchlist, Status, Rating, Client-Settings, 8 neue DB-Tabellen/Spalten
- `app/services/tvdb.py` - Episoden-Bilder, tvdb_score Extraktion
- `app/services/queue.py` - delete_source Bugfix
- `app/routes/tv_api.py` - ~20 neue Endpunkte (Settings, Profiles, Watchlist, Rating, Status, Filter)
- `app/routes/library_api.py` - Thumbnail-Endpunkt, Subtitle-Extraktion
- `app/server.py` - i18n-Service Integration
- `app/templates/tv/base.html` - i18n, Theme-Support, Navigation erweitert
- `app/templates/tv/home.html` - Watchlist-Bereich, i18n
- `app/templates/tv/series.html` - 3 Ansichten, Filter, Quellen-Tabs, Rating, i18n
- `app/templates/tv/movies.html` - 3 Ansichten, Filter, Quellen-Tabs, Rating, i18n
- `app/templates/tv/series_detail.html` - Rating, Watchlist, Episoden-Thumbnails, i18n
- `app/templates/tv/movie_detail.html` - Rating, Watchlist, Versionen, i18n
- `app/templates/tv/player.html` - Overlay-Menue, Naechste Episode, Audio/Sub-Auswahl
- `app/templates/tv/search.html` - Suchverlauf, i18n
- `app/templates/tv/login.html` - "Angemeldet bleiben", i18n
- `app/static/tv/js/player.js` - Komplett ueberarbeitet (Overlay, Audio, Subs, Quality, Next)
- `app/static/tv/css/tv.css` - Themes, 3 Ansichten, Rating, Watchlist, Player-Overlay (~500 neue Zeilen)

### Neue DB-Tabellen
- `tv_clients` - Geraete-Einstellungen (Sound, Qualitaet)
- `tv_watchlist` - Merkliste pro User (Serien + Filme)
- `tv_watch_status` - Manueller Watch-Status (Episode/Staffel/Serie)
- `tv_ratings` - 5-Sterne-Bewertungen pro User
- `tv_episode_thumbnails` - Episoden-Bild-Cache

### Neue DB-Spalten (tv_users)
- `preferred_audio_lang`, `preferred_subtitle_lang`, `subtitles_enabled`
- `ui_lang`, `series_view`, `movies_view`, `avatar_color`, `theme`
- `autoplay_enabled`, `autoplay_countdown_sec`, `autoplay_max_episodes`

### Neue DB-Spalten (library_series/library_movies)
- `tvdb_score` (FLOAT) - Externe TVDB-Bewertung

### Neue API-Endpunkte
- `GET/POST /tv/settings` - Benutzer-Einstellungen
- `GET /tv/profiles` - Profilauswahl
- `POST /tv/switch-profile` - Profil wechseln
- `GET /tv/watchlist` - Merkliste anzeigen
- `POST /tv/api/watchlist` - Merkliste Toggle
- `POST /tv/api/rating` - Bewertung setzen/loeschen
- `POST /tv/api/watch-status` - Watch-Status aendern
- `DELETE /tv/api/search/history` - Suchverlauf loeschen
- `GET /api/library/videos/{id}/thumbnail` - Episoden-Thumbnail
- `GET /api/library/videos/{id}/subtitles/{index}` - Untertitel als WebVTT

---

## [3.1.1] - 2026-02-28

### Samsung TV Installation + Streaming-Fix
- Tizen-App erfolgreich auf Samsung GQ65Q7FAAUXZG installiert
- Streaming-Fix: `movflags=frag_keyframe+empty_moov+default_base_moof`
- Samsung-signierte Zertifikate (nicht Tizen-Standard)

---

## [3.1.0] - 2026-02-28

### TV-App komplett
- TV-App mit Login, Home, Serien, Filme, Player, Suche
- Auth-System: bcrypt, DB-Sessions (30 Tage Cookie)
- Pro-User Berechtigungen (Serien, Filme, Admin, erlaubte Pfade)
- PWA: manifest.json + Service Worker
- Tizen-App fuer Samsung Smart TVs
- Admin-Seite: QR-Code + User-Verwaltung
- Log-API: `GET /api/log?lines=100&level=INFO`

---

## [3.0.0] - 2026-02-28

### Bugfixes, Queue-Pause, Button-Audit
- Queue-Pause-Funktion
- Button-Audit aller UI-Elemente
- Diverse Bugfixes

---

## [2.9.0] - 2026-02-27

### Import-System Neustrukturierung

**Zweiphasiger Import-Workflow**
- Phase 1 (Analyse): Nur Dateiname-Erkennung (Serie/Staffel/Episode)
- Phase 2 (Serien-Zuordnung): User ordnet erkannte Serien TVDB-Serien zu
- Erst nach Zuordnung: Zielpfade berechnen, TVDB-Episodentitel holen, Konflikte pruefen
- Status-Flow: `pending` -> `analyzing` -> `pending_assignment` -> `ready` -> `importing` -> `done`

**Serien-Zuordnungs-UI**
- Neue Ansicht nach Analyse zeigt alle erkannten Serien
- Pro Serie: Anzahl Dateien, Staffel-Range
- TVDB-Suche und -Zuordnung pro Serie
- Erst wenn alle Serien zugeordnet: Import freigeben

**Backend-Aenderungen**
- `analyze_job()` in importer.py: Nur Dateinamen-Parsing, kein TVDB
- `get_pending_series()`: Gruppierte Liste aller zuzuordnenden Serien
- `assign_series_mapping()`: TVDB-Zuordnung + Zielpfad-Berechnung
- Neuer Item-Status `pending_series` fuer noch nicht zugeordnete Dateien

**Mindestgroesse fuer Episoden**
- Dateien < 100 MiB werden als Sample/Trailer markiert und uebersprungen
- Verhindert Import von NFO-begleitenden Samples

### Geaenderte Dateien
- `app/services/importer.py` - Zweiphasiger Workflow, MIN_EPISODE_SIZE, assign_series_mapping()
- `app/routes/library_api.py` - Neue Endpoints fuer Serien-Zuordnung
- `app/static/js/library.js` - Serien-Zuordnungs-UI
- `app/templates/library.html` - import-series-assign Container

### Neue API-Endpoints
- `GET /api/library/import/{id}/pending-series` - Zuzuordnende Serien auflisten
- `POST /api/library/import/{id}/assign-series` - Serie TVDB zuordnen

---

## [2.5.0] - 2026-02-24

### GPU & Deployment

**Intel A380 GPU-Konfiguration**
- GPU-Device auf renderD129 (Intel A380) korrigiert - renderD128 war AMD auf Eddys Unraid
- GPU-Erkennung per `/sys/class/drm/renderD*/device/uevent` statt `vainfo`
- `VK_GPU_DEVICE` Umgebungsvariable statt hardcoded Device-Mapping
- AV1 10-Bit (`gpu_av1_10bit`) als Standard-Preset (bessere Qualitaet bei gleichem Speed)

**Docker Entrypoint**
- Neues `entrypoint.sh`: Kopiert Default-Configs (`presets.yaml`, `settings.yaml`) automatisch ins gemountete cfg-Volume bei Erstinstallation
- `cfg_defaults/` Verzeichnis im Image als Backup der Default-Konfigdateien
- `Config._load_presets()` mit Fallback auf `cfg_defaults` falls presets.yaml fehlt
- Behebt leeres Preset-Dropdown auf Unraid bei frisch gemounteten Volumes

**Unraid Docker-Template**
- Neue `unraid/my-VideoKonverter.xml` fuer Unraid WebGUI-Installation
- Alle ENV-Variablen mit Defaults vorkonfiguriert
- GPU-Device, Pfad-Mappings, DB-Konfiguration voreingestellt
- ExtraParams fuer `--group-add video --device=/dev/dri:/dev/dri`

**Startseite**
- Redirect von `/` auf `/library` statt Dashboard

### Geaenderte Dateien
- `Dockerfile` - cfg_defaults Sicherung, entrypoint.sh statt CMD
- `entrypoint.sh` - NEU: Default-Config-Kopie bei Erststart
- `docker-compose.yml` - VK_GPU_DEVICE renderD129, /dev/dri komplett, gpu_av1_10bit Default
- `app/config.py` - _load_presets() mit cfg_defaults Fallback
- `app/routes/pages.py` - Startseite Redirect auf /library
- `unraid/my-VideoKonverter.xml` - NEU: Unraid Docker-Template

---

## [2.4.0] - 2026-02-24

### Video-Player & Streaming

**Browser-Streaming**
- Video-Player mit ffmpeg-Transcoding-Stream (Video copy + Audio->AAC Stereo)
- Unterstuetzt Formate die Browser nicht nativ abspielen (EAC3, DTS, AC3, TrueHD)
- Fragmented MP4 mit `frag_keyframe+empty_moov+faststart`, chunked Transfer-Encoding
- Endpoint: `GET /api/library/videos/{id}/stream?t=0`

**Play-/Delete-Buttons**
- Play-Button bei jedem Video in Serien-, Film- und Ordner-Ansichten
- Delete-Button zum Loeschen einzelner Videos (DB-Eintrag + Datei auf Disk)
- Bestaetigungs-Dialog vor dem Loeschen

### Import-System

**Nicht-erkannte Dateien zuordnen**
- Modal fuer nicht-erkannte Dateien: Serie/Staffel/Episode manuell zuweisen oder ueberspringen
- Import-Start blockiert solange ungeloeste Items vorhanden
- Duplikat-Erkennung bei erneutem Scan nach Import

### Technische Aenderungen

**ENV-Variablen Refactoring**
- Alle Umgebungsvariablen mit `VK_*` Prefix (VK_DB_HOST, VK_MODE, VK_PORT etc.)
- `_ENV_MAP` in config.py: Zentrales Mapping ENV -> Settings-Pfad mit Typ-Konvertierung
- Rueckwaertskompatibilitaet per `_ENV_ALIASES`

**WebSocket Server-Log Push**
- Server-Logs werden per WebSocket an alle Clients gepusht (statt HTTP-Polling)
- `WebLogHandler` in api.py schreibt Log-Eintraege in den WebSocket-Manager

**Audio-Fix**
- `channelmap=channel_layout=5.1` Filter fuer libopus bei EAC3/AC3 mit `5.1(side)` Layout
- Behebt Encoder-Fehler bei Surround-Audio-Transcoding

**Ordner-Loeschen Fix**
- Filebrowser: Ordner-Loeschen funktioniert jetzt korrekt

### Geaenderte Dateien
- `app/config.py` - ENV-Mapping, VK_* Prefix, Typ-Konvertierung (+180 Z.)
- `app/routes/library_api.py` - Video-Stream, Video-Delete, Import-Zuordnung (+200 Z.)
- `app/services/importer.py` - Zuordnungs-Modal, Duplikat-Erkennung (+160 Z.)
- `app/services/encoder.py` - channelmap 5.1(side) Fix
- `app/services/library.py` - Video-Delete, Rescan-Logik (+70 Z.)
- `app/static/js/library.js` - Player, Play/Delete-Buttons, Import-Modal (+270 Z.)
- `app/static/css/style.css` - Player-Styles, Button-Styles (+50 Z.)
- `app/templates/library.html` - Player-Modal, Import-Zuordnungs-Modal (+60 Z.)
- `app/templates/base.html` - WebSocket-Log-Push Integration
- `app/routes/ws.py` - Server-Log WebSocket-Broadcast
- `docker-compose.yml` - VK_* ENV-Variablen

### Neue API-Endpoints
- `GET /api/library/videos/{id}/stream` - Video-Transcoding-Stream
- `DELETE /api/library/videos/{id}` - Video loeschen (DB + Datei)
- `POST /api/library/import/{id}/assign` - Import-Item manuell zuordnen
- `POST /api/library/import/{id}/skip` - Import-Item ueberspringen

---

## [2.3.0] - 2026-02-24

### Import-System Verbesserungen

**Bestehende Import-Jobs laden**
- Neue `GET /api/library/import` API liefert alle Import-Jobs
- Import-Modal zeigt jetzt offene Jobs oben an (Buttons mit Status)
- Klick auf Job laedt und zeigt Vorschau zum Fortsetzen
- Verhindert doppelte Importe der gleichen Quelle

**Import-Fortschritt mit Byte-Level**
- Neue DB-Felder: `current_file_name`, `current_file_bytes`, `current_file_total`
- Kopieren in 64MB-Chunks mit Progress-Updates alle 50MB
- UI zeigt aktuelle Datei und Byte-Fortschritt

**Gezielter Rescan nach Import**
- Nach Import wird nur der Ziel-Library-Pfad gescannt
- `imported_series` Liste im Job-Status fuer betroffene Ordner
- Statt `reloadAllSections()` nur `loadSectionData(targetPathId)`

### Ordner-Verwaltung

**Ordner-Loeschen Button**
- Neuer Muelleimer-Button (SVG-Icon) oben rechts bei Ordnern
- Erscheint nur bei Hover, rot bei Mouse-Over
- Schoener Bestaetigungs-Dialog statt Browser-confirm()
- Toast-Benachrichtigung statt alert()

**Delete-Folder API**
- `POST /api/library/delete-folder` mit Sicherheitspruefung
- Prueft ob Pfad unter einem Library-Pfad liegt
- Loescht Ordner + alle DB-Eintraege (library_videos)
- Gibt geloeschte Dateien/Ordner/DB-Eintraege zurueck

### Serie konvertieren

**Batch-Konvertierung fuer Serien**
- Neuer Button "Serie konvertieren" im Serien-Modal
- Modal mit Codec-Auswahl (AV1/HEVC/H.264)
- Option: Alle neu konvertieren (auch bereits passende)
- Option: Quelldateien nach Konvertierung loeschen
- `POST /api/library/series/{id}/convert` API
- `GET /api/library/series/{id}/convert-status` fuer Codec-Statistik

**Cleanup-Funktion fuer Serien**
- "Alte Dateien loeschen" Button im Serien-Modal
- Loescht alles ausser: registrierte Videos, .metadata, .nfo, Bilder
- `POST /api/library/series/{id}/cleanup` API

### Server-Log System

**Benachrichtigungs-Glocke**
- Glocken-Icon unten rechts auf allen Seiten
- Badge zeigt ungelesene Fehler-Anzahl (rot)
- Log-Panel mit allen Server-Meldungen
- Fehler/Warnings farblich hervorgehoben

**Log-API**
- `GET /api/logs?since=ID` liefert neue Log-Eintraege
- In-Memory-Buffer (max 200 Eintraege)
- Polling alle 2 Sekunden

### UI-Verbesserungen

**Toast-Benachrichtigungen**
- Verbesserte Styling mit Slide-Animation
- Farbige linke Border (success/error/info)
- 4 Sekunden Anzeigedauer

**TVDB-Suche**
- Checkbox "Englische Titel durchsuchen" im TVDB-Modal
- Ermoeglicht Suche nach englischen Originaltiteln

### Technische Aenderungen

**Neue/Geaenderte Dateien**
- `app/routes/library_api.py` - 6 neue Endpoints (+200 Z.)
- `app/services/importer.py` - get_all_jobs(), Progress-Tracking (+100 Z.)
- `app/services/queue.py` - delete_source Option bei add_paths()
- `app/static/js/library.js` - Dialog-System, Toast, Import-Jobs (+150 Z.)
- `app/static/css/style.css` - Toast, Delete-Button, Dialog-Styles (+50 Z.)
- `app/templates/library.html` - Confirm-Modal, Convert-Modal (+50 Z.)
- `app/templates/base.html` - Benachrichtigungs-Glocke + Log-Panel (+100 Z.)
- `app/routes/api.py` - /api/logs Endpoint, WebLogHandler (+40 Z.)
- `app/models/job.py` - delete_source Flag

**Neue API-Endpoints**
- `GET /api/library/import` - Liste aller Import-Jobs
- `POST /api/library/delete-folder` - Ordner loeschen
- `POST /api/library/series/{id}/convert` - Serie konvertieren
- `GET /api/library/series/{id}/convert-status` - Codec-Status
- `POST /api/library/series/{id}/cleanup` - Alte Dateien loeschen
- `GET /api/logs` - Server-Log abrufen

---

## [2.2.0] - 2026-02-21

### Bugfixes

**TVDB Review-Modal nicht klickbar**
- `JSON.stringify()` erzeugte doppelte Anfuehrungszeichen in HTML onclick-Attributen
- Neue `escapeAttr()`-Funktion ersetzt `"` durch `&quot;` fuer sichere HTML-Attribute
- 4 Stellen in `library.js` korrigiert (Serien, Filme, Review-Liste, manuelle Suche)

**Film-TVDB-Suche liefert keine Ergebnisse**
- Filmtitel mit fuehrenden Nummern (z.B. "10 Logan The Wolverine") fanden nichts auf TVDB
- Neue `cleanSearchTitle()`-Funktion entfernt fuehrende Nummern und Aufloesungs-Suffixe
- Angewendet in `openMovieTvdbModal()` und `openTvdbModal()`

**Auto-Match Progress-Variable nicht im Scope**
- `pollAutoMatchStatus()` referenzierte `progress` aus `startAutoMatch()`-Scope
- Variable wird jetzt lokal in `pollAutoMatchStatus()` definiert

**TVDB-Sprache wurde nicht gespeichert**
- `pages.py` HTMX-Save-Handler fehlte `tvdb_language` Feld
- Hinzugefuegt: `settings["library"]["tvdb_language"] = data.get("tvdb_language", "deu")`

### Geaenderte Dateien
- `app/static/js/library.js` - +escapeAttr(), +cleanSearchTitle(), 4x Attribut-Escaping, Progress-Fix
- `app/routes/pages.py` - tvdb_language in Settings-Save

---

## [2.1.0] - 2026-02-21

### TVDB-Sprachkonfiguration

Alle TVDB-Metadaten (Serien-Titel, Beschreibungen, Episoden-Namen) werden jetzt
in der konfigurierten Sprache abgerufen statt immer Englisch.

#### Neue Features
- **Sprach-Dropdown** in Admin-UI (Deutsch, Englisch, Franzoesisch, Spanisch, Italienisch, Japanisch)
- **API-Endpoints**: `GET/PUT /api/tvdb/language` zum Lesen/Aendern der Sprache
- **Episoden-Refresh**: `POST /api/library/tvdb-refresh-episodes` aktualisiert alle gecachten Episoden
- Alle TVDB-API-Aufrufe nutzen `self._language` Property

#### TVDB Review-Modal (Neues Feature)
- Statt blindem Auto-Match werden jetzt **Vorschlaege gesammelt** und zur Pruefung angezeigt
- `collect_suggestions()` in tvdb.py: Top 3 TVDB-Treffer pro ungematchter Serie/Film
- Review-Modal: Poster-Vorschau, Beschreibung, Jahr, Einzelbestaetigung
- Manuelle TVDB-Suche falls Vorschlaege nicht passen
- Polling-basierter Fortschritt waehrend der Analyse

#### Film-Scanning (Neues Feature)
- Bibliothek unterstuetzt jetzt **Filme** neben Serien
- Neue DB-Tabelle `library_movies` fuer Film-Metadaten
- Film-Erkennung: Ein Video pro Ordner = Film, Ordnername = Filmtitel
- Film-Grid in der Bibliothek-UI mit Poster, Titel, Jahr
- TVDB-Zuordnung fuer Filme (Suche + manuelle Zuordnung)

#### Import- und Clean-Service (Grundgeruest)
- `app/services/importer.py` (734 Z.) - Import-Logik mit Serien-Erkennung + TVDB-Lookup
- `app/services/cleaner.py` (155 Z.) - Junk-Scan + Loeschen von Nicht-Video-Dateien

#### Geaenderte Dateien
- `app/services/tvdb.py` - _language Property, lokalisierte Suche, collect_suggestions() (298 -> 1005 Z.)
- `app/services/library.py` - Film-Scan, _ensure_movie, _add_video_to_db (1082 -> 1747 Z.)
- `app/routes/library_api.py` - TVDB-Language-Endpoints, Confirm-Endpoint, Film-Endpoints (260 -> 998 Z.)
- `app/static/js/library.js` - Review-Modal, Film-Grid, Auto-Match-Polling (587 -> 1912 Z.)
- `app/static/css/style.css` - Review-Modal CSS, Film-Grid CSS (889 -> 1554 Z.)
- `app/templates/library.html` - Review-Modal HTML, Film-TVDB-Modal (330 -> 392 Z.)
- `app/templates/admin.html` - TVDB-Sprach-Dropdown (330 -> 342 Z.)
- `app/server.py` - CleanerService + ImporterService Integration
- `app/cfg/settings.yaml` - tvdb_language, import-Settings, cleanup keep_extensions

#### Neue API-Endpoints
- `GET /api/tvdb/language` - Aktuelle TVDB-Sprache
- `PUT /api/tvdb/language` - TVDB-Sprache aendern
- `POST /api/library/tvdb-refresh-episodes` - Alle Episoden-Caches aktualisieren
- `POST /api/library/tvdb-auto-match` - Review-Vorschlaege sammeln
- `POST /api/library/tvdb-confirm` - Einzelnen TVDB-Match bestaetigen
- `GET /api/library/movies` - Filme auflisten
- `POST /api/library/movies/{id}/tvdb-match` - Film-TVDB-Zuordnung

---

## [2.0.0] - 2026-02-20

### Video-Bibliothek (Neues Feature)

Komplette Video-Bibliotheksverwaltung mit Serien-Erkennung, ffprobe-Analyse,
TVDB-Integration und umfangreichen Filterfunktionen.

#### Neue Dateien
- `app/services/library.py` - LibraryService (Scan, DB, Filter, Duplikate)
- `app/services/tvdb.py` - TVDBService (Auth, Suche, Episoden-Abgleich)
- `app/routes/library_api.py` - REST API Endpoints fuer Bibliothek
- `app/templates/library.html` - Bibliothek-Hauptseite mit Filter-Sidebar
- `app/static/js/library.js` - Bibliothek-Frontend (Filter, TVDB, Scan-Progress)

#### Geaenderte Dateien
- `app/server.py` - LibraryService + TVDBService Integration
- `app/routes/pages.py` - Route /library + TVDB-Settings speichern
- `app/templates/base.html` - Nav-Link "Bibliothek" hinzugefuegt
- `app/templates/admin.html` - TVDB-Settings + Scan-Pfad-Verwaltung
- `app/static/css/style.css` - Library-Styles (~250 Zeilen ergaenzt)
- `app/cfg/settings.yaml` - library-Sektion (enabled, tvdb_api_key, tvdb_pin)
- `requirements.txt` - tvdb-v4-official>=1.1.0 hinzugefuegt

#### Datenbank
Vier neue Tabellen (werden automatisch beim Start erstellt):
- `library_paths` - Konfigurierbare Scan-Pfade (Serien/Filme)
- `library_series` - Erkannte Serien mit TVDB-Verknuepfung
- `library_videos` - Videos mit vollstaendigen ffprobe-Metadaten
- `tvdb_episode_cache` - TVDB-Episoden-Cache

#### Features im Detail

**Ordner-Scan**
- Konfigurierbare Scan-Pfade fuer Serien und Filme getrennt
- Serien-Erkennung via Ordnerstruktur (S01E01, 1x02, Season/Staffel XX)
- ffprobe-Analyse: Codec, Aufloesung, Bitrate, Audio-Spuren, Untertitel, HDR
- Versteckte Ordner (.Trash-*) werden automatisch uebersprungen
- UPSERT-Logik: unveraenderte Dateien werden nicht erneut analysiert
- Scan-Fortschritt via WebSocket + Polling im UI
- Verwaiste DB-Eintraege werden nach Scan automatisch bereinigt

**Filter-System**
- Video-Codec: AV1, HEVC, H.264, MPEG-4
- Aufloesung: 4K, 1080p, 720p, SD
- Container: MKV, MP4, AVI, WebM, TS, WMV
- Audio: Sprache (Deutsch, Englisch), Kanaele (Stereo, 5.1, 7.1)
- 10-Bit Filter
- Freitext-Suche im Dateinamen
- Sortierung nach Name, Groesse, Aufloesung, Dauer, Codec, Datum
- Pagination (50 Videos pro Seite)

**TVDB-Integration**
- Authentifizierung via API Key + optionalem PIN
- Serien-Suche mit Ergebnis-Vorschau (Poster, Beschreibung, Jahr)
- Episoden-Abgleich: Soll (TVDB) vs. Ist (lokal) = fehlende Episoden
- Poster-URLs, Beschreibung, Status (Continuing/Ended)
- Episoden-Cache in DB (reduziert API-Aufrufe)

**Duplikat-Finder**
- Erkennt gleiche Episoden in verschiedenen Formaten (z.B. AVI + WebM)
- Vergleich ueber Serie + Staffel + Episode
- Anzeige mit Codec, Aufloesung, Groesse fuer beide Versionen

**Direkt-Konvertierung**
- "Conv"-Button bei jedem Video in der Bibliothek
- Sendet Video direkt an die bestehende Konvertierungs-Queue
- Optionale Preset-Auswahl

**Admin-UI Erweiterung**
- TVDB API Key + PIN Eingabefelder
- Scan-Pfad-Verwaltung (hinzufuegen, loeschen, einzeln scannen)
- Letzter Scan-Zeitpunkt pro Pfad angezeigt

**Statistik-Leiste**
- Gesamt-Videos, Serien-Anzahl, Speicherbedarf, Gesamtspielzeit
- Codec-Verteilung, Aufloesungs-Verteilung

#### API Endpoints (17 neue)
- `GET/POST/DELETE /api/library/paths` - Scan-Pfade CRUD
- `POST /api/library/scan` - Komplett-Scan
- `POST /api/library/scan/{id}` - Einzel-Scan
- `GET /api/library/scan-status` - Scan-Fortschritt
- `GET /api/library/videos` - Videos mit Filtern
- `GET /api/library/series` - Alle Serien
- `GET /api/library/series/{id}` - Serien-Detail mit Episoden
- `GET /api/library/series/{id}/missing` - Fehlende Episoden
- `POST /api/library/series/{id}/tvdb-match` - TVDB zuordnen
- `GET /api/library/duplicates` - Duplikate finden
- `POST /api/library/videos/{id}/convert` - Direkt konvertieren
- `GET /api/library/stats` - Bibliotheks-Statistiken
- `GET /api/tvdb/search?q=` - TVDB-Suche

#### Erster Scan-Lauf
- 80 Serien erkannt, 5.260 Videos analysiert
- ~3.7 TiB Gesamtgroesse, ~150 Tage Spielzeit
- Codecs: H.264 (2.942), MPEG-4 (2.094), AV1 (199), HEVC (24)
- Aufloesungen: SD (4.256), 720p (651), 1080p (300), 4K (52)
- 9 Duplikat-Paare gefunden

---

## [1.0.0] - 2026-02-20

### Komplett-Neubau

Vollstaendiger Neubau des VideoKonverter-Servers als moderne
Python/aiohttp-Anwendung mit Web-UI.

#### Kern-Features
- **aiohttp-Server** mit Jinja2-Templating und HTMX
- **WebSocket** fuer Echtzeit-Fortschritts-Updates
- **Queue-System** mit MariaDB-Persistierung und parallelen Jobs
- **FFmpeg-Encoding** mit GPU (Intel VAAPI) und CPU Support
- **7 Encoding-Presets**: GPU AV1/HEVC/H.264 + CPU SVT-AV1/x265/x264
- **Dashboard** mit aktiven Jobs und Queue-Uebersicht
- **Admin-UI** fuer Einstellungen, Presets, Encoding-Modus
- **Statistik-Seite** mit Konvertierungs-Historie
- **File-Browser** zum Auswaehlen von Dateien/Ordnern
- **Docker-Support** mit GPU- und CPU-Profilen

#### Audio-Handling
- Alle Spuren behalten (kein Downmix)
- Konfigurierbare Sprach-Filter (DE, EN, Undefiniert)
- Opus-Transcoding mit bitrate-basiertem Kanalmanagement
- Surround-Kanaele (5.1, 7.1) bleiben erhalten

#### Technische Details
- Async/Await durchgaengig (aiohttp, aiomysql, asyncio.subprocess)
- MariaDB statt SQLite (Lock-Probleme in Docker behoben)
- WebSocket-Broadcast fuer alle verbundenen Clients
- Automatische GPU-Erkennung (VAAPI, vainfo)
- Konfigurierbare Settings via YAML
- Log-Rotation (7 Tage, 10 MiB pro Datei)
