docker.videokonverter/video-konverter/app/templates/tv/home.html
data 99730f2f8f feat: VideoKonverter v3.1 - TV-App, Auth, Tizen, Log-API
TV-App (/tv/):
- Login mit bcrypt-Passwort-Hashing und DB-Sessions (30 Tage)
- Home (Weiterschauen, Serien, Filme), Serien-Detail mit Staffeln
- Film-Uebersicht und Detail, Fullscreen Video-Player
- Suche mit Live-Ergebnissen, Watch-Progress (alle 10s gespeichert)
- D-Pad/Fernbedienung-Navigation (FocusManager, Samsung Tizen Keys)
- PWA: manifest.json, Service Worker, Icons fuer Handy/Tablet
- Pro-User Berechtigungen (Serien, Filme, Admin, erlaubte Pfade)

Admin-Erweiterungen:
- QR-Code fuer TV-App URL
- User-Verwaltung (CRUD) mit Rechte-Konfiguration
- Log-API: GET /api/log?lines=100&level=INFO

Tizen-App (tizen-app/):
- Wrapper-App fuer Samsung Smart TVs (.wgt Paket)
- Einmalige Server-IP Eingabe, danach automatische Verbindung
- Installationsanleitung (INSTALL.md)

Bug-Fixes:
- executeImport: Job-ID vor resetImport() gesichert
- cursor(aiomysql.DictCursor) statt cursor(dict)
- DB-Spalten width/height statt video_width/video_height

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 09:26:19 +01:00

87 lines
3.2 KiB
HTML

{% extends "tv/base.html" %}
{% block title %}Startseite - VideoKonverter TV{% endblock %}
{% block content %}
<!-- Weiterschauen -->
{% if continue_watching %}
<section class="tv-section">
<h2 class="tv-section-title">Weiterschauen</h2>
<div class="tv-row">
{% for item in continue_watching %}
<a href="/tv/player?v={{ item.video_id }}" class="tv-card tv-card-wide" data-focusable>
{% if item.series_poster %}
<img src="{{ item.series_poster }}" alt="" class="tv-card-img" loading="lazy">
{% else %}
<div class="tv-card-placeholder">&#9654;</div>
{% endif %}
<div class="tv-card-progress">
<div class="tv-card-progress-bar"
style="width:{{ ((item.position_sec / item.duration_sec) * 100) if item.duration_sec else 0 }}%"></div>
</div>
<div class="tv-card-info">
<span class="tv-card-title">{{ item.series_title or item.file_name }}</span>
<span class="tv-card-meta">{{ item.file_name }}</span>
</div>
</a>
{% endfor %}
</div>
</section>
{% endif %}
<!-- Serien -->
{% if series %}
<section class="tv-section">
<div class="tv-section-header">
<h2 class="tv-section-title">Serien</h2>
<a href="/tv/series" class="tv-section-more" data-focusable>Alle anzeigen</a>
</div>
<div class="tv-row">
{% for s in series %}
<a href="/tv/series/{{ s.id }}" class="tv-card" data-focusable>
{% if s.poster_url %}
<img src="{{ s.poster_url }}" alt="" class="tv-card-img" loading="lazy">
{% else %}
<div class="tv-card-placeholder">{{ s.title or s.folder_name }}</div>
{% endif %}
<div class="tv-card-info">
<span class="tv-card-title">{{ s.title or s.folder_name }}</span>
<span class="tv-card-meta">{{ s.episode_count or 0 }} Episoden</span>
</div>
</a>
{% endfor %}
</div>
</section>
{% endif %}
<!-- Filme -->
{% if movies %}
<section class="tv-section">
<div class="tv-section-header">
<h2 class="tv-section-title">Filme</h2>
<a href="/tv/movies" class="tv-section-more" data-focusable>Alle anzeigen</a>
</div>
<div class="tv-row">
{% for m in movies %}
<a href="/tv/movies/{{ m.id }}" class="tv-card" data-focusable>
{% if m.poster_url %}
<img src="{{ m.poster_url }}" alt="" class="tv-card-img" loading="lazy">
{% else %}
<div class="tv-card-placeholder">{{ m.title or m.folder_name }}</div>
{% endif %}
<div class="tv-card-info">
<span class="tv-card-title">{{ m.title or m.folder_name }}</span>
<span class="tv-card-meta">{{ m.year or "" }}{% if m.genres %} &middot; {{ m.genres }}{% endif %}</span>
</div>
</a>
{% endfor %}
</div>
</section>
{% endif %}
{% if not series and not movies %}
<div class="tv-empty">
<p>Noch keine Inhalte in der Bibliothek.</p>
<p>Fuege Serien oder Filme ueber die Admin-Oberflaeche hinzu.</p>
</div>
{% endif %}
{% endblock %}