[Diskussion] Meta-Angaben zu Dateien (meta.txt)

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • FloB
    Contao-Urgestein
    • 19.06.2009
    • 1618

    #1

    [Diskussion] Meta-Angaben zu Dateien (meta.txt)

    Hi zusammen,

    das Thema meta.txt bzw. Verwaltung von Meta-Angaben zu Dateien kommt ja immer wieder auf, und der Grundtenor ist ja eigentlich, dass dies in TL unzureichend gelöst ist.
    Ich möchte hier nur auf das Speicherformat der Meta-Angaben eingehen. Wie man eine Eingabeoberfläche für Metaangaben ins Backend integrieren kann, ist ein anderes Thema.

    Aktuell werden Metaangaben zu Dateien ja in der meta.txt gespeichert. Diese hat folgendes Format:
    Code:
    [Dateiname].[Dateiendung] = [Titel] | [Link] | [Beschreibung]
    Dieses Format ist ziemlich unflexibel. Es ist hauptsächlich für Bilddateien konzipiert (Titel = Caption, Link = Weiterführende Seite, Beschreibung = Lightbox-Unterschrift). Für Downloaddateien ist das Link-Argument z. B. in den meisten Fällen sinnlos*. Und was ist, wenn man für Bilddateien zusätzliche Informationen speichern möchte (wie z. B. die Bildmitte)?

    Letzteres ist ohne weiteres bereits möglich: Die Parse-Funktion für die Meta-Datei trennt einfach den Paramter-String an den "|” auf und speichert die Bestandteile in einem Array ($meta[0] enthält somit den Titel, $meta[1] den Link etc.) – ein vierter Parameter wäre also mit $meta[3] abrufbar usw.
    Da ergibt sich nur ein Problem:
    Eine Erweiterung speichert zusätzliche Informationen, wie ein Vorschaubild, als vierten Parameter ab. Eine andere Erweiterung will den Namen des Users speichern, der das Bild hochgeladen hat. Woher weiß aber jetzt die eine Erweiterung, dass eine andere bereits den vierten Parameter mit seinen Informationen besetzt hat? Woher wissen Module, dass an Position vier eine Bild-URL und nicht ein Nutzer gespeichert ist? Und was passiert mit den bereits gespeicherten zusätzlichen Informationen, wenn die im o. g. Ticket genannte Änderung eingeführt wird?

    Wie lösen wir das Problem? Da sehe ich zwei Möglichkeiten:
    1. Der vierte Parameter wird als serialisiertes Array "verallgemeinert". D. h. alle zusätzlichen Informationen in der Meta.txt werden in einem assoziativen Array gespeichert. Somit kommt es nicht zu einer Kollision von verschiedenen Parsern, denn man weiß immer, welche Information hinter den gegebenen Daten steckt.
      Aber, wie ein anderer Nutzer sagte: Warum eine Krücke durch eine andere ersetzen?
    2. Ein neues Datei-Metaangaben-Format, was flexible und eindeutige Angaben von Meta-Informationen zulässt.


    In einem Ticket hatte ich bereits eine Idee zu einem solchen neuen Format skizziert. Ich schlage die Benutzung einer JSON-ähnlichen Syntax vor, da diese sehr flexibel ist und nur einen – im Verlgeich zu anderen Formaten – sehr geringen Overhead besitzt sowie – und insbesondere – in gewisser Weise standartisiert ist. Ich nenne es mal JPL (JSON per line):
    Code:
    {"[Dateiname].[Dateiendung]" : { "[Schlüssel1]" : "[Wert1]", "[Schlüssel2]" : "[Wert2]", […], "[SchlüsselX]" : "[WertX]" } }
    {"bild.jpg" : { "title" : "Ein Beispielbild", "desc" : "Dieses Bild veranschaulicht etwas.", "url" : "https://contao.org/" } }
    {"download1.zip" : { "title" : "Etwas zum Herunterladen", "keywords" : ["Stichwort 1", "Stichwort 2", "Stichwort 3"], "thumb" : "tl_files/thumbnails/download1.jpg" } }
    {"download2.zip" : { "title" : "Etwas anderes zum Herunterladen", "keywords" : "Stichwort 1|Stichwort 2|Stichwort 3" } }
    {"template.tar.gz" : { "title" : "Template herunterladen", "desc" : "Diese Datei enthält alle nötigen Dateien um die kostenlose Vorlage XYZ in Ihrer TYPOlight-Installation zu verwenden.", "thumb_list" : ["tl_files/thumbnails/template-1.jpg", "tl_files/thumbnails/template-2.jpg", "tl_files/thumbnails/template-backend.jpg"], "url" : "http://www.tl-templates.tld/templates/item/XYZ.html" } }
    Die erste Zeile des Codeblocks enthält die allgemeine Syntax, die weiteren zeigen Beispiele. Der gesamte Codeblock ist eine valide "meta.jpl". Eine Implementierung von Listen (siehe Zeile 3, Schlüssel "keywords") kann auch – zwecks Vereinfachung des Parsers – umgangen werden (siehe Zeile 4). Es können beliebig viele Leerzeichen zwischen den einzelnen Syntaxelementen vorkommen. Die Eigenschaften können in beliebiger Reihenfolge auftauchen.

    Vorteile dieses Formats:
    • flexibel
    • spezifische Meta-Angaben möglich
    • geringer Overhead (also gutes Verhältnis von Syntaxelementen vs. Information)
    • JSON ist (in gewisser Weise) ein Standard, weit verbreitet
    • nativer JSON-Parser in PHP vorhanden!
    • … sollte dieser deaktiviert sein, ließe sich leicht ein kleiner Parser selber bauen

    Nachteile:
    • größere Dateigröße als meta.txt-Format
    • benötigt ein wenig mehr Rechenleistung und RAM als meta.txt-Format

    Probleme:
    • (Wahrscheinlich) keine Zeilenumbrüche in Angaben möglich.
      Lösung: "<br />", "\n" und ggf. "\r" nutzen, um einen Zeilenumbruch zu erzeugen.
    • Abwärtskompatibilität?
      Die Schlüssel "title", "desc" und "url" (bzw. "link") werden zusätzlich unter $meta[0] bis $meta[2] abgespeichert, sodass bisherige Erweiterungen / der Core ohne Änderung weiter funktioniert.
      Wenn keine meta[_??].jpl vorhanden, wird eine meta.txt gesucht und geladen.



    Nun zu euch:
    Was meint ihr dazu?
    Wie nötig findet ihr eine solche Änderung?
    Wie sinnvoll findet ihr meinen Vorschlag?
    Was schlagt ihr vor?
    Was könnte man noch verbessern?
    Wo liegen noch Probleme, Nachteile, Vorteile? (Ich erweitere die Listen oben dann.)


    * In einer Downloadliste könnte ein Link zu einer Detailseite zum Download führen, in der der Inhalt ausführlich beschrieben wird.
    So long,
    FloB since Nov. 2007 +706P +115P and counting
  • MacKP
    Contao-Yoda
    • 15.06.2009
    • 13315

    #2
    Hallo FloB,
    ich fände es sehr gut, wenn man die meta.txt mehr ausbauen würde um wesendlich mehr Informationen zu Bildern vorhalten zu können.

    Noch mehr wäre ich für eine wesendlich weitreichendere Lösung. Aber da müsste alles für umgebaut werden und die Informationen würden in der DB liegen...

    Aber man kann ja so schon mal einen Schritt in die richtige Richtung machen ;-)

    Viele Grüße
    Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
    [Arbeitet bei -> Paus Design & Medien]
    "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

    Kommentar

    • Sebastian
      Contao-Urgestein
      • 19.06.2009
      • 3361

      #3
      HI

      in der Tat scheint mir ein neues System angebracht, da diese Metadateien von Hand zu verwalten ein sehr großer Aufwand ist, der Meta-Creator jedoch wohl nicht mehr weiterentwickelt wird und Bugs hat.

      Ich fände ein System, ob datenbankbasiert oder nicht, gut, dass ermöglicht, pro Bild mehrere Textversionen (pro Sprache) zu erstellen, sodass Bilder mehrfach verwendet werden können, mit unterschiedlichen Unterschriften. Dazu würde ich einen Backendmenüpunkt verwenden, mit dem Metainformationen für Dateien (nicht nur Bilder) gepflegt werden könnten, jedoch mit mehr Funktionen als der Meta-Creator.

      Besonders wichtig erscheint mir auch eine Funktion, um Verzeichnisse erneut einlesen zu lassen (in Textdateien oder Datenbanktabellen), wenn neue Dateien dazugekommen sind, jedoch ohne vorhandene Informationen zu überschreiben. Vielleicht könnte dabei eine Prüfsumme gespeichert werden, um auch Veränderungen an einzelnen Dateien zu registrieren.

      Entschuldige bitte, dein Ansatz ist durchaus auch interessant, jedoch fehlt für mich die wichtige Funktion, mehrere unterschiedliche Informationssätze pro Datei abspeichern zu können.

      Sebastian
      Ich arbeite beim Linux-Systemhaus ETES in Stuttgart

      Kommentar

      • FloB
        Contao-Urgestein
        • 19.06.2009
        • 1618

        #4
        Jetzt komm ich auch mal wieder dazu, hier zu schreiben …

        Ein datenbankbasiertes System hat natürlich auch Vorteile und Nachteile. Ich finde, dass Informationen zu Dateien zu diesen ins Dateisystem selber gehören. Außerdem behielten wir dann die bisherige "Ordnung" bei. Vorteil an einem DB-basiertem System ist, dass Verweise auf IDs der Datenbanken möglich sind und das System natürlich dann "immun" gegen verschobene Dateien ist – aber was ist mit Dateien, die hinzukommen, verschoben und gelöscht werden? Man kann ja nicht vollständig das Dateisystem überwachen und jedesmal automatisch einen Eintrag in der DB ablegen. Außerdem will man eigentlich (zumindest ich ) nicht sein ganzes Dateisystem nochmal in der DB gespiegelt haben – das riecht ja förmlich nach Datenchaos .
        Und: Was kann ein Datenbanksystem, was ein Meta-Datei-System nicht kann?

        Ich fände ein System, ob datenbankbasiert oder nicht, gut, dass ermöglicht, pro Bild mehrere Textversionen (pro Sprache) zu erstellen, sodass Bilder mehrfach verwendet werden können, mit unterschiedlichen Unterschriften.
        Das betrifft ja eigentlich nur textuale Inhalte, wie Titel und Beschreibung. Das ließe sich ja zum einen über eine sprachabhängige Datei regeln (meta_de.jpl, meta_en.jpl), zum anderen könnte man ja auch eine Konvention einbauen, die sprachabhängig die Werte setzt (damit spart man sich sogar verschiedene Dateien, gute Idee ):
        Code:
        {"template.tar.gz" : { "title" : { "de" : "Template herunterladen", "en" : "Download template" }, "desc" : … } }
        Zitat von Sebastian
        Besonders wichtig erscheint mir auch eine Funktion, um Verzeichnisse erneut einlesen zu lassen (in Textdateien oder Datenbanktabellen), wenn neue Dateien dazugekommen sind, jedoch ohne vorhandene Informationen zu überschreiben. Vielleicht könnte dabei eine Prüfsumme gespeichert werden, um auch Veränderungen an einzelnen Dateien zu registrieren.
        Prüfsumme speichern ist kein Problem, einfach ein neues Feld anlegen.
        Ein erneutes Einlesen von Verzeichnissen ist doch gar nicht nötig – je nachdem, wie man es regelt. Ich finde eigentlich, dass die Meta-Verwaltung voll in die Dateiverwaltung integriert werden sollte: Beim Klick auf "Bearbeiten" kann man neben dem Dateinamen (der auch entsprechend gesetzt wird) noch alle anderen Angaben eingeben (Felder werden wie üblich per DCA bestimmt). Aus den Eingaben werden die JPL-Daten generiert und die entsprechende Zeile geschrieben (bzw. alte Zeile ersetzt) – andere Dateieinträge bleiben davon natürlich unberührt. Das ist IMO die benutzerfreundlichste Variante. Ein extra Backend-Menüpunkt ist da nur verwirrend – habe schon viele gehört, die sich über darüber beschwert haben, dass es so kompliziert ist, erst Dateien per Verwaltung hochzuladen, dann über einen anderen Menüpunkt (MetaCreator) die Infos zu bearbeiten – ganz abgesehen von den beschränkten Eingabemöglichkeiten.

        Natürlich kann man die Ideen auch bei anderen Format nutzen, ich habe jetzt nur immer das JPL-Format genannt.
        So long,
        FloB since Nov. 2007 +706P +115P and counting

        Kommentar

        • Toflar
          Contao-Urgestein
          • 15.06.2009
          • 4476

          #5
          Ich finde die Idee mit dem JSON-Format ziemlich gut, ehrlich gesagt

          Es kann einfach nicht sein, dass sich der Kunde über die meta.txt Gedanken machen muss.
          Es muss einfach vor allem im BE einfacher werden. Der Filetree muss so erweitert werden, dass man auch gleich Captions und Beschrieb eingeben kann. Beim CE Downloads ist es zur Zeit auch nicht möglich, einfach noch den Link-Titel einzugeben. Ganz abgesehen davon, dass file.php?xy="tl_files/pics/meinpic.jpg" nicht so das wahre ist - ein unique Key wäre da viel angebrachter.

          Deine Gedanken zur meta.txt gehen in die richtige Richtung, denn mit dem JSON-Format liessen sich beliebig Keys setzen. So könnte man auch z.B. den Filetype abspeichern oder ähnliches.

          So wie es jetzt "gelöst" ist, ist es schlicht und ergreifend schlecht. Ich kann es leider nicht anders sagen
          Contao Core-Entwickler @terminal42 gmbh
          Wir sind Contao Premium-Partner!
          Für Individuallösungen kannst du uns gerne kontaktieren.
          PS: Heute schon getrakked?

          Kommentar

          • felixpfeiffer
            AG CMS-Garden
            • 05.06.2009
            • 346

            #6
            Hallo,

            ich finde den Ansatz auch sehr gelungen.
            Allerdings müsste man in diesem Fall direkt mit einem passenden Editor daher kommen, da diese Dateien von hand nahezu nicht mehr pflegbar wären.
            Da ich oben - der MetaCreator wird nicht mehr entwicklet - angesprochen wurde, vielleicht meine zwei Cent dazu:
            Ich habe auf meinem lokalen Testsystem inzwischen eine neue Version des MetaCreator - heiß dann MetaEditor - die sich komplett ins Dateisystem einklinkt. Also keine DB mehr, sondern nur noch Datei-basiert. Diese ist zwar noch nciht ganz fertig, daher auch noch nciht veröffentlicht, aber man könnte diese recht einfach auf ein neues System umstellen.

            Falls Leo sich in dieser Angelegenheit auch äußert, könnte man also schauen,w as sich da machen lässt.

            Gruß, Felix
            Felix Pfeiffer : Neue Medien
            Offizieller Contao Partner für den Raum Hannover

            Infos: http://www.felixpfeiffer.com

            Kommentar

            • FloB
              Contao-Urgestein
              • 19.06.2009
              • 1618

              #7
              Danke für das Lob

              Zitat von felixpfeiffer Beitrag anzeigen
              Allerdings müsste man in diesem Fall direkt mit einem passenden Editor daher kommen, da diese Dateien von hand nahezu nicht mehr pflegbar wären.
              Naja, ließe sich IMO relativ gut machen … klar, ist ein wenig unübersichtlich, aber doch gut machbar ;-).

              Zitat von felixpfeiffer Beitrag anzeigen
              Falls Leo sich in dieser Angelegenheit auch äußert, könnte man also schauen,w as sich da machen lässt.
              Ich könnte mir auch einen Hook in der Frontend:arseMetaFile() vorstellen, der alternative Meta-Datei-Parser ausführen lässt. Allerdings fände ich eine flächendeckende Lösung angebrachter …
              So long,
              FloB since Nov. 2007 +706P +115P and counting

              Kommentar

              • xtra
                Maintainer
                • 02.07.2009
                • 2007

                #8
                Gerade wegen des Arguments des Editors wuerde ich hier doch dann auch eher zu einer Datenbanktabelle (noch mehr queries...) oder aber einer meta XML tendieren.

                Generell wuerde ich ein einklinken direkt in das Dateisystem des Core begruessen, sofern das auch in beide Richtungen funktioniert.
                Ich denke dabei an eine direkte API, welche das speichern der Informationen vom Speicherformat abstrahiert, so dass man z.B. die Daten zu einer Datei aus einem Modul erfragen kann und obendrein auch setzen.
                Optimal waere es auch noch, wenn man diese gleich importieren und exportieren kann (man koennte ja auch entsprechend einen callback einbauen, um nachtraeglich andere Formate zu ermoeglichen).

                Meine paar Cents
                Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

                Kommentar

                • Sebastian
                  Contao-Urgestein
                  • 19.06.2009
                  • 3361

                  #9
                  HI

                  es klingt doch jetzt wieder ganz anders, wenn ich es nochmal durchlese… Ich finde es einfach eine gute Idee, das System hier zu ändern, weil es nicht flexibel genug ist.

                  Bezüglich der unterschiedlichen Varianten: Ich meine nicht nur, dass man pro Sprache jeweils eine eigene Beschreibung braucht, sondern, dass es auch vorkommen kann, dass man das Bild pro Sprache mehrmals mit unterschiedlichen Texten einbauen will.

                  Sebastian
                  Ich arbeite beim Linux-Systemhaus ETES in Stuttgart

                  Kommentar

                  • FloB
                    Contao-Urgestein
                    • 19.06.2009
                    • 1618

                    #10
                    Zitat von Sebastian Beitrag anzeigen
                    Bezüglich der unterschiedlichen Varianten: Ich meine nicht nur, dass man pro Sprache jeweils eine eigene Beschreibung braucht, sondern, dass es auch vorkommen kann, dass man das Bild pro Sprache mehrmals mit unterschiedlichen Texten einbauen will.
                    Das finde ich eine hochspezifische Funktion … soetwas würde ich dann ganz anders lösen (z. B. im CE werden die Meta-Daten für die Anzeige überschrieben) … wenn es unbedingt über die meta-Datei sein muss, wäre wohl eine URL-basierte Datenangabe die Lösung:
                    Code:
                    Array
                    (
                        [datei.jpg] => Array
                            (
                                [desc] => Beschreibung
                                [descByUrl] => Array
                                    (
                                        [referenzen.html] => Andere Beschreibung
                                        [news-de/items/eintrag.html] => Andere Beschreibung 2
                                    )
                    
                            )
                    
                    )
                    Vorteil an dem Format ist ja, dass man beliebig verschachtelte Angaben machen kann. Das entsprechende CE muss die Angaben nur unterstützen.


                    Eine API könnte so aussehen (nur so ne Idee, habe ich mir grade spontan ersponnen, auch nichts großartig durchdacht und auch null getestet – deswegen auch als "abstract" definiert ):
                    PHP-Code:
                    abstract class Metadata extends System {
                    
                        protected $arrData = array();
                        protected $arrObj = array();
                        protected $strFolder;
                        protected $strLang;
                        protected $objMetafile;
                    
                        public function __construct($strFolder, $strLang = NULL)
                        {
                            $this->strFolder = $strFolder;
                            $this->strLang = (!$strLang) ? $GLOBALS['TL_LANGUAGE'] : $strLang;
                            $this->readMeta();
                        }
                    
                        public function readMeta()
                        {
                            $this->objMetafile = new File(TL_ROOT . '/' . $this->strFolder . '/meta.jpl');
                            $lines = $this->objMetafile->getContentAsArray();
                            foreach($lines as $line)
                            {
                                $fileData = json_decode($line, true);
                                $fileData = each($fileData);
                                $this->arrData[$fileData[0]] = $fileData[$fileData[1]];
                            }
                            //TODO? read language specific JPL file
                            return true;
                        }
                    
                        public function saveMeta()
                        {
                            foreach($this->arrObj as $file => $obj)
                            {
                                $this->arrData[$file] = $obj->getMeta();
                            }
                            $this->objMetafile->write(''); // clear file
                            foreach($this->arrData as $line => $data)
                            {
                                $this->objMetafile->append(json_encode(array($line => $data)));
                            }
                            return true;
                        }
                    
                        public function file($strFile)
                        {
                            $this->arrObj[$strFile] = new MetadataFile($this->arrData[$strFile]);
                            return $this->arrObj[$strFile];
                        }
                    
                        public function __get($strName)
                        {
                            switch($strName)
                            {
                                case 'folder':
                                    return $this->strFolder;
                                    break;
                                case 'lang':
                                    return $this->strLang;
                                    break;
                                default:
                                    return NULL;
                            }
                        }
                    
                        public function __set($strName, $varValue)
                        {
                            switch($strName)
                            {
                                case 'folder':
                                    $this->strFolder = $varValue;
                                    break;
                                case 'lang':
                                    $this->strLang = $varValue;
                                    break;
                            }
                        }
                    
                        public function __destruct()
                        {
                            $this->saveMeta();
                        }
                    
                    }
                    
                    abstract class MetadataFile extends Metadata
                    {
                        public function __construct($arrData)
                        {
                            $this->arrData = $arrData;
                        }
                    
                        public function __get($strName)
                        {
                            return $this->arrData[$strName];
                        }
                    
                        public function __set($strName, $varValue)
                        {
                            $this->arrData[$strName] = $varValue;
                        }
                    
                        public function getMeta()
                        {
                            return $this->arrData;
                        }
                    } 
                    
                    So long,
                    FloB since Nov. 2007 +706P +115P and counting

                    Kommentar

                    • Toflar
                      Contao-Urgestein
                      • 15.06.2009
                      • 4476

                      #11
                      Hook beantragt, da: http://https://contao.org/issues/show/1467
                      Contao Core-Entwickler @terminal42 gmbh
                      Wir sind Contao Premium-Partner!
                      Für Individuallösungen kannst du uns gerne kontaktieren.
                      PS: Heute schon getrakked?

                      Kommentar

                      • FloB
                        Contao-Urgestein
                        • 19.06.2009
                        • 1618

                        #12
                        Wie schaut es hier jetzt aus? Jemand noch Ideen? Anmerkungen?
                        So long,
                        FloB since Nov. 2007 +706P +115P and counting

                        Kommentar

                        • Toflar
                          Contao-Urgestein
                          • 15.06.2009
                          • 4476

                          #13
                          Leo meinte im Ticket, wir diskutieren das aus und unternehmen erst dann etwas. Bis jetzt hat er sich noch nicht dazu geäussert. Mich würde es vor allem interessieren, wie er die Sache sieht. Schliesslich stammt das ganze meta.txt-Konstrukt ja auch von ihm und er hat sich garantiert etwas dabei gedacht, was wir nicht ausser Acht lassen sollten...
                          Contao Core-Entwickler @terminal42 gmbh
                          Wir sind Contao Premium-Partner!
                          Für Individuallösungen kannst du uns gerne kontaktieren.
                          PS: Heute schon getrakked?

                          Kommentar

                          • FloB
                            Contao-Urgestein
                            • 19.06.2009
                            • 1618

                            #14
                            Dann würde ich vorschlagen, dass wir ein paar Ideen ausarbeiten und Konventionen festlegen, solange sich Leo an der Diskussion nicht beteiligt. Wir sollten erstmal Vorschläge und Ergebnisse bringen.
                            Ich denke auch, dass er einen spezifischen Hook favorisiert und die bisherige Methode standardmäßig beibehalten möchte.
                            So long,
                            FloB since Nov. 2007 +706P +115P and counting

                            Kommentar

                            • dragon
                              Contao-Nutzer
                              • 28.11.2009
                              • 35

                              #15
                              Hallo,

                              ist hier schon etwas in Aussicht? Die Geschichte mit der meta.txt ist auch für mich das (bis jetzt einzige ) Ärgernis beim Handling von Typolight. Nur leider fehlen mir die Kenntnisse um hier produktiv etwas beizutragen. Wäre aber schön wenn Ihr dran bleibt!

                              Liebe Grüße,
                              Jürgen
                              www.cyberlabor.net

                              Kommentar

                              Lädt...