Tvheadend Aufnahmen TS-Streams automatisiert konvertieren und aufräumen.

ceee

Benutzer
Mitglied seit
29. Sep 2011
Beiträge
74
Punkte für Reaktionen
6
Punkte
8
Hallo zusammen,

ich habe grundlegende Programmierfähigkeiten, kenne mich mit Shell Scripts aber überhaupt nicht aus. Ich wollte schon länger eine Lösung haben die Aufnahmen von TVheadend von TS zu mp4 zu konvertieren um Platz zu sparen. Ich hab gehört, dass man mit ChatGPT sich schöne Shellscripte zusammenbauen kann, das hab ich probiert. Und ich finde das Ergebnis nach einem langen und sehr lehrreichen Gespräch mit dem Chatbot echt super.

konvertiere.sh
TVheadend erzeugt in der Standardkonfig pro Kanal einen Unterordner. Das Script startet ab dem Verzeichnis in dem die Unterordner angelegt werden, das heisst bei mir "aufnahmen" repliziert die Struktur in einem parallelen Verzeichnis "konvertiert", welches neben "aufnahmen" liegt und konvertiert alle TS, die es findet in den entsprechenden Ordner in der neuen Struktur. Gibt es die mp4 Datei schon wird die konvertierung der Datei übersprungen. Wird die TS gerade geschrieben, wird die konvertierung der Datei übersprungen.

Man kannn das also schön alle 24h mal laufen lassen.

cleanup.sh
Hier wird aufgeräumt. Das Script startet ab dem Verzeichnis "konvertiert" und sucht in allen Unterverzeichnissen nach mp4 Dateien. Findet es die zugehörige TS-Datei im Aufnahme-Ordner wird diese gelöscht. Ist das Verzeichnis dann leer, wird auch dieses gelöscht. Wird die MP4 gerade geschrieben (duch das andere Script) wird das Löschen der TS übersprungen.

Bei der Verwendung im Aufgabenplaner nicht vergessen erst zum Startverzeichnis zu wechseln vorm Aufruf des Scripts.

konvertiere.sh
Bash:
#!/bin/ash

# Verzeichnis für konvertierte Dateien erstellen, wenn es nicht existiert
output_dir="../konvertiert"
if [ ! -d "$output_dir" ]; then
    mkdir "$output_dir"
fi

# Funktion zum Erstellen des Ausgabeverzeichnisses für die aktuelle Datei
create_output_folder() {
    local file="$1"
    local folder_name="$(basename "$(dirname "$file")")"

    # Ordner für die aktuelle Datei erstellen (falls nicht vorhanden)
    mkdir -p "${output_dir}/${folder_name}"
}

# Funktion zum Verarbeiten von Dateien
process_file() {
    local file="$1"
    local folder_name="$(basename "$(dirname "$file")")"
    local output_file="${output_dir}/${folder_name}/$(basename "$file" .ts).mp4"

    # Überprüfen, ob die Zieldatei bereits existiert
    if [ -e "$output_file" ]; then
        echo "Die Zieldatei '$output_file' existiert bereits. Überspringe Umwandlung von $file."
    else
        # Überprüfen, ob das Dateidatum der letzten Änderung kleiner als 5 Minuten ist: Das passiert dann, wenn die Aufnahme gerade läuft.
        local last_modified=$(stat -c %Y "$file")
        local current_time=$(date +%s)
        local time_difference=$((current_time - last_modified))

        if [ "$time_difference" -lt 60 ]; then
            echo "Das Dateidatum der letzten Änderung von $file ist weniger als 1 Minute. Überspringe Umwandlung."
        else
            # Ausgabeverzeichnis für die aktuelle Datei erstellen
            create_output_folder "$file"

            # Log-Nachricht für den Start der Umwandlung
            echo "Starte Umwandlung von $file..."

            # ffmpeg-Aufruf für die Umwandlung
            /volume1/@appstore/ffmpeg6/bin/ffmpeg -i "$file" -c:v libx264 -preset medium -c:a aac -b:a 192k -movflags +faststart -threads 2 -crf 23 -loglevel fatal "$output_file"

            # Log-Nachricht für das Ende der Umwandlung
            echo "Umwandlung von $file abgeschlossen."
        fi
    fi
}

