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>
136 lines
4 KiB
HTML
136 lines
4 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>VideoKonverter</title>
|
|
<style>
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body {
|
|
background: #0f0f0f;
|
|
color: #fff;
|
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 100vh;
|
|
overflow: hidden;
|
|
}
|
|
.setup {
|
|
text-align: center;
|
|
max-width: 600px;
|
|
padding: 2rem;
|
|
}
|
|
.setup h1 {
|
|
font-size: 2rem;
|
|
margin-bottom: 1rem;
|
|
color: #64b5f6;
|
|
}
|
|
.setup p {
|
|
font-size: 1.2rem;
|
|
color: #aaa;
|
|
margin-bottom: 2rem;
|
|
}
|
|
.setup input {
|
|
width: 100%;
|
|
padding: 1rem;
|
|
font-size: 1.5rem;
|
|
background: #1a1a1a;
|
|
border: 2px solid #333;
|
|
border-radius: 8px;
|
|
color: #fff;
|
|
text-align: center;
|
|
margin-bottom: 1rem;
|
|
}
|
|
.setup input:focus {
|
|
border-color: #64b5f6;
|
|
outline: none;
|
|
}
|
|
.setup button {
|
|
padding: 1rem 3rem;
|
|
font-size: 1.3rem;
|
|
background: #1976d2;
|
|
color: #fff;
|
|
border: none;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
}
|
|
.setup button:focus {
|
|
outline: 3px solid #64b5f6;
|
|
outline-offset: 4px;
|
|
}
|
|
.hint {
|
|
margin-top: 1.5rem;
|
|
font-size: 0.9rem;
|
|
color: #666;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="setup" id="setup">
|
|
<h1>VideoKonverter TV</h1>
|
|
<p>Server-Adresse eingeben:</p>
|
|
<input type="text" id="serverUrl" placeholder="z.B. 192.168.155.12:8080"
|
|
data-focusable autofocus>
|
|
<br>
|
|
<button id="connectBtn" onclick="connect()" data-focusable>Verbinden</button>
|
|
<p class="hint">Die Adresse wird gespeichert und beim naechsten Start automatisch geladen.</p>
|
|
</div>
|
|
|
|
<script>
|
|
// Server-URL aus localStorage laden
|
|
var STORAGE_KEY = "vk_server_url";
|
|
var savedUrl = localStorage.getItem(STORAGE_KEY);
|
|
|
|
// Beim Start: Wenn URL gespeichert, direkt verbinden
|
|
if (savedUrl) {
|
|
connectTo(savedUrl);
|
|
}
|
|
|
|
function connect() {
|
|
var input = document.getElementById("serverUrl");
|
|
var url = input.value.trim();
|
|
if (!url) return;
|
|
|
|
// Protokoll ergaenzen falls noetig
|
|
if (url.indexOf("://") === -1) {
|
|
url = "http://" + url;
|
|
}
|
|
|
|
// Slash am Ende sicherstellen
|
|
if (!url.endsWith("/")) url += "/";
|
|
|
|
// TV-Pfad anhaengen
|
|
if (url.indexOf("/tv") === -1) {
|
|
url += "tv/";
|
|
}
|
|
|
|
localStorage.setItem(STORAGE_KEY, url);
|
|
connectTo(url);
|
|
}
|
|
|
|
function connectTo(url) {
|
|
// Vollbild-Redirect zum VideoKonverter TV-App
|
|
window.location.href = url;
|
|
}
|
|
|
|
// Enter-Taste zum Verbinden
|
|
document.getElementById("serverUrl").addEventListener("keydown", function(e) {
|
|
if (e.keyCode === 13) { // Enter
|
|
connect();
|
|
}
|
|
});
|
|
|
|
// Tizen: Zurueck-Taste abfangen (sonst schliesst die App sofort)
|
|
document.addEventListener("keydown", function(e) {
|
|
// Samsung Remote: Return/Back = 10009
|
|
if (e.keyCode === 10009) {
|
|
// Wenn auf Setup-Seite: App beenden
|
|
if (document.getElementById("setup").style.display !== "none") {
|
|
try { tizen.application.getCurrentApplication().exit(); } catch(ex) {}
|
|
}
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|