edEIT - EIT Editor

  • Über eine DLL könnte ich auch nachdenken. Ich hab' mal angefangen aus Neugierde edEIT nach C# zu portieren...


    Du könntest aber sicher auch mit Qt eine externe .exe ausführen und die Ergebnisse davon - in welcher Form auch immer - in deinem Programm weiter verarbeiten.

    C# ist ja auch .NET, müsste erst probieren ob ich das dann unter C++ einbinden kann oder ob man da erst das .NET framework installieren müsste...


    Das mit der externen *.EXE geht klar. Ist nur die frage wie man das mit der Ergebnisrückgabe gestaltet und wie performant das ist wenn ich ein paar tausend EIT Dateien indexiere und entsprechend oft die EXE starte. Schreibt Dein Programm dann irgendwohin eine XML Datei müsst ich die dann erst wieder öffnen und löschen nach dem einlesen. Das würde nicht nur langsam werden, sondern auch nicht sonderlich materialschonend wegen der ständigen Datei- und Schreibzugriffen. Bevorzugen würde ich da dann generell die Rückgabe eines langen Strings in XML oder JSON form, ohne zwischenschritt über eine Datei.


    Also zumindest für mich denke ich würde es sich nicht lohnen irgendwelche Anstrengungen in der Richtung zu unternehmen. Das behagt mir vom Gedanken her so wenig das ich es doch lieber weg lasse und mich weiter auf den Dateinamen beschränke. Trotzdem herzlichen Dank für das laut drüber nachdenken. :)

  • Jupp, ich gehe davon aus, dass .net installiert sein muss.


    Die CLI Version ginge auch ohne Schreiben einer Ergebnisdatei. Sie könnte auch einfach das Ergebnis in Textform ausgeben, was dann von dir abgefangen werden müsste.


    Wenn Du magst, dann kann ich dir eine kleine .exe erstellen, das ein "Hello world" als Text ausgibt. Damit könntest du testen, ob du die exe einbinden und das Ergebnis abfangen kannst.

    Grüße
    ...jp


  • Wenn Du magst, dann kann ich dir eine kleine .exe erstellen, das ein "Hello world" als Text ausgibt. Damit könntest du testen, ob du die exe einbinden und das Ergebnis abfangen kannst.

    Das wäre super und ein Versuch wert.


    Ich könnte dann quasi später mal Dein edEIT mit dem Dateinamen als Parameter starten, Dein Programm startet unsichtbar im Hintergrund, öffnet die EIT und gibt beim direkt darauf folgenden schließen den Inhalt beispielsweise als JSON String zurück. So Dein Gedanke?


    Hört sich wenn es funktioniert auch nach einer brauchbaren Lösung für Python Skripte an. :)

  • Quick & Dirty


    Die angehängte Datei enthält eine clitest.exe.


    Ohne Parameter wird einfach nur "Hello Word" ausgegeben.
    Du kannst aber auch eine Anzahl als Parameter mitgeben, dann wird die Zeile "Hello World" so oft ausgegeben, wie als Parameter angegeben.


    clitest = 1 Zeile
    clitest 5 = 5 Zeilen


    Damit kannst Du auch testen, ob du auch die Ausgabe mit mehreren Zeilen abfangen kannst.

    Files

    • clitest.zip

      (4.02 kB, downloaded 50 times, last: )

    Grüße
    ...jp

  • Jupp, hat funktioniert. Hat aber erschreckend lange gedauert bis ich das Ergebnis Deiner CLI auch auslesen konnte. Starten war kein Problem... :S


    Im Prinzip wäre für mich das optimum wenn Dein Programm mit bestimmtem Parameter aufgerufen einfach eine JSON in der compact Darstellung zurückgibt. Das ist dann komplett ohne Zeilenumbruch. Und laut Onkel Google kann Python auch mit JSON umgehen.

  • Dann definiere bitte genau, was für Parameter benötigt werden und welche Daten genau aus der .eit zurückgegeben werden sollen.
    Gib' dir bitte Mühe das Ganze so genau wie möglich zu erläutern.


    Idealerweise nimm' eine eit und baue daraus (händisch?) eine JSON zusammen wie es du dir vorstellst.
    Beides lädst du dann hier hoch und ich werde sehen, ob ich das so umsetzen kann.
    Fang' vielleicht mit den Basics (= wichtigste Infos aus der .eit). Später können wir es noch ergänzen.


    Falls mehrere .eits in einem Rutsch verarbeitet werden sollen, dann brauche ich auch 'ne Info, wie das Ergebnis aussehen soll.
    Eine .eit als JSON in einer Zeile könnte problematisch werden, wenn Beschreibungen Zeilenvorschübe enthalten (kommt häufig vor). Wie wollen wir damit umgehen?

    Grüße
    ...jp

  • Ich denke mehrere EIT in einem Rutsch bräuchte ich nicht, aber JSON unterstützt auch arrays falls Du das doch Vorsorglich einpflegen möchtest. Da stehen dann mehrere Blöcke mit gleichen Parametern in [ , , , ] klammern. Aber ich denke das verkompliziert dann alles nur unnötig.


    Mein Vorschlag wäre edEIT nach folgendem Muster zu starten:


    edEIT.exe JSON [path] [optional identifier]


    edEIT.exe JSON "x:\Dreambox\20171222 2200 - RTL2 - Terminator.eit" "78"

    • Der Parameter JSON damit Dein Programm informiert ist das es jetzt nur um das auslesen geht.
    • Der path ist der Pfad zur EIT Datei.
    • Der optionale Parameter ist ein kurzer String den Dein Programm (falls mit übergeben) unverändert wieder in der JSON zurück geben sollte.

    Mein Gedanke ist dabei in einem oder mehreren seperaten Prozessen in Dauerschleife edEIT zu starten, die EIT Dateien auslesen zu lassen und den Rückgabewert in einer Datenbank zu speichern. Über den zuvor mit gegebenen und in der JSON wieder zurück gegebenen String würde ich in meinem falle die ID Nummer hinterlegen und dann einfach unter der ID blind den Inhalt der EIT speichern, ohne genau überwachen zu müssen welche Datei gerade von welcher edEIT Instanz in welchem Prozess abgearbeitet wurde.


    Die Rückgabe sähe dann so aus:


    Bevorzugen würde ich aber die Compact Darstellung: (keine Ahnung wie das beim JSON parser von .NET heißt)


    {"Content":"Maschinen regieren die Welt im Jahr 2029. Nur wenige Rebellen widersetzen sich dem Computer 'Skynet'. Um den Anführer der Widerständler, John Connor, auszuschalten, schickt Skynet einen Cyborg in die Vergangenheit. Der Terminator soll Sarah Connor, die Mutter des ungeborenen Rebellen, töten.\nIMDb rating: 8/10.","Description":"Sci-Fi-Film. Eine Killermaschine aus dem Jahr 2029 wird ins heutige L.A. entsandt, um eine Frau zu töten. Ein aus der Zukunft kommender Beschützer versucht dies zu verhindern.","Duration":130,"EventID":6861,"ID":"78","Language":"ger","Service Reference":"1:0:1:2F49:A1:270F:FFFF0000:0:0:0:","Starttime":1513977000,"Tags": "Film","Title":"Terminator"}


    Wie Du siehst sind einige Sachen enthalten die in Wirklichkeit aus der META Datei kommen und nicht aus der EIT wie beispielsweise die Tags. Falls keine META Vorhanden ist müsste man diese Informationen dann eben leer oder ganz weg lassen. Bin mir nicht sicher was besser ist. Eventuell ist ganz weg lassen besser, dann kann man anhand des Fehlens des "Service Reference" Feldes erkennen das gar keine META Datei vorhanden war, ansonsten könnte es ja sein das diese Information in der Datei einfach nur fehlte. (warum auch immer)


    In jedem falle würde ich Dir Raten den JSON string nicht selbst zu erzeugen. Gerade wegen der Umsetzung von Zeilenumbrüchen, Sonderzeichen und dergleichen fiesen Spielchen. .NET unterstützt bestimmt die Erzeugung von JSON Objekten und wenn diese gefüllt sind, kann man diese Standardkonform in einen String umwandeln den ich dann von meinem JSON Objekt parsen lassen kann.


    Im Anhang die EIT und Meta Dateien die ich für das Beispiel verwendet habe. Den einen Zeilenumbruch im Content Feld habe ich kurzerhand selbst eingefügt und von Deinem Programm schreiben lassen, ebenso den Tag. Beides war im Original nicht vorhanden. Die Umsetzung innerhalb von JSON über die Escapesequenz \n für Zeilenumbrüche zeigt aber das Du Dir darüber dann keine Sorgen machen müsstest.


    Ich hoffe meine Idealvorstellungen hab ich jetzt wunschgemäß genau genug definiert. Meiner Meinung nach müsste Kanzler1959 in seinem Python Skript damit dann auch was anfangen können und es ist hoffentlich flexibel und umfangreich genug für jeden anderen der sowas mal brauchen könnte.

  • Danke für Deine ausführlichen Erläuterung. Genau so hatte ich mir das vorgestellt.


    Ein paar Sachen muss ich mir noch durch den Kopf gehen lassen und auch abklären, wie ich VB dazu bekomme JSON zu erzeugen.
    Werde mir mal JsonSerialization ansehen.


    Die Erkennung, ob eine .ts.meta vorhanden ist, ist einfach.
    Sollte keine vorhanden sein, gibt es zwei Optionen:
    a) Die zugehörigen Felder werden einfach im JSON weggelassen (wäre mein Vorschlag)
    b) Die zugehörigen Felder werden leer im JSON aufgenommen.


    Sehe ich das richtig, dass die Reihenfolge der einzelnen Attribute im JSON keine Rolle spielt?

    Grüße
    ...jp

  • Danke für Deine ausführlichen Erläuterung. Genau so hatte ich mir das vorgestellt.


    Ein paar Sachen muss ich mir noch durch den Kopf gehen lassen und auch abklären, wie ich VB dazu bekomme JSON zu erzeugen.
    Werde mir mal JsonSerialization ansehen.

    Ja, ich war eben selbst erstaunt wie wenig VB.NET in der Richtung bietet.


    Aber ich denke mit dem Microsoft eigenen DataContractJsonSerializer müsste alles nötige abgedeckt werden:
    https://msdn.microsoft.com/de-…serializer(v=vs.110).aspx


    Die Erkennung, ob eine .ts.meta vorhanden ist, ist einfach.
    Sollte keine vorhanden sein, gibt es zwei Optionen:
    a) Die zugehörigen Felder werden einfach im JSON weggelassen (wäre mein Vorschlag)
    b) Die zugehörigen Felder werden leer im JSON aufgenommen.

    Ich wäre auch für Variante A.


    Ist zwar unter umständen dann so das man beim auslesen schauen muss ob das Feld da ist oder nicht. Aber Variante B hätte dann immer noch die Möglichkeit das die Datei vorhanden, aber die Felder leer sind. Also A wäre sicher besser, die Felder weglassen wenn die .ts.meta fehlt. Das ist aussagekräftiger.


    Sehe ich das richtig, dass die Reihenfolge der einzelnen Attribute im JSON keine Rolle spielt?


    Ja, prinzipiell schon.


    Ich habe das ganze quick & dirty so erzeugt:

    Wie Du siehst hab ich in meinem Quellcode die Datenfelder mehr oder weniger nach Wichtigkeit sortiert, oder zumindest so wie es mir in den Sinn kam. Im Ergebnis was dann in der Zwischenablage landete waren die Felder aber alphabetisch sortiert.


    Bezüglich der Startzeit hab ich das Format gewählt, weil es die Dreambox auch über das Webinterface in den XML Dateien so drin hat. (falls ich mich da gerade nicht vertue)
    Hier die Dokumentation aus der Qt Hilfe:


    Da steht zwar deprecated, aber mSecsSinceEpoch ist eine viel zu große Zahl (64 Bit Integer) die nicht in JSON gespeichert werden kann, außer als String.

  • Was mich nur etwas wundert:


    Soweit ich im RFC zu JSON gelesen habe, sind die UTF-xx (Standard: UTF-8).


    Warum steht in deiner JSON dann das "ö" von "töten" im Klartext? Ich hätte da was codiertes erwartet...

    Grüße
    ...jp

  • Wundert mich jetzt auch. Aber eventuell liegt es daran das der Text als UTF8 in der Zwischenablage landet und dann von dort aus hier so eingefügt wurde. ?(


    In dem QByteArray in meinem Code landet es jedenfalls noch als UTF-8 encoded JSON. Aber da Windows auch mit UTF-8 in der Zwischenablage umgehen kann... mmmh... okay, wenn Du das DataContractJsonSerializer von VB.NET nimmst wird der hoffentlich das JSON so ausspucken das QJSON bei mir das richtig einlesen kann. :D:huh:

  • Hab' noch einen Test gemacht:


    Als Ausgabe erhält man:

    Code
    {"ID":78,"Content":"Das ist ein Test mit Sonderzeichen: äöüÄÖÜß","Duration":130}


    Die erzeugte Datei enthält:

    Code
    ´╗┐{"ID":78,"Content":"Das ist ein Test mit Sonderzeichen: ├ñ├Â├╝├ä├û├£├ƒ","Duration":130}


    Das sieht ja schon ganz gut aus. Unklar ist mir, ob ich den BOM (erste drei Bytes) lassen soll oder nicht. edit: google sagt, man soll das lassen :)


    Klappt auch, die geschriebene Datei sieht jetzt so aus:

    Code
    {"ID":78,"Content":"Das ist ein Test mit Sonderzeichen: ├ñ├Â├╝├ä├û├£├ƒ","Duration":130}


    edit2: Ich denke, ich hab' jetzt alles, was ich brauche und werde mich in den nächsten Tagen an die Arbeit machen.

    Grüße
    ...jp

    Edited 7 times, last by juanito_perez ().


  • edit2: Ich denke, ich hab' jetzt alles, was ich brauche und werde mich in den nächsten Tagen an die Arbeit machen.

    Prima. :)


    Wenn Du magst kannst Du ja noch das Beispiel oben als Datei hochladen. Dann kann ich mal sehen ob äöü bei mir auch richtig eingelesen werden. Allerdings könnte das sein das das heute bei mir nimmer klappt und die nächste 3 Tage höchstens zwischendurch mal. ;)


    Wundern tut mich etwas das Du JavaScriptSerializer verwendest. Was ist denn der Unterschied zu DataContractJsonSerializer? Ich bin da nicht so in der VB.NET Doku drin, aber beim einen kommt zumindest Json im Namen vor, auch wenn das andere sich prinzipiell auch gut anhört, immerhin stehen ja die ersten beiden Buchstaben von JSON für JavaScript. :S:huh:

  • Den Unterschied kann ich dir auch nicht sagen. Dazu müsste ich auch suchen.


    Der JavaScriptSerializer funktioniert aber super und inkl. Zeilenumbrüche :)


    Anbei eine erzeugte test.json (bitte .txt entfernen, ohne geht kein Upload) mit Umlauten und Zeilenumbruch.

    Files

    • test.json.txt

      (106 Byte, downloaded 61 times, last: )

    Grüße
    ...jp

  • Der JavaScriptSerializer funktioniert aber super und inkl. Zeilenumbrüche :)


    Hiermit bestätigt. Ließ sich jetzt sauber unter Qt einlesen und sieht soweit gut aus. Umlaute sind im Debugger sauber zu lesen, somit müsste alles passen. Nur in der späteren Version würde ich bevorzugen die ID in einem String verpackt zurück zu bekommen, nur um es universeller zu machen und der Parameter der an Dein Programm übergeben wird nicht zwingend eine Nummer sein muss.


    Was mir jetzt nur noch in den Sinn kam ist, was wenn sich über die CLI kein UTF8 übertragen (auslesen) lässt. Aber ich fürchte das sehen wir dann...


    edit2: Ich denke, ich hab' jetzt alles, was ich brauche und werde mich in den nächsten Tagen an die Arbeit machen.


    Lass Dir Zeit und genieße die Festtage. Und Danke schon mal für die schnelle Rückmeldung und das Super EIT Tool! :love:

  • Thank you for the great plugin.


    Sorry I write in English (my German is not that good), but on several eit files the editor crashes. See the log below and enclosed a eit file that makes it crash (please rename .txt into .eit, I was not allowed to attach a eit file).


    I use Windows 10 Pro 64 bit build 16299.192 (Dutch). But as other EIT files do work (only some not) I suspect it is not the OS.

  • Thanks for your feedback :)


    First: Please be so kind to delete the debug infos in your post above. In most cases I don't need them as the problem can be found with the .eit-file ;)


    I assume your eit was not created by a Dreambox. Am I right? Where is your .eit from?


    Your .eit contains an descriptor (parental rating), which is covered by the standard but not yet implemented in edEIT.
    This is because I never have seen an .eit with this descriptor.
    Your .eit also contains an content descriptor which ist also not fully supported by edEIT yet.


    I will release an updated edEIT (1.6.0) which will fully support content desciptors and also parental rating descriptors.
    Please allow me some time for that as I have to change the layout.

    Grüße
    ...jp