From bd1694528ace462c4aa09495ebb35a9aa34d0ba4 Mon Sep 17 00:00:00 2001 From: team3 Date: Thu, 1 Oct 2026 00:09:16 +0200 Subject: [PATCH] update --- backend/app/clips.py | 8 ++-- backend/tests/test_clips.py | 6 ++- frontend/src/components/ClipTrimmer.vue | 55 +++++++++++++++++++------ 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/backend/app/clips.py b/backend/app/clips.py index d676e50..35e7e86 100644 --- a/backend/app/clips.py +++ b/backend/app/clips.py @@ -44,7 +44,9 @@ PLAYER_LATENZ = 4 # Das Fenster um die Marke: Standard und Grenzen VORHER = 30 DAUER = 35 -MAX_VORHER = 600 +# Die Marke ist nur ein Anker — das Fenster darf überall auf dem +# Zeitstrahl liegen, auch weit nach der Marke (vorher negativ) +MAX_VORHER = 4 * 3600 MIN_DAUER = 3 MAX_DAUER = 180 MAX_TITEL = 80 @@ -138,7 +140,7 @@ def aendern(clip_id, session_id, host, titel=None, vorher=None, dauer=None): if titel is not None: felder["titel"] = titel.strip()[:MAX_TITEL] or None if vorher is not None: - felder["vorher"] = max(0, min(MAX_VORHER, float(vorher))) + felder["vorher"] = max(-MAX_VORHER, min(MAX_VORHER, float(vorher))) if dauer is not None: felder["dauer"] = max(MIN_DAUER, min(MAX_DAUER, float(dauer))) fenster_neu = any( @@ -173,7 +175,7 @@ def _datei_weg(name): def fenster(row, vorher=None, dauer=None): """Start (RFC3339) und Dauer des Ausschnitts um die Marke.""" marke = datetime.fromisoformat(row["marke_at"]) - v = row["vorher"] if vorher is None else max(0, min(MAX_VORHER, float(vorher))) + v = row["vorher"] if vorher is None else max(-MAX_VORHER, min(MAX_VORHER, float(vorher))) d = row["dauer"] if dauer is None else max(MIN_DAUER, min(MAX_DAUER, float(dauer))) return _iso(marke - timedelta(seconds=v)), d diff --git a/backend/tests/test_clips.py b/backend/tests/test_clips.py index 0c0626a..b580d44 100644 --- a/backend/tests/test_clips.py +++ b/backend/tests/test_clips.py @@ -128,8 +128,12 @@ def test_fremde_sehen_nichts_der_host_alles(client, client2, zuschauer, hostmodu def test_fenster_wird_begrenzt_und_macht_schnitt_ungueltig(client, monkeypatch): m = marke(client) - geaendert = client.patch(f"/api/clips/{m['id']}", json={"vorher": 5000, "dauer": 1, "titel": " Hallo "}).json() + geaendert = client.patch(f"/api/clips/{m['id']}", json={"vorher": 99999, "dauer": 1, "titel": " Hallo "}).json() assert (geaendert["vorher"], geaendert["dauer"], geaendert["titel"]) == (clips.MAX_VORHER, clips.MIN_DAUER, "Hallo") + # Das Fenster darf auch nach der Marke liegen — bis vier Stunden weit + assert client.patch(f"/api/clips/{m['id']}", json={"vorher": -60}).json()["vorher"] == -60 + assert client.patch(f"/api/clips/{m['id']}", json={"vorher": -99999}).json()["vorher"] == -clips.MAX_VORHER + client.patch(f"/api/clips/{m['id']}", json={"vorher": clips.MAX_VORHER, "dauer": 1}) # Schneiden: der Playback-Server wird nachgestellt class Antwort: diff --git a/frontend/src/components/ClipTrimmer.vue b/frontend/src/components/ClipTrimmer.vue index 55590c9..443ba95 100644 --- a/frontend/src/components/ClipTrimmer.vue +++ b/frontend/src/components/ClipTrimmer.vue @@ -1,14 +1,15 @@ @@ -134,6 +161,7 @@ function loslassen(e) {
@@ -206,6 +234,7 @@ function loslassen(e) { background: var(--bg); border: 1px solid var(--line); border-radius: 8px; + cursor: grab; touch-action: none; }