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>
51 lines
2.1 KiB
HTML
51 lines
2.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
<meta name="theme-color" content="#0f0f0f">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
<link rel="manifest" href="/static/tv/manifest.json">
|
|
<link rel="apple-touch-icon" href="/static/tv/icons/icon-192.png">
|
|
<link rel="icon" href="/static/icons/favicon.ico">
|
|
<link rel="stylesheet" href="/static/tv/css/tv.css">
|
|
<title>{% block title %}VideoKonverter TV{% endblock %}</title>
|
|
</head>
|
|
<body>
|
|
{% if user is defined and user %}
|
|
<nav class="tv-nav" id="tv-nav">
|
|
<div class="tv-nav-links">
|
|
<a href="/tv/" class="tv-nav-item {% if active == 'home' %}active{% endif %}" data-focusable>Startseite</a>
|
|
{% if user.can_view_series %}
|
|
<a href="/tv/series" class="tv-nav-item {% if active == 'series' %}active{% endif %}" data-focusable>Serien</a>
|
|
{% endif %}
|
|
{% if user.can_view_movies %}
|
|
<a href="/tv/movies" class="tv-nav-item {% if active == 'movies' %}active{% endif %}" data-focusable>Filme</a>
|
|
{% endif %}
|
|
<a href="/tv/search" class="tv-nav-item {% if active == 'search' %}active{% endif %}" data-focusable>Suche</a>
|
|
</div>
|
|
<div class="tv-nav-right">
|
|
<span class="tv-nav-user">{{ user.display_name or user.username }}</span>
|
|
<a href="/tv/logout" class="tv-nav-item tv-nav-logout" data-focusable>Abmelden</a>
|
|
</div>
|
|
</nav>
|
|
{% endif %}
|
|
|
|
<main class="tv-main">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
|
|
<script src="/static/tv/js/tv.js"></script>
|
|
{% block scripts %}{% endblock %}
|
|
|
|
<script>
|
|
// PWA Service Worker registrieren
|
|
if ('serviceWorker' in navigator) {
|
|
navigator.serviceWorker.register('/static/tv/sw.js', {scope: '/tv/'})
|
|
.catch(() => {});
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|