erster docker release
This commit is contained in:
@@ -1,62 +0,0 @@
|
|||||||
###############################################
|
|
||||||
# stream-recorder - Konfigurationsdatei
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# Basis-Verzeichnis für Aufnahmen
|
|
||||||
# Pro Stream wird ein Unterordner angelegt
|
|
||||||
DOWNLOAD_PATH="/home/downloads/recordings"
|
|
||||||
|
|
||||||
# Log-Verzeichnis
|
|
||||||
LOG_DIR="/var/log/stream-recorder"
|
|
||||||
|
|
||||||
# Log-Level: DEBUG, INFO, WARN, ERROR
|
|
||||||
LOG_LEVEL="INFO"
|
|
||||||
|
|
||||||
# PID-Verzeichnis für laufende Aufnahmen
|
|
||||||
PID_DIR="/tmp/stream-recorder"
|
|
||||||
|
|
||||||
# Persistentes Status-Verzeichnis für geplante Läufe
|
|
||||||
STATE_DIR="/var/lib/stream-recorder"
|
|
||||||
|
|
||||||
# Anzahl Wiederholungsversuche bei Verbindungsabbruch
|
|
||||||
# 0 = unbegrenzt (empfohlen für Langzeitaufnahmen)
|
|
||||||
MAX_RETRIES=5
|
|
||||||
|
|
||||||
# Wartezeit zwischen Wiederholungsversuchen (Sekunden)
|
|
||||||
RETRY_DELAY=5
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# NTFY-Benachrichtigungen (optional)
|
|
||||||
# https://ntfy.sh oder selbst gehostet
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# NTFY Server-URL inkl. Topic
|
|
||||||
# Beispiel: https://ntfy.sh/mein-stream-topic
|
|
||||||
# Beispiel: https://ntfy.example.com/recordings
|
|
||||||
# Leer = deaktiviert
|
|
||||||
NTFY_URL=""
|
|
||||||
|
|
||||||
# NTFY Access-Token (optional, nur bei geschützten Topics)
|
|
||||||
NTFY_TOKEN=""
|
|
||||||
|
|
||||||
# Ereignisse, bei denen benachrichtigt wird (kommasepariert)
|
|
||||||
# Möglich: start, stop, error, upload
|
|
||||||
# Beispiel: "start,stop,error,upload" für alle Ereignisse
|
|
||||||
NTFY_EVENTS="error"
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Plik-Upload (optional)
|
|
||||||
# https://github.com/root-gg/plik
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# Plik Server-URL
|
|
||||||
# Beispiel: https://plik.example.com
|
|
||||||
# Leer = deaktiviert (kann pro Job aktiviert werden)
|
|
||||||
PLIK_URL=""
|
|
||||||
|
|
||||||
# Plik API-Key (optional, nur bei geschützten Servern)
|
|
||||||
PLIK_API_KEY=""
|
|
||||||
|
|
||||||
# Gültigkeitsdauer des Uploads
|
|
||||||
# Beispiel: 30d (30 Tage), 24h (24 Stunden), 0 (unbegrenzt)
|
|
||||||
PLIK_TTL="30d"
|
|
||||||
-105
@@ -1,105 +0,0 @@
|
|||||||
# Befehle
|
|
||||||
|
|
||||||
## Übersicht
|
|
||||||
|
|
||||||
| Befehl | Beschreibung |
|
|
||||||
|----------------------|-------------------------------------------------|
|
|
||||||
| `record [job]` | Einzelnen Stream aufzeichnen (ohne Angabe: Auswahl) |
|
|
||||||
| `record-all` | Alle Jobs gleichzeitig aufzeichnen |
|
|
||||||
| `create` | Neuen Job interaktiv erstellen |
|
|
||||||
| `quick` | Schnellaufnahme (URL direkt eingeben) |
|
|
||||||
| `upload <datei>` | Vorhandene Datei nach Plik hochladen |
|
|
||||||
| `stop [name]` | Aufnahme stoppen (ohne Angabe: Auswahl) |
|
|
||||||
| `stop-all` | Alle Aufnahmen stoppen |
|
|
||||||
| `list` | Jobs und deren Zeitpläne anzeigen |
|
|
||||||
| `status` | Laufende Aufnahmen mit Details anzeigen |
|
|
||||||
| `scheduler` | Zeitplanung prüfen und Jobs starten/stoppen |
|
|
||||||
| `logs` | Log-Ausgabe live verfolgen |
|
|
||||||
|
|
||||||
## Optionen
|
|
||||||
|
|
||||||
| Option | Beschreibung |
|
|
||||||
|--------------------------|---------------------------------------|
|
|
||||||
| `-c, --config <datei>` | Alternative Konfigurationsdatei |
|
|
||||||
| `-V, --verbose` | Ausführliche Ausgabe |
|
|
||||||
| `--foreground` | Aufnahme im Vordergrund ausführen |
|
|
||||||
| `-h, --help` | Hilfe anzeigen |
|
|
||||||
| `-v, --version` | Version anzeigen |
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
### record
|
|
||||||
|
|
||||||
Startet eine Aufnahme im Hintergrund (Standard) oder Vordergrund (`--foreground`). Ohne Job-Name wird eine interaktive Auswahl aller verfügbaren Jobs angezeigt.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh record # Job aus Liste wählen
|
|
||||||
./stream-recorder.sh record mein-stream # Direkt starten
|
|
||||||
./stream-recorder.sh --foreground record mein-stream
|
|
||||||
./stream-recorder.sh -V record mein-stream
|
|
||||||
```
|
|
||||||
|
|
||||||
### create
|
|
||||||
|
|
||||||
Erstellt interaktiv eine neue Job-Datei. Fragt nach URL, Name, Typ, Segment-Splitting, Zeitplan und Plik-Upload.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh create
|
|
||||||
```
|
|
||||||
|
|
||||||
### quick
|
|
||||||
|
|
||||||
Schnellaufnahme ohne Job-Datei. Fragt nach URL, Name, Typ und Dauer.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh quick
|
|
||||||
```
|
|
||||||
|
|
||||||
### stop / stop-all
|
|
||||||
|
|
||||||
Stoppt eine laufende Aufnahme. Ohne Job-Name wird eine Auswahl angezeigt. Wenn Plik aktiviert ist, wird die Teilaufnahme hochgeladen. Bei Segment-Splitting werden alle verbleibenden Segmente hochgeladen.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh stop # Job aus Liste wählen
|
|
||||||
./stream-recorder.sh stop mein-stream # Direkt stoppen
|
|
||||||
./stream-recorder.sh stop-all # Alle stoppen
|
|
||||||
```
|
|
||||||
|
|
||||||
### status
|
|
||||||
|
|
||||||
Zeigt detaillierte Informationen zu laufenden Aufnahmen:
|
|
||||||
- Stream-Name und Typ
|
|
||||||
- PID und Startmodus (manuell/geplant)
|
|
||||||
- Startzeit und bisherige Laufzeit
|
|
||||||
- Dateigröße bzw. Anzahl der Segmente und Gesamtgröße
|
|
||||||
- Scheduler-Status (systemd-Timer)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh status
|
|
||||||
```
|
|
||||||
|
|
||||||
### list
|
|
||||||
|
|
||||||
Zeigt alle konfigurierten Jobs mit Status, Zeitplan, Segment-Einstellungen und Plik-Konfiguration.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh list
|
|
||||||
```
|
|
||||||
|
|
||||||
### logs
|
|
||||||
|
|
||||||
Verfolgt die Log-Ausgabe in Echtzeit (`tail -f`).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh logs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Logging
|
|
||||||
|
|
||||||
Logs werden nach `LOG_DIR` geschrieben (Standard: `/var/log/stream-recorder/`):
|
|
||||||
|
|
||||||
| Datei | Inhalt |
|
|
||||||
|----------------------------|---------------------------------|
|
|
||||||
| `stream-recorder.log` | Alle Operationen des Scripts |
|
|
||||||
| `ffmpeg_<job-id>.log` | ffmpeg-Ausgabe pro Job |
|
|
||||||
| `nohup_<job-id>.log` | Ausgabe im Hintergrund-Modus |
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
# Praxisbeispiele
|
|
||||||
|
|
||||||
## RTMP-Livestream täglich aufzeichnen
|
|
||||||
|
|
||||||
Tägliche Aufnahme eines Twitch-/YouTube-/RTMP-Streams von 20:00 bis 22:00 Uhr mit Plik-Upload:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# jobs/abend-livestream.job
|
|
||||||
STREAM_NAME="Abend-Livestream"
|
|
||||||
STREAM_URL="rtmp://example.com/live/stream-key"
|
|
||||||
STREAM_TYPE="auto"
|
|
||||||
OUTPUT_FORMAT=""
|
|
||||||
MAX_DURATION=""
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="*"
|
|
||||||
SCHEDULE_START="20:00"
|
|
||||||
SCHEDULE_STOP="22:00"
|
|
||||||
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
DELETE_AFTER_UPLOAD=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Radio-Mitschnitt werktags
|
|
||||||
|
|
||||||
Werktags um 18:00 Uhr eine Stunde Radio mitschneiden:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# jobs/radio-abends.job
|
|
||||||
STREAM_NAME="Radio-Abendshow"
|
|
||||||
STREAM_URL="https://example.com/stream.mp3"
|
|
||||||
STREAM_TYPE="auto"
|
|
||||||
OUTPUT_FORMAT=""
|
|
||||||
MAX_DURATION="1h"
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="Mo-Fr"
|
|
||||||
SCHEDULE_START="18:00"
|
|
||||||
SCHEDULE_STOP=""
|
|
||||||
|
|
||||||
PLIK_ENABLED=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## 24/7-Stream mit stündlichem Upload
|
|
||||||
|
|
||||||
Ein Überwachungsstream, der dauerhaft läuft und stündlich Segmente zu Plik hochlädt. Lokale Dateien werden nach dem Upload gelöscht:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# jobs/ueberwachung.job
|
|
||||||
STREAM_NAME="Kamera-Front"
|
|
||||||
STREAM_URL="rtmp://192.168.1.100/live/cam1"
|
|
||||||
STREAM_TYPE="auto"
|
|
||||||
OUTPUT_FORMAT="mp4"
|
|
||||||
MAX_DURATION=""
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
SEGMENT_DURATION="1h"
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=false
|
|
||||||
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
DELETE_AFTER_UPLOAD=true
|
|
||||||
```
|
|
||||||
|
|
||||||
Starten mit:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh record ueberwachung
|
|
||||||
```
|
|
||||||
|
|
||||||
## Podcast-/HLS-Stream in 2-Stunden-Blöcken
|
|
||||||
|
|
||||||
Ein langer HLS-Livestream (z.B. Konferenz) in 2-Stunden-Segmenten aufzeichnen, jedes Segment wird sofort hochgeladen:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# jobs/konferenz.job
|
|
||||||
STREAM_NAME="Dev-Konferenz-2026"
|
|
||||||
STREAM_URL="https://example.com/live/playlist.m3u8"
|
|
||||||
STREAM_TYPE="hls"
|
|
||||||
OUTPUT_FORMAT="mp4"
|
|
||||||
MAX_DURATION="10h"
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
SEGMENT_DURATION="2h"
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=false
|
|
||||||
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
DELETE_AFTER_UPLOAD=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Einmalige Aufnahme zu einem bestimmten Termin
|
|
||||||
|
|
||||||
Ein Event am 15.09.2026 um 21:00 Uhr aufnehmen, 2 Stunden:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# jobs/einmaliges-event.job
|
|
||||||
STREAM_NAME="Einmaliges-Event"
|
|
||||||
STREAM_URL="https://example.com/live/playlist.m3u8"
|
|
||||||
STREAM_TYPE="hls"
|
|
||||||
OUTPUT_FORMAT="mp4"
|
|
||||||
MAX_DURATION="2h"
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_ONCE=true
|
|
||||||
SCHEDULE_DATE="2026-09-15"
|
|
||||||
SCHEDULE_START="21:00"
|
|
||||||
SCHEDULE_STOP=""
|
|
||||||
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
DELETE_AFTER_UPLOAD=false
|
|
||||||
```
|
|
||||||
|
|
||||||
## Schnellaufnahme ohne Job-Datei
|
|
||||||
|
|
||||||
Für spontane Aufnahmen ohne Konfiguration:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh quick
|
|
||||||
```
|
|
||||||
|
|
||||||
Das Script fragt interaktiv nach URL, Name, Typ und Dauer.
|
|
||||||
|
|
||||||
## Typischer Workflow
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Konfiguration erstellen (einmalig)
|
|
||||||
cp config/stream-recorder.conf.dist config/stream-recorder.conf
|
|
||||||
nano config/stream-recorder.conf
|
|
||||||
|
|
||||||
# 2. Scheduler installieren (einmalig)
|
|
||||||
sudo install/install.sh
|
|
||||||
|
|
||||||
# 3. Job erstellen
|
|
||||||
./stream-recorder.sh create
|
|
||||||
|
|
||||||
# 4. Jobs anzeigen
|
|
||||||
./stream-recorder.sh list
|
|
||||||
|
|
||||||
# 5. Status prüfen
|
|
||||||
./stream-recorder.sh status
|
|
||||||
|
|
||||||
# 6. Logs verfolgen
|
|
||||||
./stream-recorder.sh logs
|
|
||||||
|
|
||||||
# 7. Aufnahme stoppen (falls nötig)
|
|
||||||
./stream-recorder.sh stop mein-stream
|
|
||||||
```
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# NTFY-Benachrichtigungen
|
|
||||||
|
|
||||||
Push-Nachrichten via [ntfy](https://ntfy.sh) (selbst gehostet oder öffentlich) bei wichtigen Ereignissen.
|
|
||||||
|
|
||||||
## Einrichtung
|
|
||||||
|
|
||||||
In `config/stream-recorder.conf`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
NTFY_URL="https://ntfy.sh/mein-stream-topic"
|
|
||||||
NTFY_TOKEN="" # Optional, nur bei geschützten Topics
|
|
||||||
NTFY_EVENTS="start,stop,error" # Kommasepariert
|
|
||||||
```
|
|
||||||
|
|
||||||
## Events
|
|
||||||
|
|
||||||
| Event | Auslöser | Priorität |
|
|
||||||
|----------|-----------------------------------------------------|-----------|
|
|
||||||
| `start` | Aufnahme wurde gestartet | Normal |
|
|
||||||
| `stop` | Aufnahme beendet (regulär oder manuell) | Normal |
|
|
||||||
| `error` | Verbindung verloren oder max. Versuche erreicht | Hoch |
|
|
||||||
| `upload` | Datei auf Plik hochgeladen (mit Download-Link) | Normal |
|
|
||||||
|
|
||||||
## Alle Events aktivieren
|
|
||||||
|
|
||||||
```bash
|
|
||||||
NTFY_EVENTS="start,stop,error,upload"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Nur Fehler (Standard)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
NTFY_EVENTS="error"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Hinweise
|
|
||||||
|
|
||||||
- Benachrichtigungen werden asynchron im Hintergrund gesendet
|
|
||||||
- Ein fehlgeschlagener Versand blockiert die Aufnahme nicht
|
|
||||||
- curl muss installiert sein (`sudo apt install curl`)
|
|
||||||
- Ohne gesetzte `NTFY_URL` sind Benachrichtigungen komplett deaktiviert
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Installation
|
|
||||||
|
|
||||||
## Voraussetzungen
|
|
||||||
|
|
||||||
| Komponente | Anforderung |
|
|
||||||
|------------------|------------------------------------------|
|
|
||||||
| Betriebssystem | Linux (getestet unter Ubuntu/Debian) |
|
|
||||||
| Bash | Version 4.0 oder neuer |
|
|
||||||
| ffmpeg | Pflicht (`sudo apt install ffmpeg`) |
|
|
||||||
| curl | Optional, für NTFY und Plik-Upload |
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Repository klonen
|
|
||||||
git clone https://git.techniverse.net/scriptos/stream-recorder.git /opt/stream-recorder
|
|
||||||
cd /opt/stream-recorder
|
|
||||||
|
|
||||||
# Konfiguration aus Vorlage erstellen und anpassen
|
|
||||||
cp config/stream-recorder.conf.dist config/stream-recorder.conf
|
|
||||||
nano config/stream-recorder.conf
|
|
||||||
|
|
||||||
# Scheduler installieren (systemd-Timer)
|
|
||||||
sudo install/install.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Das Install-Script:
|
|
||||||
- Macht das Hauptscript ausführbar
|
|
||||||
- Installiert fehlende Abhängigkeiten (ffmpeg)
|
|
||||||
- Erstellt die Konfigurationsdatei aus der Vorlage (falls nicht vorhanden)
|
|
||||||
- Richtet einen systemd-Timer ein, der jede Minute die Zeitpläne prüft
|
|
||||||
|
|
||||||
## Updates
|
|
||||||
|
|
||||||
Da die Konfiguration als Kopie (`stream-recorder.conf`) vorliegt und die Vorlage (`stream-recorder.conf.dist`) getrennt gepflegt wird, gehen eigene Einstellungen bei einem `git pull` nicht verloren.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/stream-recorder
|
|
||||||
git pull
|
|
||||||
```
|
|
||||||
|
|
||||||
Nach einem Update sollte man prüfen, ob in `stream-recorder.conf.dist` neue Parameter hinzugekommen sind, und diese ggf. in die eigene `stream-recorder.conf` übernehmen.
|
|
||||||
|
|
||||||
## Deinstallation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo install/uninstall.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Entfernt den systemd-Timer und stoppt optional alle laufenden Aufnahmen. Job-Dateien, Konfiguration und Aufnahmen bleiben erhalten.
|
|
||||||
|
|
||||||
## Ohne systemd
|
|
||||||
|
|
||||||
Das Script funktioniert auch ohne Scheduler. In dem Fall muss man Aufnahmen manuell starten:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh record mein-stream
|
|
||||||
```
|
|
||||||
|
|
||||||
Oder den Scheduler manuell per Cron aufrufen:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# crontab -e
|
|
||||||
* * * * * /opt/stream-recorder/stream-recorder.sh scheduler
|
|
||||||
```
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# Job-Dateien
|
|
||||||
|
|
||||||
Jeder Stream wird durch eine `.job`-Datei im `jobs/`-Verzeichnis definiert. Vorlagen befinden sich unter `jobs/templates/`.
|
|
||||||
|
|
||||||
## Job erstellen
|
|
||||||
|
|
||||||
### Interaktiv (empfohlen)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh create
|
|
||||||
```
|
|
||||||
|
|
||||||
Das Script fragt Schritt für Schritt nach URL, Name, Typ, Segment-Splitting, Zeitplan und Plik-Upload und erstellt die Job-Datei automatisch.
|
|
||||||
|
|
||||||
### Aus Vorlage
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Vorlage kopieren
|
|
||||||
cp jobs/templates/example-rtmp.job.dist jobs/mein-stream.job
|
|
||||||
|
|
||||||
# Anpassen
|
|
||||||
nano jobs/mein-stream.job
|
|
||||||
```
|
|
||||||
|
|
||||||
Verfügbare Vorlagen:
|
|
||||||
|
|
||||||
| Vorlage | Beschreibung |
|
|
||||||
|----------------------------|-------------------------|
|
|
||||||
| `example-rtmp.job.dist` | RTMP/RTMPS-Stream |
|
|
||||||
| `example-hls.job.dist` | HLS/m3u8-Stream |
|
|
||||||
| `example-mp3.job.dist` | HTTP-Audio (MP3/Radio) |
|
|
||||||
|
|
||||||
## Stream-Parameter
|
|
||||||
|
|
||||||
| Parameter | Pflicht | Beschreibung |
|
|
||||||
|----------------------|---------|-----------------------------------------------------|
|
|
||||||
| `STREAM_NAME` | Ja | Name des Streams (wird für Dateinamen verwendet) |
|
|
||||||
| `STREAM_URL` | Ja | URL des Streams |
|
|
||||||
| `STREAM_TYPE` | Nein | `auto`, `rtmp`, `hls`, `mp3`, `aac`, `ogg`, `flac` |
|
|
||||||
| `OUTPUT_FORMAT` | Nein | Dateiendung (z.B. `mp4`, `mp3`) — sonst automatisch |
|
|
||||||
| `MAX_DURATION` | Nein | Aufnahmedauer (z.B. `1h`, `30m`, `1d12h`, `3600`) |
|
|
||||||
| `EXTRA_FFMPEG_ARGS` | Nein | Zusätzliche ffmpeg-Parameter |
|
|
||||||
| `SEGMENT_DURATION` | Nein | Segment-Splitting (z.B. `1h`, `2h`) — siehe [Segment-Splitting](segment-splitting.md) |
|
|
||||||
| `PLIK_ENABLED` | Nein | Plik-Upload aktivieren (`true`/`false`) |
|
|
||||||
| `DELETE_AFTER_UPLOAD` | Nein | Lokale Datei nach Upload löschen (`true`/`false`) |
|
|
||||||
|
|
||||||
### Dauerformate
|
|
||||||
|
|
||||||
Die Dauer kann in verschiedenen Formaten angegeben werden:
|
|
||||||
|
|
||||||
| Format | Bedeutung |
|
|
||||||
|-----------|------------------|
|
|
||||||
| `3600` | 3600 Sekunden |
|
|
||||||
| `30m` | 30 Minuten |
|
|
||||||
| `1h` | 1 Stunde |
|
|
||||||
| `1h30m` | 90 Minuten |
|
|
||||||
| `48h` | 48 Stunden |
|
|
||||||
| `48h30m` | 48,5 Stunden |
|
|
||||||
| `2d` | 2 Tage |
|
|
||||||
| `1d12h` | 36 Stunden |
|
|
||||||
|
|
||||||
Formate lassen sich frei kombinieren: `d` (Tage), `h` (Stunden), `m` (Minuten), `s` (Sekunden).
|
|
||||||
|
|
||||||
## Job-Angabe beim Starten
|
|
||||||
|
|
||||||
Der `record`-Befehl akzeptiert verschiedene Formate:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh record jobs/mein-stream.job # Vollständiger Pfad
|
|
||||||
./stream-recorder.sh record mein-stream.job # Nur Dateiname
|
|
||||||
./stream-recorder.sh record mein-stream # Nur Job-Name (ohne .job)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Jobs anzeigen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh list
|
|
||||||
```
|
|
||||||
|
|
||||||
Zeigt alle Jobs mit Stream-Typ, URL, Status, Zeitplan, Segment-Einstellungen und Plik-Konfiguration.
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# Konfiguration
|
|
||||||
|
|
||||||
Die Konfigurationsdatei liegt unter `config/stream-recorder.conf`. Sie wird aus der Vorlage `config/stream-recorder.conf.dist` erstellt:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp config/stream-recorder.conf.dist config/stream-recorder.conf
|
|
||||||
nano config/stream-recorder.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Die `.conf`-Datei wird von Git ignoriert und bleibt bei Updates erhalten.
|
|
||||||
|
|
||||||
## Parameter
|
|
||||||
|
|
||||||
### Basis-Einstellungen
|
|
||||||
|
|
||||||
| Parameter | Standard | Beschreibung |
|
|
||||||
|-----------------|------------------------------|-------------------------------------------|
|
|
||||||
| `DOWNLOAD_PATH` | `/home/downloads/recordings` | Basis-Verzeichnis für Aufnahmen |
|
|
||||||
| `LOG_DIR` | `/var/log/stream-recorder` | Log-Verzeichnis |
|
|
||||||
| `LOG_LEVEL` | `INFO` | Log-Level: `DEBUG`, `INFO`, `WARN`, `ERROR` |
|
|
||||||
| `PID_DIR` | `/tmp/stream-recorder` | PID-Dateien für laufende Aufnahmen |
|
|
||||||
| `STATE_DIR` | `/var/lib/stream-recorder` | Status für bereits gestartete Zeitpläne |
|
|
||||||
|
|
||||||
### Reconnect
|
|
||||||
|
|
||||||
| Parameter | Standard | Beschreibung |
|
|
||||||
|---------------|----------|-------------------------------------------|
|
|
||||||
| `MAX_RETRIES` | `0` | Wiederholungsversuche (0 = unbegrenzt) |
|
|
||||||
| `RETRY_DELAY` | `5` | Wartezeit zwischen Versuchen (Sekunden) |
|
|
||||||
|
|
||||||
Bei Verbindungsabbrüchen versucht das Script automatisch, die Verbindung wiederherzustellen. Bei jedem Reconnect wird eine neue Datei mit aktuellem Zeitstempel erzeugt.
|
|
||||||
|
|
||||||
- `MAX_RETRIES=0` — Unbegrenzte Versuche (empfohlen für Langzeitaufnahmen)
|
|
||||||
- `MAX_RETRIES=5` — Maximal 5 Versuche, danach Abbruch mit Benachrichtigung
|
|
||||||
|
|
||||||
### NTFY-Benachrichtigungen
|
|
||||||
|
|
||||||
Push-Nachrichten via [ntfy](https://ntfy.sh) (selbst gehostet oder öffentlich).
|
|
||||||
|
|
||||||
| Parameter | Standard | Beschreibung |
|
|
||||||
|---------------|----------|-------------------------------------------|
|
|
||||||
| `NTFY_URL` | (leer) | NTFY Server-URL inkl. Topic |
|
|
||||||
| `NTFY_TOKEN` | (leer) | NTFY Access-Token (optional) |
|
|
||||||
| `NTFY_EVENTS` | `error` | Benachrichtigungs-Events (kommasepariert) |
|
|
||||||
|
|
||||||
Siehe [Benachrichtigungen](benachrichtigungen.md) für Details zu den Events.
|
|
||||||
|
|
||||||
### Plik-Upload
|
|
||||||
|
|
||||||
Fertige Aufnahmen auf einen [Plik](https://github.com/root-gg/plik)-Server hochladen.
|
|
||||||
|
|
||||||
| Parameter | Standard | Beschreibung |
|
|
||||||
|----------------|----------|-------------------------------------------|
|
|
||||||
| `PLIK_URL` | (leer) | Plik Server-URL |
|
|
||||||
| `PLIK_API_KEY` | (leer) | Plik API-Key (optional) |
|
|
||||||
| `PLIK_TTL` | `30d` | Gültigkeitsdauer: `30d`, `24h`, Sekunden |
|
|
||||||
|
|
||||||
Siehe [Plik-Upload](plik-upload.md) für die Einrichtung pro Job.
|
|
||||||
|
|
||||||
## Alternative Konfigurationsdatei
|
|
||||||
|
|
||||||
Eine andere Konfigurationsdatei kann per `-c` übergeben werden:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh -c /pfad/zur/config.conf record mein-stream
|
|
||||||
```
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Plik-Upload
|
|
||||||
|
|
||||||
Fertige Aufnahmen können automatisch auf einen [Plik](https://github.com/root-gg/plik)-Server hochgeladen werden. Die Browser-URL zum Download wird im Log und optional per NTFY-Benachrichtigung ausgegeben.
|
|
||||||
|
|
||||||
## Einrichtung
|
|
||||||
|
|
||||||
### 1. Plik-Server konfigurieren
|
|
||||||
|
|
||||||
In `config/stream-recorder.conf`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLIK_URL="https://plik.example.com"
|
|
||||||
PLIK_API_KEY="" # Optional, nur bei geschützten Servern
|
|
||||||
PLIK_TTL="30d" # Gültigkeitsdauer: 30d, 24h, oder Sekunden
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Pro Job aktivieren
|
|
||||||
|
|
||||||
In der Job-Datei:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Optional: Datei nach Upload löschen
|
|
||||||
|
|
||||||
```bash
|
|
||||||
DELETE_AFTER_UPLOAD=true
|
|
||||||
```
|
|
||||||
|
|
||||||
## Verhalten
|
|
||||||
|
|
||||||
- Upload nach jeder regulär abgeschlossenen Aufnahme
|
|
||||||
- Upload nach manuellem Stop (`stop`-Befehl) — die Teilaufnahme wird hochgeladen
|
|
||||||
- Upload nach Verbindungsabbruch, wenn eine Teildatei vorhanden ist
|
|
||||||
- Browser-Link und Datei-URL werden ins Log geschrieben
|
|
||||||
- Optional wird der Link per NTFY gesendet (Event: `upload`)
|
|
||||||
|
|
||||||
## Mit Segment-Splitting
|
|
||||||
|
|
||||||
Bei aktiviertem [Segment-Splitting](segment-splitting.md) wird jedes Segment einzeln hochgeladen:
|
|
||||||
|
|
||||||
- Fertige Segmente werden während der Aufnahme hochgeladen (alle 60s geprüft)
|
|
||||||
- Das letzte Segment wird nach Ende der Aufnahme hochgeladen
|
|
||||||
- `DELETE_AFTER_UPLOAD=true` löscht jedes Segment nach dem Upload
|
|
||||||
|
|
||||||
## Manueller Upload
|
|
||||||
|
|
||||||
Eine vorhandene Datei kann auch manuell hochgeladen werden:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./stream-recorder.sh upload /pfad/zur/aufnahme.mp4 "Stream-Name"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Download-Link per Push
|
|
||||||
|
|
||||||
Um den Plik-Link automatisch als Push-Nachricht zu erhalten:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# In config/stream-recorder.conf
|
|
||||||
NTFY_EVENTS="start,stop,error,upload"
|
|
||||||
```
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
# Segment-Splitting
|
|
||||||
|
|
||||||
Lange Aufnahmen (z.B. 8-Stunden-Streams) können automatisch in kleinere Dateien geteilt werden. Jedes Segment wird einzeln nach Plik hochgeladen, sobald es fertig ist.
|
|
||||||
|
|
||||||
## Einrichtung
|
|
||||||
|
|
||||||
In der Job-Datei `SEGMENT_DURATION` setzen:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Aufnahme alle 2 Stunden teilen
|
|
||||||
SEGMENT_DURATION="2h"
|
|
||||||
|
|
||||||
# Plik-Upload aktivieren (empfohlen)
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
```
|
|
||||||
|
|
||||||
## Dauerformate
|
|
||||||
|
|
||||||
| Format | Bedeutung |
|
|
||||||
|----------|------------------|
|
|
||||||
| `30m` | Alle 30 Minuten |
|
|
||||||
| `1h` | Stündlich |
|
|
||||||
| `2h` | Alle 2 Stunden |
|
|
||||||
| `3600` | 3600 Sekunden |
|
|
||||||
|
|
||||||
## So funktioniert's
|
|
||||||
|
|
||||||
1. ffmpeg teilt die Aufnahme automatisch in Segmente der angegebenen Länge
|
|
||||||
2. Ein Hintergrund-Prozess prüft alle 60 Sekunden auf fertige Segmente
|
|
||||||
3. Fertige Segmente werden sofort nach Plik hochgeladen (falls aktiviert)
|
|
||||||
4. Beim Beenden (regulär oder per `stop`) wird das letzte Segment noch hochgeladen
|
|
||||||
|
|
||||||
### Dateinamen
|
|
||||||
|
|
||||||
Segmente erhalten fortlaufende Nummern:
|
|
||||||
|
|
||||||
```
|
|
||||||
Mein-Stream_20260907_200000_seg000.mp4
|
|
||||||
Mein-Stream_20260907_200000_seg001.mp4
|
|
||||||
Mein-Stream_20260907_200000_seg002.mp4
|
|
||||||
```
|
|
||||||
|
|
||||||
## Kombination mit Plik
|
|
||||||
|
|
||||||
Segment-Splitting ist besonders nützlich in Kombination mit Plik-Upload:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SEGMENT_DURATION="1h"
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
DELETE_AFTER_UPLOAD=true # Lokale Segmente nach Upload löschen
|
|
||||||
```
|
|
||||||
|
|
||||||
So wird jede Stunde ein Segment hochgeladen und lokal gelöscht. Das spart Speicherplatz bei langen Aufnahmen.
|
|
||||||
|
|
||||||
## Kombination mit Zeitplanung
|
|
||||||
|
|
||||||
Segment-Splitting und Zeitplanung lassen sich kombinieren:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="*"
|
|
||||||
SCHEDULE_START="08:00"
|
|
||||||
SCHEDULE_STOP="20:00"
|
|
||||||
SEGMENT_DURATION="2h"
|
|
||||||
PLIK_ENABLED=true
|
|
||||||
```
|
|
||||||
|
|
||||||
Die 12-Stunden-Aufnahme wird in 6 Segmente zu je 2 Stunden geteilt, jedes wird nach Fertigstellung hochgeladen.
|
|
||||||
|
|
||||||
## Verhalten bei Reconnect
|
|
||||||
|
|
||||||
Wenn die Verbindung abbricht und wiederhergestellt wird, werden die bisherigen Segmente hochgeladen und eine neue Segment-Serie mit neuem Zeitstempel begonnen.
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
Mit `./stream-recorder.sh status` werden bei segmentierten Aufnahmen die Anzahl der Segmente und die Gesamtgröße angezeigt.
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# Zeitplanung
|
|
||||||
|
|
||||||
Die Zeitplanung wird direkt in der Job-Datei konfiguriert — kein Cron-Wissen nötig. Ein systemd-Timer prüft jede Minute alle Jobs und startet/stoppt Aufnahmen automatisch.
|
|
||||||
|
|
||||||
## Einrichtung
|
|
||||||
|
|
||||||
1. **Job-Datei erstellen** und `SCHEDULE_*`-Parameter setzen
|
|
||||||
2. **Scheduler installieren** mit `sudo install/install.sh` (einmalig)
|
|
||||||
3. Fertig — der Timer prüft jede Minute alle Jobs
|
|
||||||
|
|
||||||
## Zeitplan-Parameter
|
|
||||||
|
|
||||||
| Parameter | Standard | Beschreibung |
|
|
||||||
|--------------------|----------|-------------------------------------------------|
|
|
||||||
| `SCHEDULE_ENABLED` | `false` | Zeitplan aktivieren (`true`/`false`) |
|
|
||||||
| `SCHEDULE_ONCE` | `false` | Einmaliger Termin statt wöchentlichem Zeitplan |
|
|
||||||
| `SCHEDULE_DATE` | (leer) | Datum für einmalige Termine (`YYYY-MM-DD`) |
|
|
||||||
| `SCHEDULE_DAYS` | `*` | Aufnahmetage für wöchentliche Zeitpläne |
|
|
||||||
| `SCHEDULE_START` | (leer) | Startzeit im Format `HH:MM` |
|
|
||||||
| `SCHEDULE_STOP` | (leer) | Endzeit im Format `HH:MM` (leer = kein Auto-Stop)|
|
|
||||||
|
|
||||||
## Tagesformate
|
|
||||||
|
|
||||||
| Format | Bedeutung |
|
|
||||||
|--------------|----------------------------|
|
|
||||||
| `*` | Täglich |
|
|
||||||
| `Mo-Fr` | Montag bis Freitag |
|
|
||||||
| `Sa,So` | Samstag und Sonntag |
|
|
||||||
| `Mo,Mi,Fr` | Einzelne Tage |
|
|
||||||
| `Mo-Fr,So` | Kombiniert |
|
|
||||||
|
|
||||||
Die Tagesangaben funktionieren auf Deutsch (Mo, Di, Mi, Do, Fr, Sa, So) und Englisch (Mon, Tue, Wed, Thu, Fri, Sat, Sun).
|
|
||||||
|
|
||||||
## Verhalten
|
|
||||||
|
|
||||||
- **Start + Stop gesetzt:** Aufnahme läuft im angegebenen Zeitfenster
|
|
||||||
- **Nur Start gesetzt:** Aufnahme startet zur angegebenen Zeit, läuft bis `MAX_DURATION` oder manueller Stop
|
|
||||||
- **Einmalig:** Mit `SCHEDULE_ONCE=true` und `SCHEDULE_DATE="YYYY-MM-DD"` startet der Job nur an diesem Datum
|
|
||||||
- **Manuell gestartete Aufnahmen** werden vom Scheduler nicht beeinflusst
|
|
||||||
- **Nach Neustart** des Servers erkennt der Scheduler automatisch, welche Aufnahmen laufen sollten
|
|
||||||
- **Nachtübergreifend:** Start- und Stoppzeiten können über Mitternacht gehen (z.B. `23:00` bis `02:00`)
|
|
||||||
|
|
||||||
## Beispiele
|
|
||||||
|
|
||||||
### Tägliche Aufnahme von 20:00 bis 22:00
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="*"
|
|
||||||
SCHEDULE_START="20:00"
|
|
||||||
SCHEDULE_STOP="22:00"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Werktags um 18:00, 1 Stunde
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="Mo-Fr"
|
|
||||||
SCHEDULE_START="18:00"
|
|
||||||
MAX_DURATION="1h"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Nur am Wochenende
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_DAYS="Sa,So"
|
|
||||||
SCHEDULE_START="14:00"
|
|
||||||
SCHEDULE_STOP="18:00"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Einmalige Aufnahme am 15.09.2026
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SCHEDULE_ENABLED=true
|
|
||||||
SCHEDULE_ONCE=true
|
|
||||||
SCHEDULE_DATE="2026-09-15"
|
|
||||||
SCHEDULE_START="21:00"
|
|
||||||
MAX_DURATION="30m"
|
|
||||||
```
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
###############################################
|
|
||||||
# stream-recorder - Installations-Script
|
|
||||||
# Richtet den systemd-Timer für die
|
|
||||||
# automatische Zeitplanung ein.
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
||||||
SERVICE_NAME="stream-recorder"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "stream-recorder - Installation"
|
|
||||||
echo "=============================="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Root-Prüfung
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
echo "FEHLER: Dieses Script muss als root ausgeführt werden."
|
|
||||||
echo " sudo $0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prüfe ob systemd vorhanden
|
|
||||||
if ! command -v systemctl &>/dev/null; then
|
|
||||||
echo "FEHLER: systemd ist nicht verfügbar."
|
|
||||||
echo " Dieses Script benötigt systemd für die Zeitplanung."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prüfe Abhängigkeiten
|
|
||||||
if ! command -v ffmpeg &>/dev/null; then
|
|
||||||
echo "ffmpeg nicht gefunden. Installiere ffmpeg..."
|
|
||||||
apt-get update -qq && apt-get install -y -qq ffmpeg
|
|
||||||
echo "ffmpeg installiert."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Hauptscript ausführbar machen
|
|
||||||
chmod +x "${SCRIPT_DIR}/stream-recorder.sh"
|
|
||||||
|
|
||||||
# Konfiguration aus Vorlage erstellen, falls nicht vorhanden
|
|
||||||
if [[ ! -f "${SCRIPT_DIR}/config/stream-recorder.conf" ]]; then
|
|
||||||
if [[ -f "${SCRIPT_DIR}/config/stream-recorder.conf.dist" ]]; then
|
|
||||||
cp "${SCRIPT_DIR}/config/stream-recorder.conf.dist" "${SCRIPT_DIR}/config/stream-recorder.conf"
|
|
||||||
echo "Konfiguration erstellt: config/stream-recorder.conf"
|
|
||||||
echo " Bitte anpassen: nano ${SCRIPT_DIR}/config/stream-recorder.conf"
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Installationspfad: ${SCRIPT_DIR}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# systemd Service erstellen
|
|
||||||
cat > "/etc/systemd/system/${SERVICE_NAME}.service" <<EOF
|
|
||||||
[Unit]
|
|
||||||
Description=stream-recorder Scheduler
|
|
||||||
After=network-online.target
|
|
||||||
Wants=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
ExecStart=${SCRIPT_DIR}/stream-recorder.sh scheduler
|
|
||||||
KillMode=none
|
|
||||||
StandardOutput=journal
|
|
||||||
StandardError=journal
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# systemd Timer erstellen
|
|
||||||
cat > "/etc/systemd/system/${SERVICE_NAME}.timer" <<EOF
|
|
||||||
[Unit]
|
|
||||||
Description=stream-recorder Scheduler Timer
|
|
||||||
|
|
||||||
[Timer]
|
|
||||||
OnBootSec=30
|
|
||||||
OnCalendar=*-*-* *:*:00
|
|
||||||
AccuracySec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=timers.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# systemd neu laden und Timer aktivieren
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable "${SERVICE_NAME}.timer"
|
|
||||||
systemctl start "${SERVICE_NAME}.timer"
|
|
||||||
|
|
||||||
echo "Installation abgeschlossen!"
|
|
||||||
echo ""
|
|
||||||
echo "Status:"
|
|
||||||
systemctl status "${SERVICE_NAME}.timer" --no-pager 2>/dev/null || true
|
|
||||||
echo ""
|
|
||||||
echo "Der Scheduler prüft jetzt jede Minute die Job-Dateien"
|
|
||||||
echo "und startet/stoppt Aufnahmen automatisch."
|
|
||||||
echo ""
|
|
||||||
echo "Nächste Schritte:"
|
|
||||||
echo " 1. Konfiguration anpassen: nano ${SCRIPT_DIR}/config/stream-recorder.conf"
|
|
||||||
echo " 2. Job-Datei erstellen: cp jobs/templates/example-rtmp.job.dist jobs/mein-stream.job"
|
|
||||||
echo " 3. Job-Datei bearbeiten: nano jobs/mein-stream.job"
|
|
||||||
echo " 4. SCHEDULE_ENABLED=true setzen und Zeiten konfigurieren"
|
|
||||||
echo " 5. Jobs prüfen: ./stream-recorder.sh list"
|
|
||||||
echo ""
|
|
||||||
echo "Deinstallation: sudo install/uninstall.sh"
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
###############################################
|
|
||||||
# stream-recorder - Deinstallations-Script
|
|
||||||
# Entfernt den systemd-Timer und stoppt
|
|
||||||
# alle laufenden Aufnahmen.
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
||||||
SERVICE_NAME="stream-recorder"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "stream-recorder - Deinstallation"
|
|
||||||
echo "================================="
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Root-Prüfung
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
echo "FEHLER: Dieses Script muss als root ausgeführt werden."
|
|
||||||
echo " sudo $0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Timer stoppen und deaktivieren
|
|
||||||
if systemctl is-active --quiet "${SERVICE_NAME}.timer" 2>/dev/null; then
|
|
||||||
echo "Stoppe Timer..."
|
|
||||||
systemctl stop "${SERVICE_NAME}.timer"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if systemctl is-enabled --quiet "${SERVICE_NAME}.timer" 2>/dev/null; then
|
|
||||||
echo "Deaktiviere Timer..."
|
|
||||||
systemctl disable "${SERVICE_NAME}.timer"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Service-Dateien entfernen
|
|
||||||
if [[ -f "/etc/systemd/system/${SERVICE_NAME}.timer" ]]; then
|
|
||||||
rm -f "/etc/systemd/system/${SERVICE_NAME}.timer"
|
|
||||||
echo "Timer-Datei entfernt."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f "/etc/systemd/system/${SERVICE_NAME}.service" ]]; then
|
|
||||||
rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
|
|
||||||
echo "Service-Datei entfernt."
|
|
||||||
fi
|
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
|
|
||||||
# Laufende Aufnahmen stoppen
|
|
||||||
echo ""
|
|
||||||
read -rp "Alle laufenden Aufnahmen stoppen? [j/N] " stop_all
|
|
||||||
if [[ "$stop_all" =~ ^[Jj]$ ]]; then
|
|
||||||
"${SCRIPT_DIR}/stream-recorder.sh" stop-all 2>/dev/null || true
|
|
||||||
echo "Aufnahmen gestoppt."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "Deinstallation abgeschlossen."
|
|
||||||
echo ""
|
|
||||||
echo "Hinweis: Die Job-Dateien, Konfiguration und Aufnahmen"
|
|
||||||
echo " wurden NICHT entfernt."
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
###############################################
|
|
||||||
# stream-recorder - Job-Definition (HLS/m3u8)
|
|
||||||
###############################################
|
|
||||||
# Kopieren und anpassen:
|
|
||||||
# cp jobs/templates/example-hls.job.dist jobs/mein-hls-stream.job
|
|
||||||
|
|
||||||
# Name des Streams
|
|
||||||
STREAM_NAME="Mein-HLS-Stream"
|
|
||||||
|
|
||||||
# Stream-URL (m3u8-Playlist)
|
|
||||||
STREAM_URL="https://example.com/live/playlist.m3u8"
|
|
||||||
|
|
||||||
# Stream-Typ
|
|
||||||
STREAM_TYPE="hls"
|
|
||||||
|
|
||||||
# Ausgabeformat (mp4 oder mkv empfohlen)
|
|
||||||
OUTPUT_FORMAT="mp4"
|
|
||||||
|
|
||||||
# Maximale Aufnahmedauer (leer = unbegrenzt, z.B. 5m oder 1h)
|
|
||||||
MAX_DURATION=""
|
|
||||||
|
|
||||||
# Zusätzliche ffmpeg-Argumente (optional)
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Segment-Splitting (optional)
|
|
||||||
# z.B. 1h = stündlich, 2h = alle 2 Stunden
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Zeitplanung (optional)
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=false
|
|
||||||
SCHEDULE_ONCE=false
|
|
||||||
SCHEDULE_DATE=""
|
|
||||||
SCHEDULE_DAYS="*"
|
|
||||||
SCHEDULE_START="20:00"
|
|
||||||
SCHEDULE_STOP="22:00"
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Plik-Upload (optional)
|
|
||||||
# Fertige Aufnahme automatisch auf Plik hochladen
|
|
||||||
# PLIK_URL muss in der Konfiguration gesetzt sein
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
PLIK_ENABLED=false
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
###############################################
|
|
||||||
# stream-recorder - Job-Definition (MP3/Audio)
|
|
||||||
###############################################
|
|
||||||
# Kopieren und anpassen:
|
|
||||||
# cp jobs/templates/example-mp3.job.dist jobs/mein-radio.job
|
|
||||||
|
|
||||||
# Name des Streams
|
|
||||||
STREAM_NAME="Mein-Radiosender"
|
|
||||||
|
|
||||||
# Stream-URL (HTTP/HTTPS Audio-Stream)
|
|
||||||
STREAM_URL="https://example.com/stream.mp3"
|
|
||||||
|
|
||||||
# Stream-Typ: auto, rtmp, hls, mp3, aac, ogg, flac, http
|
|
||||||
STREAM_TYPE="auto"
|
|
||||||
|
|
||||||
# Ausgabeformat
|
|
||||||
OUTPUT_FORMAT=""
|
|
||||||
|
|
||||||
# Maximale Aufnahmedauer (leer = unbegrenzt)
|
|
||||||
# Für Radio-Mitschnitte empfohlen, z.B. 1h für 1 Stunde
|
|
||||||
MAX_DURATION="1h"
|
|
||||||
|
|
||||||
# Zusätzliche ffmpeg-Argumente (optional)
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Segment-Splitting (optional)
|
|
||||||
# z.B. 1h = stündlich, 2h = alle 2 Stunden
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Zeitplanung (optional)
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
SCHEDULE_ENABLED=false
|
|
||||||
SCHEDULE_ONCE=false
|
|
||||||
SCHEDULE_DATE=""
|
|
||||||
SCHEDULE_DAYS="Mo-Fr"
|
|
||||||
SCHEDULE_START="18:00"
|
|
||||||
SCHEDULE_STOP=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Plik-Upload (optional)
|
|
||||||
# Fertige Aufnahme automatisch auf Plik hochladen
|
|
||||||
# PLIK_URL muss in der Konfiguration gesetzt sein
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
PLIK_ENABLED=false
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
###############################################
|
|
||||||
# stream-recorder - Job-Definition (RTMP)
|
|
||||||
###############################################
|
|
||||||
# Kopieren und anpassen:
|
|
||||||
# cp jobs/templates/example-rtmp.job.dist jobs/mein-stream.job
|
|
||||||
|
|
||||||
# Name des Streams (wird für Dateinamen und Verzeichnisse verwendet)
|
|
||||||
STREAM_NAME="Mein-RTMP-Stream"
|
|
||||||
|
|
||||||
# Stream-URL
|
|
||||||
STREAM_URL="rtmp://example.com/live/stream-key"
|
|
||||||
|
|
||||||
# Stream-Typ: auto, rtmp, hls, mp3, aac, ogg, flac, http
|
|
||||||
# Bei "auto" wird der Typ anhand der URL erkannt
|
|
||||||
STREAM_TYPE="auto"
|
|
||||||
|
|
||||||
# Ausgabeformat (Dateiendung): mp4, mkv, mp3, aac, ogg, flac
|
|
||||||
# Leer lassen für automatische Erkennung basierend auf Stream-Typ
|
|
||||||
OUTPUT_FORMAT=""
|
|
||||||
|
|
||||||
# Maximale Aufnahmedauer (leer = unbegrenzt)
|
|
||||||
# Beispiele: 300 = 5 Minuten, 5m = 5 Minuten, 1h30m = 90 Minuten
|
|
||||||
MAX_DURATION=""
|
|
||||||
|
|
||||||
# Zusätzliche ffmpeg-Argumente (optional)
|
|
||||||
EXTRA_FFMPEG_ARGS=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Segment-Splitting (optional)
|
|
||||||
# Aufnahme in Teile zerlegen
|
|
||||||
# Jedes Segment wird einzeln nach Plik hochgeladen
|
|
||||||
# Beispiele: 1h = stündlich, 2h = alle 2 Stunden, 30m = alle 30 Minuten
|
|
||||||
# Leer = deaktiviert (eine durchgehende Datei)
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
SEGMENT_DURATION=""
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Zeitplanung (optional)
|
|
||||||
# Damit der Scheduler funktioniert, muss er
|
|
||||||
# installiert sein: sudo install/install.sh
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# Zeitplan aktivieren (true/false)
|
|
||||||
SCHEDULE_ENABLED=false
|
|
||||||
|
|
||||||
# Einmalige Aufnahme statt wöchentlichem Zeitplan (true/false)
|
|
||||||
SCHEDULE_ONCE=false
|
|
||||||
|
|
||||||
# Datum für einmalige Aufnahme (YYYY-MM-DD)
|
|
||||||
# Nur relevant, wenn SCHEDULE_ONCE=true ist
|
|
||||||
SCHEDULE_DATE=""
|
|
||||||
|
|
||||||
# Aufnahmetage für wöchentliche Zeitpläne
|
|
||||||
# * = täglich
|
|
||||||
# Mo-Fr = Montag bis Freitag
|
|
||||||
# Sa,So = Samstag und Sonntag
|
|
||||||
# Mo,Mi,Fr = einzelne Tage
|
|
||||||
SCHEDULE_DAYS="*"
|
|
||||||
|
|
||||||
# Startzeit (HH:MM)
|
|
||||||
SCHEDULE_START="20:00"
|
|
||||||
|
|
||||||
# Endzeit (HH:MM)
|
|
||||||
# Leer = Aufnahme läuft bis MAX_DURATION oder manueller Stop
|
|
||||||
SCHEDULE_STOP="22:00"
|
|
||||||
|
|
||||||
###############################################
|
|
||||||
# Plik-Upload (optional)
|
|
||||||
# Fertige Aufnahme automatisch auf Plik hochladen
|
|
||||||
# PLIK_URL muss in der Konfiguration gesetzt sein
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
PLIK_ENABLED=false
|
|
||||||
-1621
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user