erster docker release
This commit is contained in:
+65
@@ -0,0 +1,65 @@
|
||||
# REST-API
|
||||
|
||||
Alle Funktionen des Web-UI sind auch per REST-API verfügbar. Basis-URL: `http://<host>:8484`
|
||||
|
||||
## Endpunkte
|
||||
|
||||
### System
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|-------------|
|
||||
| `GET` | `/api/health` | Health Check (kein Auth nötig) |
|
||||
| `GET` | `/api/config` | Konfiguration lesen |
|
||||
| `PUT` | `/api/config` | Konfiguration speichern |
|
||||
|
||||
### Jobs
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|-------------|
|
||||
| `GET` | `/api/jobs` | Alle Jobs auflisten |
|
||||
| `POST` | `/api/jobs` | Neuen Job erstellen |
|
||||
| `GET` | `/api/jobs/:id` | Job-Details abrufen |
|
||||
| `PUT` | `/api/jobs/:id` | Job aktualisieren |
|
||||
| `DELETE` | `/api/jobs/:id` | Job löschen |
|
||||
| `POST` | `/api/jobs/:id/record` | Job-Aufnahme starten |
|
||||
|
||||
### Schnellaufnahme
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|-------------|
|
||||
| `POST` | `/api/quick-record` | Schnellaufnahme starten |
|
||||
|
||||
```json
|
||||
{
|
||||
"url": "rtmp://example.com/live/stream",
|
||||
"name": "Meine Aufnahme",
|
||||
"stream_type": "auto",
|
||||
"max_duration": 3600
|
||||
}
|
||||
```
|
||||
|
||||
### Aufnahmen
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|-------------|
|
||||
| `GET` | `/api/recordings` | Alle Aufnahmen (Parameter: `active_only`, `limit`) |
|
||||
| `GET` | `/api/recordings/:id` | Aufnahme-Status |
|
||||
| `POST` | `/api/recordings/:id/stop` | Aufnahme stoppen |
|
||||
| `POST` | `/api/recordings/:id/extend?minutes=30` | Aufnahme verlängern |
|
||||
| `POST` | `/api/recordings/:id/unlimited` | Zeitlimit entfernen |
|
||||
|
||||
### Logs
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|-------------|
|
||||
| `GET` | `/api/logs` | Protokoll (Parameter: `limit`, `level`) |
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
Bei aktiviertem Auth wird Basic Authentication verwendet:
|
||||
|
||||
```bash
|
||||
curl -u admin:passwort http://localhost:8484/api/jobs
|
||||
```
|
||||
|
||||
Der Health-Endpunkt (`/api/health`) ist immer ohne Auth erreichbar.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Aufnahmen
|
||||
|
||||
## Aktive Aufnahmen
|
||||
|
||||
Das Dashboard zeigt alle laufenden Aufnahmen mit:
|
||||
- Laufzeit
|
||||
- Dateigröße
|
||||
- Verbleibende Zeit (bei Zeitlimit)
|
||||
- Segment-Anzahl (bei Segment-Splitting)
|
||||
|
||||
## Aufnahme verlängern
|
||||
|
||||
Laufende Aufnahmen können verlängert werden:
|
||||
- **+15 / +30 / +60 / +120 Minuten** — Schnellauswahl
|
||||
- **Eigene Dauer** — Beliebige Minutenzahl eingeben
|
||||
- **Unbegrenzt** — Zeitlimit komplett entfernen
|
||||
|
||||
## Aufnahme stoppen
|
||||
|
||||
Über den **Stoppen**-Button im Dashboard. Die Aufnahme wird sauber beendet (SIGINT → ffmpeg finalisiert die Datei).
|
||||
|
||||
## Reconnect
|
||||
|
||||
Bei Verbindungsabbrüchen versucht der Recorder automatisch, die Verbindung wiederherzustellen. Konfigurierbar über:
|
||||
- `recording.max_retries` — Maximale Versuche (Standard: 5)
|
||||
- `recording.retry_delay` — Wartezeit zwischen Versuchen (Standard: 5 Sekunden)
|
||||
|
||||
Bei jedem Reconnect wird eine neue Datei angelegt, um Datenverlust zu vermeiden.
|
||||
|
||||
## Segment-Splitting
|
||||
|
||||
Lange Aufnahmen können automatisch in Teile zerlegt werden. Die Segment-Dauer wird pro Job in Minuten konfiguriert.
|
||||
|
||||
Beispiel: Bei 60 Minuten Segment-Dauer wird eine 3-stündige Aufnahme in 3 Dateien aufgeteilt:
|
||||
```
|
||||
Sendung_20260915_200000_seg000.mp4
|
||||
Sendung_20260915_200000_seg001.mp4
|
||||
Sendung_20260915_200000_seg002.mp4
|
||||
```
|
||||
|
||||
## Ausgabeformate
|
||||
|
||||
Das Format wird automatisch anhand des Stream-Typs gewählt:
|
||||
|
||||
| Stream-Typ | Standard-Format |
|
||||
|------------|----------------|
|
||||
| RTMP, HLS, HTTP | mp4 |
|
||||
| MP3 | mp3 |
|
||||
| AAC | aac |
|
||||
| OGG | ogg |
|
||||
| FLAC | flac |
|
||||
|
||||
Kann pro Job manuell überschrieben werden (z.B. `mkv`, `ts`).
|
||||
|
||||
## Speicherort
|
||||
|
||||
Aufnahmen werden unter `data/recordings/<job-name>/` gespeichert (im Container: `/app/data/recordings/`). Der Pfad ist über `recording.download_path` konfigurierbar.
|
||||
@@ -0,0 +1,58 @@
|
||||
# Jobs
|
||||
|
||||
Jobs sind vorkonfigurierte Aufnahme-Vorlagen. Jeder Job definiert einen Stream, optional einen Zeitplan und Plugin-Einstellungen.
|
||||
|
||||
## Job erstellen
|
||||
|
||||
Im Web-UI unter **Jobs → + Neuer Job**.
|
||||
|
||||
### Pflichtfelder
|
||||
|
||||
| Feld | Beschreibung |
|
||||
|------|-------------|
|
||||
| **Name** | Eindeutiger Name (wird als Ordnername verwendet) |
|
||||
| **Stream-URL** | URL des Streams (RTMP, HLS, HTTP, etc.) |
|
||||
|
||||
### Optionale Felder
|
||||
|
||||
| Feld | Beschreibung |
|
||||
|------|-------------|
|
||||
| **Typ** | Automatisch erkannt aus URL. Manuell wählbar: RTMP, HLS, MP3, AAC, OGG, HTTP |
|
||||
| **Ausgabeformat** | Dateiendung. Leer = automatisch (mp4 für Video, mp3 für Audio) |
|
||||
| **Max. Dauer** | Zeitlimit in Minuten. Entfällt bei Zeitplan mit Endzeit |
|
||||
| **Segment-Dauer** | Aufnahme in Teile zerlegen (Minuten pro Segment) |
|
||||
| **Extra ffmpeg Argumente** | Zusätzliche ffmpeg-Parameter (z.B. `-b:a 192k`) |
|
||||
|
||||
## Zeitplan
|
||||
|
||||
Aktiviert automatische Aufnahmen zu festgelegten Zeiten.
|
||||
|
||||
| Feld | Beschreibung |
|
||||
|------|-------------|
|
||||
| **Einmalig** | Nur einmal am angegebenen Datum ausführen |
|
||||
| **Datum** | Datum für einmalige Aufnahme |
|
||||
| **Tage** | Wochentage: `*` (täglich), `Mo-Fr`, `Sa,So`, `Mo,Mi,Fr` |
|
||||
| **Startzeit** | Aufnahme-Beginn (HH:MM) |
|
||||
| **Endzeit** | Aufnahme-Ende (HH:MM) — Dauer wird automatisch berechnet |
|
||||
|
||||
Wenn Start- und Endzeit gesetzt sind, wird die Aufnahmedauer automatisch berechnet. Das Feld "Max. Dauer" wird dann nicht benötigt.
|
||||
|
||||
### Tage-Syntax
|
||||
|
||||
| Eingabe | Bedeutung |
|
||||
|---------|-----------|
|
||||
| `*` | Jeden Tag |
|
||||
| `Mo-Fr` | Montag bis Freitag |
|
||||
| `Sa,So` | Samstag und Sonntag |
|
||||
| `Mo,Mi,Fr` | Montag, Mittwoch, Freitag |
|
||||
| `Mo-Mi,Fr` | Montag bis Mittwoch und Freitag |
|
||||
|
||||
Unterstützt: `Mo/Mon/Montag`, `Di/Tue/Dienstag`, `Mi/Wed/Mittwoch`, `Do/Thu/Donnerstag`, `Fr/Fri/Freitag`, `Sa/Sat/Samstag`, `So/Sun/Sonntag`
|
||||
|
||||
## Manuelle Aufnahme
|
||||
|
||||
Jobs können auch manuell über den **Aufnehmen**-Button gestartet werden, unabhängig vom Zeitplan.
|
||||
|
||||
## Schnellaufnahme
|
||||
|
||||
Für einmalige Aufnahmen ohne Job: **Dashboard → + Schnellaufnahme**. URL eingeben, optional Name und Dauer angeben, sofort starten.
|
||||
@@ -0,0 +1,65 @@
|
||||
# Konfiguration
|
||||
|
||||
## config.yml
|
||||
|
||||
Die Konfiguration liegt in `data/config.yml` und kann über das Web-UI unter **Einstellungen** bearbeitet werden.
|
||||
|
||||
Beim ersten Start wird die Datei automatisch mit Standardwerten erstellt. Eine Vorlage mit Kommentaren findet sich in `config/config.yml.dist`.
|
||||
|
||||
## Abschnitte
|
||||
|
||||
### Aufnahme
|
||||
|
||||
| Parameter | Standard | Beschreibung |
|
||||
|-----------|----------|-------------|
|
||||
| `recording.download_path` | `/app/data/recordings` | Speicherort für Aufnahmen |
|
||||
| `recording.max_retries` | `5` | Max. Reconnect-Versuche bei Verbindungsabbruch |
|
||||
| `recording.retry_delay` | `5` | Wartezeit (Sekunden) zwischen Reconnect-Versuchen |
|
||||
|
||||
### Authentifizierung
|
||||
|
||||
| Parameter | Standard | Beschreibung |
|
||||
|-----------|----------|-------------|
|
||||
| `auth.enabled` | `false` | Basic Auth aktivieren |
|
||||
| `auth.username` | `admin` | Benutzername |
|
||||
| `auth.password` | `stream-recorder` | Passwort |
|
||||
|
||||
### NTFY
|
||||
|
||||
| Parameter | Standard | Beschreibung |
|
||||
|-----------|----------|-------------|
|
||||
| `ntfy.url` | _(leer)_ | NTFY Topic-URL (z.B. `https://ntfy.sh/mein-topic`) |
|
||||
| `ntfy.token` | _(leer)_ | Bearer-Token für authentifizierte Topics |
|
||||
| `ntfy.events` | `error` | Kommaseparierte Events: `start`, `stop`, `error`, `upload` |
|
||||
|
||||
### Plik
|
||||
|
||||
| Parameter | Standard | Beschreibung |
|
||||
|-----------|----------|-------------|
|
||||
| `plik.url` | _(leer)_ | Plik-Server URL (z.B. `https://plik.example.com`) |
|
||||
| `plik.api_key` | _(leer)_ | API Key für authentifizierte Uploads |
|
||||
| `plik.ttl` | `30d` | Aufbewahrungsdauer der Uploads (`30d`, `12h`, etc.) |
|
||||
|
||||
## Beispiel
|
||||
|
||||
```yaml
|
||||
recording:
|
||||
download_path: /app/data/recordings
|
||||
max_retries: 5
|
||||
retry_delay: 5
|
||||
|
||||
auth:
|
||||
enabled: true
|
||||
username: admin
|
||||
password: mein-passwort
|
||||
|
||||
ntfy:
|
||||
url: https://ntfy.sh/stream-recorder
|
||||
token: ""
|
||||
events: start,stop,error,upload
|
||||
|
||||
plik:
|
||||
url: https://plik.example.com
|
||||
api_key: ""
|
||||
ttl: 30d
|
||||
```
|
||||
@@ -0,0 +1,85 @@
|
||||
# Plugins
|
||||
|
||||
Plugins erweitern den Recorder um zusätzliche Funktionen. Alle Plugins sind pro Job einzeln aktivierbar.
|
||||
|
||||
## NTFY-Benachrichtigungen
|
||||
|
||||
Push-Nachrichten per [ntfy.sh](https://ntfy.sh) bei verschiedenen Events.
|
||||
|
||||
### Einrichtung
|
||||
|
||||
1. **Einstellungen → NTFY URL**: Topic-URL eintragen (z.B. `https://ntfy.sh/mein-topic`)
|
||||
2. **Einstellungen → Events**: Kommaseparierte Liste der gewünschten Events
|
||||
3. **Pro Job**: Checkbox „Benachrichtigungen (NTFY)" aktivieren
|
||||
|
||||
### Events
|
||||
|
||||
| Event | Tag | Beschreibung |
|
||||
|-------|-----|-------------|
|
||||
| `start` | 🔴 | Aufnahme gestartet |
|
||||
| `stop` | ✅ | Aufnahme beendet |
|
||||
| `error` | 🚨 | Fehler oder Verbindungsabbruch |
|
||||
| `upload` | 📤 | Plik-Upload abgeschlossen (mit Link) |
|
||||
|
||||
### Authentifizierung
|
||||
|
||||
Für private Topics kann ein Bearer-Token in den Einstellungen hinterlegt werden.
|
||||
|
||||
---
|
||||
|
||||
## Plik-Upload
|
||||
|
||||
Automatischer Upload von Aufnahmen auf einen [Plik](https://github.com/root-gg/plik)-Server nach Aufnahme-Ende.
|
||||
|
||||
### Einrichtung
|
||||
|
||||
1. **Einstellungen → Plik URL**: Server-URL eintragen
|
||||
2. **Einstellungen → TTL**: Aufbewahrungsdauer (Standard: `30d`)
|
||||
3. **Pro Job**: Checkbox „Plik-Upload" aktivieren
|
||||
|
||||
### Optionen pro Job
|
||||
|
||||
| Option | Beschreibung |
|
||||
|--------|-------------|
|
||||
| **Plik-Upload** | Upload nach Aufnahme-Ende aktivieren |
|
||||
| **Nach Upload löschen** | Lokale Datei nach erfolgreichem Upload entfernen |
|
||||
|
||||
### Links
|
||||
|
||||
Nach dem Upload werden zwei URLs generiert:
|
||||
- **Browser-URL**: `https://plik.example.com/#/?id=UPLOAD_ID` — Übersichtsseite mit In-Browser-Wiedergabe
|
||||
- **Download-URL**: Direkter Datei-Download
|
||||
|
||||
Bei aktiviertem NTFY wird die Browser-URL in der Push-Nachricht mitgeschickt.
|
||||
|
||||
### Segment-Upload
|
||||
|
||||
Bei Segment-Splitting werden alle Segmente einzeln hochgeladen. Die NTFY-Nachricht enthält die Anzahl der hochgeladenen Segmente.
|
||||
|
||||
---
|
||||
|
||||
## Euer-Radio Metadata-Monitor
|
||||
|
||||
Erkennt automatisch, ob eine bestimmte Show live sendet, indem der Stream-Titel via `ffprobe` abgefragt wird. Wenn das konfigurierte Pattern nicht mehr im Titel erscheint, wird die Aufnahme nach einer Karenzzeit gestoppt.
|
||||
|
||||
### Einrichtung
|
||||
|
||||
Pro Job im Web-UI:
|
||||
|
||||
| Option | Standard | Beschreibung |
|
||||
|--------|----------|-------------|
|
||||
| **Show-Pattern** | _(leer)_ | Text, der im Stream-Titel vorkommen muss (z.B. Sendungsname) |
|
||||
| **Karenzzeit** | 5 Min. | Wie lange gewartet wird, nachdem das Pattern verschwunden ist |
|
||||
| **Poll-Intervall** | 30 Sek. | Wie oft der Stream-Titel abgefragt wird |
|
||||
|
||||
### Funktionsweise
|
||||
|
||||
1. Der Monitor fragt regelmäßig den Stream-Titel per `ffprobe` ab
|
||||
2. Solange das Pattern im Titel vorkommt, läuft die Aufnahme weiter
|
||||
3. Wenn das Pattern verschwindet, startet die Karenzzeit
|
||||
4. Taucht das Pattern innerhalb der Karenzzeit wieder auf, wird der Timer zurückgesetzt
|
||||
5. Läuft die Karenzzeit ab, wird die Aufnahme gestoppt
|
||||
|
||||
### Anwendungsfall
|
||||
|
||||
Ideal für Streams mit wechselnden Shows (z.B. Internet-Radio), bei denen die Aufnahmedauer nicht vorher feststeht. Der Stream-Titel zeigt an, welche Show gerade läuft, und der Monitor erkennt automatisch das Ende.
|
||||
Reference in New Issue
Block a user