This commit is contained in:
team3
2026-09-30 01:24:49 +02:00
parent 70b37054ba
commit ae5b1d0b1d
8 changed files with 209 additions and 2 deletions

View File

@@ -11,7 +11,7 @@ from datetime import datetime, timedelta, timezone
import httpx
from .config import CLIPS_DIR, MEDIAMTX_PLAYBACK_URL
from .config import CLIPS_DIR, MEDIAMTX_API_URL, MEDIAMTX_PLAYBACK_URL, MTX_SENDEPASSWORT
from .db import connect
from .users import WEM, besitzer, gehoert_mir
@@ -252,6 +252,50 @@ async def aufnahmen_des_abends(watched_at):
return sorted(stuecke, key=lambda s: s["start"])
def _stueck(s):
return {
"start": _iso(datetime.fromisoformat(s["start"].replace("Z", "+00:00"))),
"dauer": round(s["duration"], 1),
}
async def aufnahmen_alle():
"""Alle Aufnahmen, neueste zuerst — der Host räumt damit auf."""
segmente = await _segmente(datetime(2000, 1, 1, tzinfo=timezone.utc), _jetzt())
return sorted((_stueck(s) for s in segmente), key=lambda s: s["start"], reverse=True)
def _im_stueck(segmente, start, dauer):
"""Die Segmente (aus der API), die zu einem Stück der Aufnahme gehören:
ihr Beginn liegt zwischen dessen Start und Ende. Eine Sekunde Luft an
beiden Enden — Playback rundet die Zeiten anders als die API."""
von = datetime.fromisoformat(start) - timedelta(seconds=1)
bis = datetime.fromisoformat(start) + timedelta(seconds=dauer + 1)
aus = []
for s in segmente:
beginn = datetime.fromisoformat(s["start"].replace("Z", "+00:00"))
if von <= beginn <= bis:
aus.append(s["start"])
return aus
async def aufnahme_loeschen(start, dauer):
"""Ein Stück der Aufnahme löschen — MediaMTX räumt die Segmente weg.
Gibt zurück, wie viele es waren."""
auth = ("sender", MTX_SENDEPASSWORT)
async with httpx.AsyncClient(timeout=30.0, auth=auth) as http:
resp = await http.get(f"{MEDIAMTX_API_URL}/v3/recordings/get/{STREAM_PFAD}")
resp.raise_for_status()
starts = _im_stueck(resp.json().get("segments") or [], start, dauer)
for s in starts:
resp = await http.delete(
f"{MEDIAMTX_API_URL}/v3/recordings/deletesegment",
params={"path": STREAM_PFAD, "start": s},
)
resp.raise_for_status()
return len(starts)
async def aufnahme(um, spanne=SPANNE):
"""Welche Stücke der Aufnahme es um einen Zeitpunkt herum gibt — für
den Zeitstrahl im Editor. Relativ zur Marke, in Sekunden."""