Skript zum konvertieren von Videos in einem überwachten Ordner

  • Im Zuge meines "Da gibts doch eine Lösung mit nem Raspberry pi" - Denkens habe ich inzwischen einen Mediaserver mit Jellyfin, mit dem ich zufrieden bin, und JDownloader, mit dem ich zB Videos herunterlade, die ich dann unterwegs streame...

    Da ich aber häufig auch im Auto streame, brauche ich eigentlich nur das Audio, und Jellyfin findet mp3 besser als (m4a oder .ogg)

    Deswegen würde ich gerne per Script die ankommenden Videos in mp3 umwandeln.

    Ich habe dies gefunden:

    Raspberrypi mp4 zu mp3 konvertieren?
    Hallo! Mit dem Raspi kenne ich mich leider nicht aus. Ich verwende hier nur einen Windows-PC. Versuche es unter Windows mal mit dem Pazera Free Audio…
    www.gutefrage.net

    ffmpeg ist (mit JDownloader vermute ich) installiert, und da jemand im obigen Link ein Script geschrieben hat, habe ich es ausprobiert

    Bash
    #!/bin/bash
    DIR=/home/pi/dir
    FILES=$(find ${DIR} -iname *.mp4)
    
    for FILE in $FILES; do
        FILENAME=$(echo ${FILE} | awk -F '/' '{print $NF}' | sed 's/mp4/mp3/')
        ffmpeg -i $FILE -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 $DIR/$FILENAME ;
    done

    Ich vermute, dass das funktionieren könnte, aber da kommen die Probleme: In den Dateinamen sind häufig Leerzeichen, und darum (?) bekomme ich immer Fehlermeldungen...Oder?
    Wenn man die Zeile, die mit ffmpeg anfängt in einen Kommentar verwandelt und anstattdessen echo $FILENAME da hinschreibt, kommt anstatt des ganzen Namens "mein schönstes Katzen Video" (eventuell mit der Endung mp4 oder, wie im Skript angelegt, mp3) dies

    mein

    schönstes

    Katzen

    Video.mp3

    ..Und es kommt nacheinander die Fehlermeldung, dass keine Datei mit den Wörtern in den einzelnen Zeilen findbar sind. (ich hoffe, man versteht das)

    Es ist also schon vieles richtig, aber eben noch was falsch.

    Offenbar machen die Leerzeichen mir einen Strich durch die Rechnung?


    1. Wie bekomme ich den ganzen filename in eine Zeile? Oder auch: Würde das einen Teil des Problems lösen?

    2. idealerweise müsste wohl geprüft werden, ob die Datei schon konvertiert wurde, dann könnte man die Originaldatei behalten. Sonst ginge sicher auch Löschen...

    3. Was ist mit anderen Dateien wie .wmv oder .m4a - Die würde ich auch gern gleich mitkonvertieren..

    4. An die Überwachung eines Ordners (inklusive Unterordner) nebst den anderen Fragestellungen, die DAMIT zusammenhängen, würde ich mich machen, wenn das Konvertierungsskript steht.


    Es ist NICHT meine Absicht, dass ihr mir ein fertiges Script schreibt - Wenn ihr eins habt, oder so etwas eh vorhabt, dann sehr gern - Am liebsten mit ein paar erklärenden Worten....
    Ich will nicht nur, dass es funktioniert, sondern auch am liebsten das eine oder andere ahaaaaaaaa Erlebnis. Ich habe schon ein paar Skripte (ab)geschrieben, fühle mich aber schon eher als noob.

    Fragen? Gern! Anmerkungen? Threads die ich übersehen habe, die ich lesen könnte/müsste? Suchwörter, auf die ich nicht gekommen bin? Immer gerne her damit :)

    Vielen Dank schon mal fürs Mitdenken!

    Bambo

  • Skript zum konvertieren von Videos in einem überwachten Ordner? Schau mal ob du hier fündig wirst!

  • Ein beliebter Fehler. Variablen gehören, wenn nur die leiseste Vermutung besteht, das besondere Zeichen enthalten sein können, in Anführungszeichen.

    Bash
    #!/bin/bash
    DIR=/home/pi/dir
    FILES=$(find "${DIR}" -iname *.[mM][pP]4)
    
    for FILE in "$FILES"; do
        FILENAME=$(echo "${FILE}" | awk -F '/' '{print $NF}' | sed 's/mp4/mp3/')
        ffmpeg -i "$FILE" -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 "$DIR"/"$FILENAME" ;
    done

    *.mp4 beim find habe ich mal caseinsensiv gemacht. Wilst ja sicherlich auch datei.MP4 bzw datei.Mp4 etc. haben.

    Wenns ner net G'wittern tun tut.

  • Man muss den *.mp4-Teil auch quoten, denn man möchte den ja genau so an find übergeben. Das passiert nicht wenn im aktuellen Verzeichnis Dateien mit dieser Endung liegen sollten, weil das globbing dann ja schon vor dem Aufruf von find greift.

    Dann sind die doppelten Anführungszeichen in Zeile 5 falsch, denn so würden alle Dateinamen als eine Zeichenkette interpretiert und die Schleife wird genau einmal ausgeführt. Das funktioniert also nur solange auch nur ein Dateiname gefunden wird.

    find durchsucht auch Unterverzeichnisse — dieser awk-Ausruck der basename nachbastelt (warum?) sorgt dann dafür das die Ergebnis Dateien alle in $DIR landen. Da sollte man überlegen ob das so soll‽

    Der sed-Aufruf sollte dann vielleicht auch case insensitive sein.

    Kommen wir also zu so etwas, was dann aber wieder Probleme mit Leerzeichen in Dateinamen hat:

    Bash
    #!/bin/bash
    DIR=/home/pi/dir
    FILES=$(find "${DIR}" -iname '*.mp4')
    
    for FILE in $FILES; do  # XXX Das hier kann jetzt wieder nicht mit Leerzeichen in Dateinamen!
        FILENAME=$(basename "${FILE}" | sed 's/mp4/mp3/i')
        ffmpeg -i "$FILE" -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 "$DIR/$FILENAME" ;
    done

    Shell-Skripting ist halt doof.

    Edit: Highlighting korrigiert.

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

    Edited once, last by __blackjack__ (November 6, 2024 at 8:55 AM).

  • Hier mal ein Versuch das in Python zu lösen (ungetestet):

    Das prüft auch ob die Zieldatei bereits existiert.

    fred0815 Ja genau Woltlab ist Schuld. Es hat mir das gewohnheitsmässig ausgewählte „Python“ einfach so geglaubt. 😀

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • Also für MEINE Zwecke (meist youtube Videos) sind die Leerzeichen im Dateinamen unumgänglich, aber ich könnte mich damit arrangieren, nur eine .mp4 Datei in dem Ordner zu haben, was der häufigste Fall sein wird.

    Gestern beim Testen kam noch ein weiteres Dateiformat: .mkv, es gibt ja auch noch .avi...

    Kann man die verschiedenen Endungen da einpflegen?

    Wäre es nicht schlauer (von mir), die zB bei youtube mit heruntergeladenen Audiodateien, also .m4a, .opus, .ogg, usw zu konvertieren?

    160k sind natürlich totaler overkill, 128 reichen völlig, eventuell sogar noch weniger... Das ist meist Sprache, die ich genau einmal abhöre..

    Und... Python.... DA machste ja n Fass auf.. Ich wage diesen Schritt immer nur, wenn ich Hilfe hier im Forum in Anspruch nehme.. Beim Shell-Scripting kann ich "an euch vorbei" zb Dateien mit anderen Endungen, wie zB Untertiteldateien, einfach löschen, in Python muss ich mich eieieieieieinlesen.

    Ich bin super dankbar für eure Gedanken!

  • Bamboleate Ich sehe Python ja nicht so wirklich als grösseres Fass, weil das eine Sprache ist. Bei Shell-Skripten hat man die Shell selbst mit ihren teilweise komischen und überraschenden Regeln und im Grunde ausschliesslich Zeichenketten als Daten”struktur”, die dann noch nicht mal alle Zeichen enthalten dürfen, weil die in verschiedenen Kontexten verschiedene Bedeutungen haben, und lernt dann noch die Komplexität von find, und Sprachen/Syntax von awk, sed, und was sonst noch zusätzlich dazu. Da muss man sich doch auch einlesen und einarbeiten.

    Das ganze mal mit mehreren Endungen:

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • Bash
      File "AOW3.py", line 20
       *("-i", source_path),
       ^
    SyntaxError: invalid syntax

    Danke __blackjack__ - Jetzt bin ich shell-Banause eben aufgeschmissen. Ich finde es toll, dass du mir ein Python Skript geschrieben hast, und vielen Dank, aber ich muss dich schon wieder bemühen...

    Du hast ja recht, Python sieht immer toller aus, als die Shell skripte.. Aber ich habe irgendwie Angst, gebissen zu werden... Offenbar.

    Danke bis hierhin und darüber hinaus!

    Und jetzt der Nachtrag: ChatGPT hat mir geholfen. Ich bin einer, der menschliche Interaktion bevorzugt. Aber... Was soll ich sagen....

    ChatGPT hat dein Programm/Skript gelobt, Blackjack, aber der * ist irgendwie falsch, und richtig muss es heißen:

    Tja. Ohne die Sterne.

    Edited 2 times, last by Bamboleate: Neue Erkenntnisse (November 7, 2024 at 1:05 AM).

  • simonz Das macht jetzt aber nicht mehr das gleiche, das heisst die Ergebnisdateien landen dann an anderer Stelle sofern sie nicht direkt in INPUT_PATH liegen ([492] vs. [493] in der Shell-Sitzung weiter unten). Und das INPUT_PATH da noch enthalten ist, macht auch keinen Sinn, denn rglob() liefert absolute Pfade — da ”gewinnt” immer der Teil nach dem / und INPUT_PATH hat keinen Einfluss auf das Ergebnis (vergleiche [490] und [493]):

    Bamboleate Das kann nicht sein mit dem Syntaxfehler. Ich vermute mal Du hast das aus versehen versucht mit Python 2 auszuführen. Das älteste Python das ich hier noch auf dem Rechner habe ist 3.6 und selbst damit geht das:

    Python
    Python 3.6.9 (default, Mar 10 2023, 16:46:00) 
    [GCC 8.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> [1, *(2, 3), 4]
    [1, 2, 3, 4]
    >>> 

    Eingeführt wurde die Syntax in Python 3.5 und dafür endete die reguläre Unterstützung vor 9 Jahren.

    „All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman

  • Quote

    Ich vermute mal Du hast das aus versehen versucht mit Python 2 auszuführen.

    Who's the goose? ME!

    Als ChatGPT mir vorgeschlagen hatte, die Sterne wegzulassen, war "pathlib" nicht verfügbar, und ich habe dann auf python3 umgeschaltet; Ich habe nicht mitbedacht, dass das auch auf die Syntax auswirkungen haben kann... Es macht alles Sinn...

    So ne noob bin ich also, ich treibe den Teufel mit dem Beelzebub aus. Unwissentlich.

    Durch explizit deine Hilfe, Blackjack, und all die anderen, bin ich sogar unter der Woche in der Lage mein Projekt zum Laufen zu bekommen, aber das eigentliche Nachvollziehen muss ich am Wochenende machen...

    VIELEN DANK, ihr habt mir unheimlich geholfen, und neben alldem, was ich so nebenbei aufgeschnappt habe, werde ich am Wochenende noch einmal nen Erkenntnisturbo anschmeissen.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!