Aufnahmen nach Länge "sortieren"

Wir haben aktuell ein Problem mit dem Board und arbeiten an der Lösung...

UPDATE: Das Problem scheint behoben, wir beobachten das noch :)
  • Hallo zusammen,


    Ich suche schon seit einiger Zeit nach einer Lösung, wie ich meine Aufnahmen nach Länge sortieren kann. Bis jetzt scheint noch kein Plugin das zu können, und da meine 7025 nicht mehr weiter betreut wird, habe ich den Schritt gewagt und selbst probiert ein Skript zu schreiben, das die Aufgabe erledigt.


    Die Idee ist, die Laufzeiten in Tags zu schreiben, und dann nach Tags zu filtern. Das ist zwar kein echtes Sortieren, hilft mir aber schon wesentlich weiter, da ich meine Filmliste auf die Aufnahmen beschränken kann, die ungefähr die Länge haben, für die ich in dem Moment Zeit habe.


    Mein Skript holt sich mit sed die Laufzeit aus der 6. Zeile der .meta Datei, rechnet die Zeit in Minuten um und rechnet noch den Vor- und Nachlauf einer Aufnahme (10 Minuten) heraus. Dann wird ermittelt in welches Zeitfenster diese Länge passt und die Angabe wird dann wieder in die .meta Datei in die 5. Zeile zurückgeschrieben. Somit habe ich ein Tag mit einer Minuten Angabe.


    Das Skript läuft gut, solange ich nur auf eine .meta Datei zurückgreifen möchte. Sobald ich es auf mehr als eine Datei anwenden möchte, bekomme ich eine Fehlermeldung. Soweit ich das bis jetzt interpretieren kann (als absoluten Anfänger), wird mit dem Skript nicht jede Datei einzeln abgearbeitet, sondern die 6. Zeile aus jeder .meta Datei eingelesen und auf die Variable "$x" gelegt. Dadurch schlägt die Berechnung fehl.


    Anbei der Code, wie ich ihn für eine Datei erfolgreich anwenden konnte:


    Jetzt suche ich schon seit einer Woche nach einer Lösung, komme aber nicht weiter. Also wende ich mich an die Experten hier im Forum.


    Ich habe auch schon eine Alternative mit find und xargs ausprobiert. Da bekomme ich zumindest die Zeitangaben aus den .meta Dateien in jeweils einer Zeile angezeigt (bzw. lege mir die in einer Datei ab). Aber da komme ich dann mit der Berechnung nicht mehr weiter.


    Für Anregungen bin ich dankbar, gerne auch nur in Stichwörtern, damit ich mir die Lösung selber zusammen suchen muss und so noch etwas dabei lernen kann. Aber bitte Anfänger freundlich, damit ich auch verstehe was ihr meint :winking_face:


    Vielen Dank im voraus!

  • du hast da einen syntaxfehler, müsste $x heissen damit die variable x verarbeitet werden kann


    Code
    y=$(((x/5400000)-10))


    wie versuchst du mehrere .ts.meta gleichzeitig abzuarbeiten? z.B. mit ls /hdd/movie/*.meta


    dann wird sein, dass bei jedem Leerzeichen pro Dateiname eine neue Zeile zum abarbeiten einelesen wird - d.h. die Dateinamen stimmen dann nicht mehr. Das kann man mit dieser Zeile vor der for Schleife umgehen


    Code
    IFS=$'\012'


    dann wird der Dateiname richtig eingelesen und abgearbeitet (und nicht bei jedem Leerzeichen getrennt)


    Zur Veranschaulichung ein kleines Script, dass alle Aufnahme.ts.meta in einem beliebigen Ordner listet, dann wird der Aufnahmenahme + korrigierte Laufzeit + Zeitfenster erstellt und in einer Liste ausgegeben (030, 060 wg. der korrekten Sortierung, wenn erwünscht).


    /usr/script/recfilter.sh


    beim Scriptaufruf den gewünschten Folder angeben - wichtig der "/" am Ende des gewünschten Verzeichnisses
    z.b.


    /usr/script/recfilter.sh /media/hdd/movie/


    Man kann bereits beim Scriptaufruf filtern, ohne die .meta zu "bearbeiten"


    man hat eine Stunde Zeit, also kann man alle Aufnahme bis 60 Minuten sehen, bzw. auch zwei mit bis 30 Minuten


    /usr/script/recfilter.sh /hdd/movie/ | grep "F=030\|F=060" | sort


    vielleicht hilft dir das mal weiter ..

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox


    Einmal editiert, zuletzt von Fred Bogus Trumper ()

  • Vielen Dank für deine Nachricht.


    Zitat


    du hast da einen syntaxfehler, müsste $x heissen damit die variable x verarbeitet werden kann


    Code
    y=$(((x/5400000)-10))


    Im Prinzip schon. Ich glaube aber gelesen zu haben, dass das bei neueren bash versionen auch ohne $ geht. Bei nur einer Datei wurde auch ohne $x richtig berechnet.



    Zitat


    wie versuchst du mehrere .ts.meta gleichzeitig abzuarbeiten? z.B. mit ls /hdd/movie/*.meta


    Das habe ich über

    Code
    for a in "*.ts.meta"


    versucht zu regeln. Ich wollte das Skript im Aufnahmeverzeichnis aufrufen, dann wären alle .meta Dateien in dem Verzeichnis in Frage gekommen. Durch die " " Zeichen wollte ich das Problem mit den Leerzeichen umgehen. Was auch bei nur einer Datei geklappt hat.



    Zitat


    dann wird sein, dass bei jedem Leerzeichen pro Dateiname eine neue Zeile zum abarbeiten einelesen wird - d.h. die Dateinamen stimmen dann nicht mehr. Das kann man mit dieser Zeile vor der for Schleife umgehen


    Code
    IFS=$'\012'


    dann wird der Dateiname richtig eingelesen und abgearbeitet (und nicht bei jedem Leerzeichen getrennt)


    Das konnte ich bei meinem Test leider nicht nachvollziehen. Die Dateinamen werden mit dem \012 Code so abgearbeitet, dass nicht nur die Leerzeichen beim Datum und der Uhrzeit in dem Dateinamen einen Zeilenumbruch provozieren, sondern auch noch die 0, 1 und 2 in einem Datum nicht mehr auftauchen.


    Aus den Aufnahmen
    20080305 2250 - VOX - BBC Exklusiv.ts.meta
    20081028 2055 - ARTE - BEING W _ DANS LA PEAU.ts.meta


    wird nach den Zeilen

    Code
    for a in $(ls $1*.meta)
    do
      NAME=$(echo "$a" | awk -F '-' '{print $3}'| sed 's/.ts.meta//g')
    echo $a
    echo $NAME


    folgendes:





    8


    3


    5




    5


    - VOX - BBC Exklusiv.ts.meta
    /home/datti/Desktop/
    BBC Exklusiv





    8






    8




    55 - ARTE - BEING W _ DANS LA PEAU.ts.meta
    BEING W _ DANS LA PEAU


    Die Dateinamen können von sed leider nicht mehr eingelesen werden, ich bekomme als Fehler
    sed: read error on /home/datti/Desktop/: Is a directory


    (ich teste auf meinem Desktop, und nicht auf der Dreambox, um die bestehenden Aufnahmen nicht zu zerstören. Auch nach einigem Suchen und testen bekomme ich es nicht hin, dass die Dateinamen richtig übernommen werden. Die Leerzeichen stellen immer ein Problem dar, ich finde die Ursache aber leider nicht. Daher habe ich die Dateien zum testen mal angehängt.


    Ansonsten verstehe ich dein Script, das entspricht genau dem was ich vorhatte, ohne die .meta Dateien anzutasten. Gute Idee! Aber leider komme ich noch nicht an die Stelle, an der berechnet wird :frowning_face:


    Eine andere Herangehensweise die ich ausprobiert habe war

    Bash
    #!/bin/sh
    
    
    IFS=$'\'
    Dauer=$(find /home/datti/Desktop/ -name "*.meta" -print0 | xargs -0 -L1  sed -n '6p')
    echo $Dauer


    Ich bekomme die 6. Zeile ausgegeben, für jede .meta Datei auf meinem Desktop wird die Laufzeit aus der .meta Datei in jeweils einer Zeile angegeben. Für meine beiden Beispieldateien wäre das:
    372556800
    728697600


    Aber beim weiteren Berechnen komme ich dann nicht mehr weiter.

    Code
    Minuten=$($Dauer/5400000-10)
    echo $Minuten


    Das gibt mir wieder eine Fehlermeldung:
    372556800
    728697600/5400000-10: not found


    Den Code habe ich mit mehrern Klammern und "" '' probiert, aber ohne Erfolg.


    Ich taste mich langsam weiter, aber ohne Hilfe bin ich wieder am Ende meiner Fähigkeiten angekommen... ich freue mich also schon auf Vorschläge....

  • Wo führst du das script aus? Direkt auf der DM7025 oder am Linux-PC? Ich habe mein Beispielscript direkt auf der DM7020HD laufen lassen - aber funktionierte auch auf Anhieb ohne Fehler auf der DM7025.


    Am Linux PC hast du es wahrscheinlich mit bash laufen lassen, im OE1.6 läuft glaube ich nur sh - bash und sh unterscheiden sich etwas. Versuch mal am PC das script mit sh
    (#!/bin/sh)



    das folgende script habe ich auf der DM7025 gestestet.
    Habe deine beiden Meta Dateien nach /tmp geschoben (das script sucht die meta in /tmp) und macht dann das, was du willst. Also liest die Dauer aus, rechnet sie in Minuten - 10 Minuten um, ermittelt den TAG (z) und schreibt diesen in die meta in Zeile 5


    /tmp/metatest.sh


    sieht dann so aus:


    wenn du es am PC machen willst, wird die Syntax je nach shell etwas abweichen. Sonst vielleicht das ganze script posten und wo es laufen soll


    PS:
    ich würde das script auf der Box laufen lassen, dann kannst du per cronjob in regelmäßigen Abständen die Tags erstellen und vielleicht so steuern, dass nur die meta bearbeitet werden, die seit dem letzten Druchlauf neu hinzugekommen sind - dann brauchst du nicht immer manuell die "neuen" Aufnahmen raussuchen ...


    und wenn die .meta am Linux PC oder NAS udgl. liegen, einfach auf die Box mounten und das script im mountdirectory nach den .meta suchen.

    Gruß Fred


    Die Dreambox ist tot, es lebe die Dreambox


    3 Mal editiert, zuletzt von Fred Bogus Trumper ()

  • Wieder was gelernt: Linux ist nicht gleich Linux :winking_face:


    Ich habe das Script auf einem Ubuntu Rechner geschrieben und getestet, jetzt weiss ich dass das so nicht klappt :winking_face:


    Aber natürlich wollte ich das Script am Ende schon auf der Dream ausführen, wahrscheinlich als Cronjob. Ausserdem wollte ich es noch soweit ausbauen, dass nicht jedesmal alle Dateien neu eingelesen werden, sondern nur die Dateien die noch kein Tag haben. So werden jeweils nur die neuen Aufnahmen erfasst.


    Die If, Then, Else Schleife kriege ich bestimmt eingebaut. Das dürfte das kleinste Problem sein.


    Danke für die Hilfe, ich teste das mit sh auf dem Ubuntu Rechner und natürlich auf der Dream! Wenn ich dennoch Fragen habe, weiss ich jetzt am wen ich mich wenden kann.