From e2e36e4d2db11f3192e259145f28416035f16565 Mon Sep 17 00:00:00 2001 From: Patrick Asmus Date: Mon, 7 Sep 2026 13:44:25 +0200 Subject: [PATCH] Release: v2.8.0 --- README.md | 4 +- docs/befehle.md | 16 ++++--- docs/jobs.md | 20 ++++---- stream-recorder.sh | 114 ++++++++++++++++++++++++++++++++++++--------- 4 files changed, 115 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 318cbe2..181618d 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ sudo install/install.sh ## Befehle ```bash -./stream-recorder.sh record # Aufnahme starten -./stream-recorder.sh stop # Aufnahme stoppen +./stream-recorder.sh record [job] # Aufnahme starten (ohne Angabe: Auswahl) +./stream-recorder.sh stop [job] # Aufnahme stoppen (ohne Angabe: Auswahl) ./stream-recorder.sh status # Laufende Aufnahmen anzeigen ./stream-recorder.sh list # Alle Jobs anzeigen ./stream-recorder.sh create # Neuen Job erstellen diff --git a/docs/befehle.md b/docs/befehle.md index f2d4e1f..5fb3118 100644 --- a/docs/befehle.md +++ b/docs/befehle.md @@ -4,12 +4,12 @@ | Befehl | Beschreibung | |----------------------|-------------------------------------------------| -| `record ` | Einzelnen Stream aufzeichnen | +| `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 ` | Vorhandene Datei nach Plik hochladen | -| `stop ` | Aufnahme stoppen (Teilaufnahme wird hochgeladen)| +| `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 | @@ -30,10 +30,11 @@ ### record -Startet eine Aufnahme im Hintergrund (Standard) oder Vordergrund (`--foreground`). +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 mein-stream +./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 ``` @@ -56,11 +57,12 @@ Schnellaufnahme ohne Job-Datei. Fragt nach URL, Name, Typ und Dauer. ### stop / stop-all -Stoppt eine laufende Aufnahme. Wenn Plik aktiviert ist, wird die Teilaufnahme hochgeladen. Bei Segment-Splitting werden alle verbleibenden Segmente hochgeladen. +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 mein-stream -./stream-recorder.sh stop-all +./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 diff --git a/docs/jobs.md b/docs/jobs.md index 95892e7..a62c59f 100644 --- a/docs/jobs.md +++ b/docs/jobs.md @@ -48,14 +48,18 @@ Verfügbare Vorlagen: Die Dauer kann in verschiedenen Formaten angegeben werden: -| Format | Bedeutung | -|----------|------------------| -| `3600` | 3600 Sekunden | -| `1h` | 1 Stunde | -| `30m` | 30 Minuten | -| `1h30m` | 90 Minuten | -| `2d` | 2 Tage | -| `1d12h` | 36 Stunden | +| 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 diff --git a/stream-recorder.sh b/stream-recorder.sh index f227b4d..7f6a998 100644 --- a/stream-recorder.sh +++ b/stream-recorder.sh @@ -8,15 +8,15 @@ # Web: https://www.cleveradmin.de # Repository: https://git.techniverse.net/scriptos/stream-recorder.git # License: MIT -# Version: v2.7.0 +# Version: v2.8.0 # Date: 07.09.2026 -# Modifications: Segment-Splitting, erweiterter Status, verbessertes Stoppen +# Modifications: Segment-Splitting, erweiterter Status, interaktive Job-Auswahl, Konfig updatesicher ############################################### set -uo pipefail readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -readonly VERSION="2.7.0" +readonly VERSION="2.8.0" # --- Standardwerte (überschreibbar via Konfiguration) --- CONFIG_FILE="${SCRIPT_DIR}/config/stream-recorder.conf" @@ -1053,17 +1053,30 @@ create_job() { echo "Kein Datum angegeben - Zeitplan deaktiviert." sched_enabled="false" else - read -rp "Laufzeit (z.B. 2h, 30m, 2d, 1d12h oder leer=unbegrenzt): " duration_input - if [[ -n "$duration_input" ]]; then - duration=$(parse_duration "$duration_input") - if [[ -n "$duration" && $duration -lt 86400 ]]; then - local start_min end_min end_h end_m + read -rp "Endzeit oder Laufzeit (z.B. 22:00 oder 2h, 30m, 1d12h, leer=unbegrenzt): " end_input + if [[ -n "$end_input" ]]; then + if [[ "$end_input" =~ ^[0-9]{1,2}:[0-9]{2}$ ]]; then + sched_stop="$end_input" + local start_min stop_min diff_min start_min=$(_time_to_minutes "$sched_start") - end_min=$(( start_min + duration / 60 )) - if [[ $end_min -lt 1440 ]]; then - end_h=$(( end_min / 60 )) - end_m=$(( end_min % 60 )) - sched_stop=$(printf "%02d:%02d" "$end_h" "$end_m") + stop_min=$(_time_to_minutes "$sched_stop") + if [[ $stop_min -gt $start_min ]]; then + diff_min=$((stop_min - start_min)) + else + diff_min=$((1440 - start_min + stop_min)) + fi + duration=$((diff_min * 60)) + else + duration=$(parse_duration "$end_input") + if [[ -n "$duration" && $duration -lt 86400 ]]; then + local start_min end_min end_h end_m + start_min=$(_time_to_minutes "$sched_start") + end_min=$(( start_min + duration / 60 )) + if [[ $end_min -lt 1440 ]]; then + end_h=$(( end_min / 60 )) + end_m=$(( end_min % 60 )) + sched_stop=$(printf "%02d:%02d" "$end_h" "$end_m") + fi fi fi fi @@ -1411,6 +1424,60 @@ stop_all() { fi } +select_job() { + local -a job_files=() + local -a job_names=() + local -a job_urls=() + local -a job_stati=() + + for job_file in "${JOBS_DIR}"/*.job; do + [[ -f "$job_file" ]] || continue + load_job "$job_file" 2>/dev/null || continue + + local job_id + job_id=$(basename "$job_file" .job) + local status="bereit" + if is_recording "$job_id"; then + status="läuft" + fi + + job_files+=("$job_file") + job_names+=("$STREAM_NAME") + job_urls+=("$STREAM_URL") + job_stati+=("$status") + done + + if [[ ${#job_files[@]} -eq 0 ]]; then + echo "Keine .job-Dateien gefunden in: ${JOBS_DIR}" + echo "Erstelle einen Job: $(basename "$0") create" + return 1 + fi + + echo "" + echo "Verfügbare Jobs:" + echo "$(printf '=%.0s' {1..50})" + echo "" + + local i + for (( i=0; i < ${#job_files[@]}; i++ )); do + local num=$((i + 1)) + local marker=" " + [[ "${job_stati[$i]}" == "läuft" ]] && marker="* " + printf " %s%d) %-25s [%s]\n" "$marker" "$num" "${job_names[$i]}" "${job_stati[$i]}" + done + + echo "" + read -rp "Job auswählen (1-${#job_files[@]}): " choice + + if [[ ! "$choice" =~ ^[0-9]+$ ]] || [[ "$choice" -lt 1 || "$choice" -gt ${#job_files[@]} ]]; then + echo "Ungültige Auswahl." + return 1 + fi + + local idx=$((choice - 1)) + echo "${job_files[$idx]}" +} + watch_logs() { local log_file="${LOG_DIR}/stream-recorder.log" @@ -1437,12 +1504,12 @@ stream-recorder v${VERSION} - Generischer Stream-Recorder Verwendung: $(basename "$0") [Optionen] [Argumente] Befehle: - record Einzelnen Stream aufzeichnen + record [job] Einzelnen Stream aufzeichnen (ohne Angabe: Auswahl) record-all Alle Jobs aufzeichnen create Neuen Job interaktiv erstellen quick Interaktive Schnellaufnahme (URL eingeben) upload Vorhandene Datei nach Plik hochladen - stop Aufnahme stoppen (Teilaufnahme wird hochgeladen) + 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 @@ -1499,12 +1566,12 @@ main() { case "$command" in record) - if [[ -z "${1:-}" ]]; then - log "ERROR" "Job-Datei oder Job-Name erforderlich" - echo ""; usage; exit 1 - fi local job_file - job_file=$(resolve_job_path "$1") + if [[ -z "${1:-}" ]]; then + job_file=$(select_job) || exit 1 + else + job_file=$(resolve_job_path "$1") + fi if [[ "$FOREGROUND" == "true" || "$VERBOSE" == "true" ]]; then record_stream "$job_file" else @@ -1532,9 +1599,12 @@ main() { scheduler) run_scheduler ;; stop) if [[ -z "${1:-}" ]]; then - log "ERROR" "Job-Name erforderlich"; exit 1 + local job_file + job_file=$(select_job) || exit 1 + stop_recording "$(basename "$job_file" .job)" + else + stop_recording "$1" fi - stop_recording "$1" ;; stop-all) stop_all ;; list) list_jobs ;;