# Funktion zum Durchsuchen von Dateien und Unterverzeichnissen
process_directory() {
    local dir="$1"
    for entry in "$dir"/*; do
        if [ -f "$entry" ]; then
            if [ "${entry##*.}" = "ts" ]; then
                process_file "$entry"
            fi
        elif [ -d "$entry" ]; then
            process_directory "$entry"
        fi
    done
}

# Aktuelles Arbeitsverzeichnis speichern
current_dir="$(pwd)"
echo "$current_dir"
# Durchsuche alle Dateien und Unterverzeichnisse im aktuellen Verzeichnis
process_directory "$current_dir"

# Log-Nachricht für das Ende des Skripts
echo "Umsetzung abgeschlossen."

cleanup.sh (wollte es aufräumen nennen, kein Plan ob Umlaute Probleme machen)
Bash:
#!/bin/ash

# Ausgabeverzeichnis für konvertierte Dateien
output_dir="../konvertiert"
# Eingabeverzeichnis für ursprüngliche TS-Dateien
input_dir="../aufnahmen"

# Funktion zum Löschen der zugehörigen ts-Datei
delete_original_ts() {
    local mp4_file="$1"
    local mp4_basename="$(basename "$mp4_file")"
    local dir_name="$(dirname "$mp4_file")"
    local ts_file="${input_dir}/${dir_name##*/}/${mp4_basename%.mp4}.ts"
    local ts_dir="$(dirname "$ts_file")"

    # Überprüfen, ob die zugehörige ts-Datei existiert
    if [ -e "$ts_file" ]; then
        # Überprüfen, ob die mp4-Datei in den letzten 5 Minuten nicht geändert wurde. Das ist dann der Fall, wenn die Datei vom Konvertioeren Script aktuell geschrieben wird. Dann die TS Natürlich nicht löschen.
        local last_modified=$(stat -c %Y "$mp4_file")
        local current_time=$(date +%s)
        local time_difference=$((current_time - last_modified))

        if [ "$time_difference" -lt 300 ]; then
            echo "Warnung: Die mp4-Datei '$mp4_file' wurde in den letzten 5 Minuten geändert. Überspringe Löschvorgang."
        else
            # ts-Datei löschen
            rm "$ts_file"
            echo "Lösche ts-Datei '$ts_file', da die zugehörige mp4-Datei vorhanden ist."
             # Überprüfen, ob das Verzeichnis jetzt leer ist bzw, nur noch @eaDir enthält
             if [ "$(ls -A "$ts_dir" | grep -v '^@eaDir$' | wc -l)" -eq 0 ]; then
                # Verzeichnis ist leer, löschen
                rm -rf "$ts_dir/@eaDir"
                echo "Das Verzeichnis '$ts_dir' ist jetzt leer. Um es löschen zu können wird '$ts_dir'/@eaDir gelöscht."
                rmdir "$ts_dir"
                echo "Das Verzeichnis '$ts_dir' ist jetzt leer und wurde gelöscht."
            fi
         fi
    #else
        #echo "Warnung: Die zugehörige ts-Datei '$ts_file' für '$mp4_file' wurde nicht gefunden."
    fi
}

# Funktion zum Durchsuchen von Dateien und Unterverzeichnissen
process_directory() {
    local dir="$1"
    for entry in "$dir"/*; do
        if [ -f "$entry" ]; then
            if [ "${entry##*.}" = "mp4" ]; then
                delete_original_ts "$entry"
            fi
        elif [ -d "$entry" ]; then
            process_directory "$entry"
        fi
    done
}

# Durchsuche alle Dateien und Unterverzeichnisse im Ausgabeverzeichnis
process_directory "$output_dir"

echo "Aufräumvorgang abgeschlossen."

Vielleicht kann es ja einer brauchen.

Chris
 
  • Like
Reaktionen: dil88


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat