[gelöst] Scripts in reccmds.conf

  • Hallo Leude,


    mal eine Frage zu einem Problem mit dem Scripting aus reccmds.conf heraus.

    Folgendes Kommando soll aus der reccmds.conf ausgeführt werden:


    /usr/local/bin/convnow.sh vdrcutter


    Dabei wird dann ja vom VDR der Aufnahmename als weiterer Parameter mitgegeben.

    Der Name der Aufnahme in meinem Problemfall war:


    /video/Das_Phänomen_"Blade_Runner"/2023-10-08.21.55.5-0.rec


    Nur werden leider die "Tüddelchen" beim Aufruf von /usr/local/bin/convnow.sh durch die shell wegoptimiert, da die ja diese Zeichen selbst interpretiert als Parameterabgrenzungen.

    Der nachgeschaltete Cutter bekommt dann natürlich einen nicht existierenden Aufnahmename und verweigert die Arbeit.


    Wie kann man das lösen? (workaround ist natürlich die Aufnahme vorher manuell umzubenennen - ist aber unschön X( )


    gruß

    msv

  • Code
    /usr/local/bin/convnow.sh vdrcutter "$1"

    hast Du schon probiert?


    Kommt das Script "/usr/local/bin/convnow.sh" mit diesem Namen zurecht, wenn er direkt übergeben wird?

    Also funktioniert

    Code
    /usr/local/bin/convnow.sh vdrcutter '/video/Das_Phänomen_"Blade_Runner"/2023-10-08.21.55.5-0.rec'

    ?

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Probiere mal


    x() { /usr/local/bin/convnow.sh "$1"}; x


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Ja, das sind alles Versuche, die in einem Shellscript passen könnten. Im Vdr werden aber die einzelnen Zeilen der reccmds.conv zeilenweise eingelesen und dann mit dem Aufnahmenamen ergänzt. Das wäre dann ein Parameter der im entsprechenden Script dann aufgefangen werden kann. In meinem Fall also als $2 in convert.sh. $1 ist der von mir angegeben Parameter "vdrcutter". Ich habe leider keinen Einfluss darauf, wie der Aufnahmename im Aufruf angegeben wird und wie dann der Gesamte Aufruf meines Scripts gestartet wird. Das ist "vdr-Magic".


    Wahrscheinlich muss man als Post-Record-Command doch mal eine "Normalisierung" der Dateinahmen machen und alles rauschmeißen, bzw sinnvoll ersetzen, was den gängigen Dateinamensregeln widerspricht.


    gruß

    msv

  • Wer vielleicht hilfreich das Skript mal zu posten, schließlich spielt sich ja darin die entsprechende Aktion ab.

    Gruß utiltiy



    VDR Projekte VDR Projects

  • Nö, das wäre nicht hilfreich. Was in meinem Script passiert ist ja erst nachgelagert. Das Problem ist, dass nicht das im Script ankommt, was eigentlich reingesteckt wird. Das Script läuft innerhalb einer Shell (#!/usr/bin/ksh). Und diese Shell macht die Tüddelchen platt. Also muss die Lösung schon vor der Übergabe erfolgen (escapen, quoten...). Aber das müste der vdr machen...

  • diese Shell macht die Tüddelchen platt

    Da gibts lt. Arbeitskollege "Unix-Guru" eine Einstellung, die das shell- oder user-weit unterbindet.
    Da kann auch eingestellt werden, dass zB * nicht aufgelöst wird, bevor der/die Parameter übergeben wird.

    Aber natürlich habe ICH mir den Namen nicht gemerkt :wand

    MyVDR: yaVDR-Ansible (Ubuntu 20) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Wie isses denn mit "${@}"?


    Code
    for I in "${@}"
    do
       echo "Param: $I"
    done
  • Da gibts lt. Arbeitskollege "Unix-Guru" eine Einstellung, die das shell- oder user-weit unterbindet.
    Da kann auch eingestellt werden, dass zB * nicht aufgelöst wird, bevor der/die Parameter übergeben wird.

    Aber natürlich habe ICH mir den Namen nicht gemerkt :wand

    meinst du "set noglob"?

  • Ja oder "$GLOBIGNORE" oder so was ähnliches wars. Bin nur nicht sicher, ob das hier helfen würde.

    MyVDR: yaVDR-Ansible (Ubuntu 20) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • das problem ist aber, das das alles nur unterhalb der aufgerufenen shell wirken könnte. Die shell des scripts wird aber durch vdr gestartet und da kann ich vorher nix mitgeben. Außerdem zeigt die ksh docu, das hiermit zwar irgendwelche metacharacter geglobt werden. Nur nicht Doppeltüttelchen. Die sind Bestandteil des shell-processings, außer man kann die vorher (hier im vdr ) escapen.

  • Wahrscheinlich muss man als Post-Record-Command doch mal eine "Normalisierung" der Dateinahmen machen und alles rauschmeißen, bzw sinnvoll ersetzen, was den gängigen Dateinamensregeln widerspricht.

    Oder schon vorher mit --vfat

  • Ich glaube, ich habe eine für mich akzeptable Lösung gefunden:


    In meinem convnow-script werde ich über den basename des Aufname Parameters den wirklichen Aufnahmenamen finden. Dann kann ich selber weiter escapen


    Code
    #!/usr/bin/ksh
    set -x
    f=$2
    
    
    echo $(find /video/ -name $(basename $f))

    das gibt mir den Namen mit Tüddelchen zurück.


    Danke fürs Mitdenken :thumbup:

  • msv

    Hat den Titel des Themas von „Scripts in reccmds.conf“ zu „[gelöst] Scripts in reccmds.conf“ geändert.
  • Ich dachte bislang "Doppeltüttelchen" sind in Dateinamen unzulässig, aber das ist anscheinend nicht so.

    ls quotet die fraglichen Dateinamen bei der Ausgabe übrigens mit '.


    Angeblich macht der VDR das genau so:

    Code
    The file reccmds.conf 
    [...]
    When executing a command, the directory name of the recording will be appended to the command string, separated by a blank and enclosed in single quotes.

    Die " sollte also eigentlich beim Skript ankommen.


    Oder schon vorher mit --vfat

    Bzw.: --dirnames=,,1.


    das problem ist aber, das das alles nur unterhalb der aufgerufenen shell wirken könnte. Die shell des scripts wird aber durch vdr gestartet und da kann ich vorher nix mitgeben.

    Umgebungsvariblen kannst du auch vor dem Start des VDR setzen.

    Die sollte eigentlich überleben.

    Gruss
    SHF


  • ja, das mit Einschließen in Einfachtüddel mag zwar gehen. Aber auch das findet man in den Namen der Aufnahmen. Wenn jetzt die Sender erst mal das Gender-Sternchen in die Sendungstitel reinbringen wirds bestimmt noch lustiger. vdr versucht ja das alles 1:1 als Verzeichnisnamen auf die Platte zu schreiben.

  • Aber auch das findet man in den Namen der Aufnahmen.

    ls quotet dann mit ".

    Bei einer Kombination von beiden wird es aber eng.

    Da verschwinden die Anführungszeichen oder ich kann das Verzeichnis nicht erstellen.


    vdr versucht ja das alles 1:1 als Verzeichnisnamen auf die Platte zu schreiben.

    Deswegen verwende ich schon seit "immer" --dirnames=,,1.

    Die problematischen Zeichen werden da "encoded as hex values" gespeichert.

    Das lässt sich recht einfach finden und entfernen. Derartige Zeichen will ich eh nicht in konvertierten Aufnahmen haben.

    Gruss
    SHF


  • das problem ist aber, das das alles nur unterhalb der aufgerufenen shell wirken könnte. Die shell des scripts wird aber durch vdr gestartet und da kann ich vorher nix mitgeben. Außerdem zeigt die ksh docu, das hiermit zwar irgendwelche metacharacter geglobt werden. Nur nicht Doppeltüttelchen. Die sind Bestandteil des shell-processings, außer man kann die vorher (hier im vdr ) escapen.

    Naja, doch - GLOBIGNORE Variable ins VDR Environment setzen, oder?

  • Hier nochmal meine Lösung (convnow.sh) des Problems:


    Damit bekomme ich dann den richtigen Dateinamen. Da es auch vorkommen kann, dass der "find" mehrere Directories findet (ungeschnittene oder geschnittene, bzw mehrfach geschnittene) ist die Schleife notwendig um das richtige Verzeichnis zu finden. Naja, 100%ig sicher ist das natürlich auch noch nicht falls da jemand (Ich? :wand ) händisch noch irgendwelche Umbenennungen oder Kopien im Filesystem gemacht haben sollte.


    Weiter hinten kommt dann noch das hier,

    Code
                    FNAMENEW=$(echo ${FNAME}|sed \
                           -e "s/'/\\\'/g" \
                           -e 's/\"/\\\"/g' \
                           -e "s/(/\\\(/g" \
                           -e "s/)/\\\)/g" \
                           -e "s/&/\\\&/g")

    bevor ich das Ganze per ssh an meinen Server übergebe. Der macht dann die Arbeit (z.B. Schneiden, Verschieben, MP3-Files aus Musikaufnahmen machen, etc)

    Kann man bestimmt auch alles ganz anders machen, aber ich mags so!


    gruß

    msv

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!