Request for comments: Plugin-Interface für DLNA-Plugin

  • Das mit den "Erzeugen der Resourcen" habe ich mir auch gedacht beim Kontrollesen, "Erzeugen von Referencen auf die Resourcen".


    So ich habe nun folgendes Problem, was passiert wenn Recourcen gelöscht werden?
    Auch finde ich nur eine Funktion für "das sich ein Container geändert hat".
    Schmeisst dann der Manager den kompletten Container weg und liest den komplett wieder ein?


    Desweiteren fehlt mir die Seek Funktion.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Ha, seek! damn! Danke!


    Zum Löschen: Ja, sofern ich nichts besseres finde. Manche Systeme können nach dem Löschen nicht mehr mitteilen, dass eine Resource gelöscht wurde, sondern nur, dass in einem Verzeichnis eine Löschung vorgenommen wurde. Deswegen wird als Update ein "DELETE in Container XY" gemeldet. Ich muss dann zusehen, dass ich die nicht mehr gültigen Referenzen lösche. Welche Alternativen gäbe es denn noch? Die Doku der Update-Funktion ist ja enthalten.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Das Problem hättest du nicht, wenn das Plugin, also der Manager scannen würde.


    Ich würde die UpdateId eine Property für jede Recource machen.
    Dann würde aus OnContainerUpdate OnRecourceUpdate werden.
    Wenn jetzt ein Modul nur mit Container arbeiten kann, dann ruft es einfach die
    OnRecourceUpdate mit dem Container auf.


    Also wenn ich jetzt mal von mp3 in einem Filesystem ausgehen würde.
    Dann sollte ich für jedes mp3 die Metadaten (Author, Titel usw.) aus dem
    mp3 extraieren.


    Für den Scan im Modul brauche ich die Funktionen:

    • Alle Recourcen Referencen in dem Container
      Damit ich gelöschte Recourcen aufräumen kann.
    • Hole die UpdateId der Recource
      Damit ich mir nur bei Änderung die Metadaten hole.
    • Lösche eine Recource Reference
      Damit ich gelöschte Recourecen aktualisieren kann.
    • Update und Einfügen einer Recource Reference mit Metadaten


    Ich persöhnlich würde nur Update+Einfügen incl aller Metadaten als API zur Verfügung stellen.
    Irgendwie finde ich die Funktion um Recource Referencen anzulegen nicht.


    Code
    GetContainerEntries(Uri)
    GetUpdateId(Uri)
    DeleteRecource(Uri)
    UpdateRecource(Uri, UpdateId, PropertyList)


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Ich glaub, ich hab mich vorhin blöd ausgedrückt: Das Modul hat Zugriff auf die Datenbasis, aber scannen im Sinne von jeden Ordner durchiterieren und Metadaten abfragen, wird vom Manager durchgeführt. Deswegen ist auch der Funktionsumfang so gigantisch, damit die meisten Datei- und Verzeichnisoperationen möglich sind.


    Die Problematik, die ich die ganze Zeit aber hatte ist, dass der Plugin-Manager keine Kenntnis darüber hat, ob und wann eine Resource geupdatet wurde. Außerdem werden UpdateIDs nur für Container gepflegt. Es gibt keine UpdateID für eine Datei selbst. Wenn eine Resource gelöscht wird, ändert sich die UpdateID des Elterncontainers.


    Wenn der Container aktualisiert wurde, gibt es 4 Möglichkeiten:


    - Datei wurde angelegt
    - Datei wurde gelöscht
    - Datei wurde geändert
    - Datei wurde verschoben, was letztlich nur eine Kombination aus Anlegen und Löschen in zwei verschiedenen Containern ist.


    Ich könnte nun versuchen, in das Interface so abzuändern, dass zusätzlich zum Container noch die Datei zurück gibt, die geändert (angelegt, modifiziert, gelöscht, verschoben) wurde. Wenn die leer ist, muss ich davon ausgehen, dass unbekannt ist, WAS sich geändert hat, sondern nur DASS sich etwas geändert hat. Dann muss eben der gesamte Container gescannt werden. Das müsste dann okay sein, oder?


    edit: Seek ist jetzt mit drin :) Danke nochmal.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Hallo,


    ich habe mal ein kleines Datenmodell gepinselt, welches unabhängig der Schnittstellen Specs ist und aus dem trotzdem alle Objekte erzeugt werden könnten.
    Weiß nicht, ob das Plugin auch Dateien anbieten soll, die nicht vom VDR stammen.
    Falls dem so ist, wäre mediainfo ein gutes Werkzeug zur Medienanalyse.
    Es liest Metatags aus audio-Dateien, liefert Informationen zu Bildern und natürlich stream-infos für alle Bestandteile eines Video.
    Funktioniert auch für VDR-Dateien.


    Den container habe ich optional gemacht, da ich es für wenig sinnvoll halte, die ganze Dateisystem-Struktur in der Datenbank zu duplizieren. Andererseits gibt es Situationen, in denen der Container sinnvoll wäre, wie z.B. ein Album bei Musikstücken oder wenn Bilder nach Urlaub/Veranstaltung gruppiert sind, dann möchte man evtl. danach suchen.
    Ansonsten halte ich den Einstieg über Genre bzw. Person/Rolle eher für anwenderfreundlich.
    Wenn man in der Datenbank einen Änderungszähler führt, kann man aus den Personen und Genres virtuelle Container machen, die dann den Zugriff auf die Medien ermöglichen.


    Die Tabelle mediainfo ist die Basisklasse, die jeweils die Informationen für einen Stream aufnimmt. Da mediainfo immer auch Informationen zum Mediencontainer ausgibt, sind es selbst bei einem Bild 2 Einträge in mediainfo. Die Tabelle enthält die geläufigsten Attribute. Alle weiteren Attribute werden als Tag abgelegt.


    So könnte die Schnittstelle für Module auf ein "setTag" reduziert werden und die mediainfo-Instanz entscheidet selbst, wo was abgelegt wird.
    Die Tabelle mediainfo wäre auch ein gutes Hilfsmittel, falls mal recodierung ein Thema werden sollte.


    Neben dem Bild habe ich noch die Datei für mysql-workbench hochgeladen. Die Datenbank ist nicht vollständig - eher ein Denkanstoß.
    Mit der Workbench können einfach die SQL-Scripte erzeugt werden. Mit ein paar Anpassungen (fals nötig) wären die dann auch für sqlite zu gebrauchen.


    Gruß Gero

  • Das würde dann aber nur die Schnittstelle zum User-Frontend bedeuten, wenn ich alles auf SetTag festlegen würde. Das ist eine Idee für die spätere Organisation. Ich nehm das mit auf, weil der Ansatz, also die Idee als solche, ziemlich gut ist.


    Container, oder in deiner Definition Tags, sind Pflicht. Letztlich wäre ein Tag auch nur ein Container, dem ich mehrere Items zuordnen kann. Von daher ist es egal. Was mir an der Struktur nicht wirklich gefällt, dass sie - was aus deiner Sicht genau so geplant wurde - komplett vom Standard weg geht. Das macht die spätere Erweiterung und Aktuallisierung an Folgereleases der Standards schwieriger. Außerdem müsste ich die Plugin-Entwickler erst wieder mit einem fetten Dokumentationswerk erschlagen, worin erklärt ist, warum eine Property nur 45 oder 255 Zeichen statt 1024, wie vom Standard vorgegeben, erlaubt. Die Entwickler sollen sich, wenn sie eine Erweiterung schreiben, ruhig mit dem Werk mal auseinander setzen, um zu begreifen, wie es funktioniert. Das ist meiner Meinung nach einer der Hauptgründe, warum viele UPnP/DLNA-Server/-Client-Kombinationen nicht funktionieren.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Das Problem hättest du nicht, wenn das Plugin, also der Manager scannen würde.


    Ich hab nochmal geguckt. Der >Manager< scannt den Container. Beim Starten des Plugins prüft er ALLE Container auf deren UpdateID, und iteriert nur dann über die Elemente, wenn die alte und neue UpdateID unterschiedlich sind. Dadurch soll gewährleistet werden, dass in Offline-Zeiten trotzdem alle Änderungen erkannt werden. Das macht natürlich für die Modul-Entwickler es enorm wichtig, eine richtige Update-ID anzubieten, die auch Neustarts übersteht.


    Ich habe jetzt noch als optionale Variable beim OnContainerUpdate() das Element reingenommen, was sich geändert hat. Ich hoffe mal, dass gerade beim Update der TV-Kanäle diese Variante etwas helfen könnte.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin


  • Die Problematik, die ich die ganze Zeit aber hatte ist, dass der Plugin-Manager keine Kenntnis darüber hat, ob und wann eine Resource geupdatet wurde. Außerdem werden UpdateIDs nur für Container gepflegt. Es gibt keine UpdateID für eine Datei selbst. Wenn eine Resource gelöscht wird, ändert sich die UpdateID des Elterncontainers.


    Ok. Also doch anders herum.
    Ich würde den Scanner nicht die Metadaten zurückgeben lassen.
    Sondern einfach eine Property Liste und UpdateID.
    Und ich würde jedem Object egal ob Container oder Recource eine UpdateID geben.


    Und aktuallisieren würde ich immer wenn UpdateID != der gespeicherten ist.


    Dann braucht es noch Thumbnails bzw. Icons?


    So einmal durchspielen:


    Der Manager ruft das Modul mit dem Rootverzeichnis der MP3 Musik auf.
    Hier kann mehrere Wege gehen, ich mache mal den Einfachen fürs Modul.
    Der Manager prüft mit GetContainerUpdateId ob es sich verändert hat.
    Wenn ja: GetContainerEntries gibt alle Unterverzeichnisse und MP3 in diesem zurück.
    Alle MP3 werden auf Änderung abgefragt und mit GetMetadata diese geholt.
    Nicht mehr vorhanden Recourcereferenzen werden gelöscht.
    Recursiv wird dies für alle Unterverzeichnisse wiederholt.
    Wenn nein: Wird dies recursiv für alle Unterverzeichnisse wiederholt.


    Nebenbei legt das Modul eine Überwachung aller Datein und Verzeichnisse an.
    Wenn irgendwas verändert wird dies über OnContainerUpdate mitgeteilt.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch


  • Ich würde den Scanner nicht die Metadaten zurückgeben lassen.
    Sondern einfach eine Property Liste und UpdateID.
    Und ich würde jedem Object egal ob Container oder Recource eine UpdateID geben.


    Das verstehe ich nicht. Wenn der Scanner NICHT die Metadaten vom Modul geliefert bekommt, woher soll er sie dann bekommen? Oder verstehe ich dich wieder falsch?


    Und aktuallisieren würde ich immer wenn UpdateID != der gespeicherten ist.


    Jep, siehe oben. Passt :)


    Dann braucht es noch Thumbnails bzw. Icons?


    Ja, laut ContentDirectory könnte man Thumbnails anbieten, dafür gibt es die Icon-Property, die man zusätzlich angeben kann. Das muss aber das Modul selbst machen. Ich hab keinen Schimmer, ob irgendein Device das auswertet.



    Klingt vernünftig. So hatte ich mir das auch gedacht.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Ich meinte nicht die Struktur oder Class Metadata aus deinem Headerfile zurückgibt.
    Sondern eine Property Liste oder Tabelle aus Schlüsselwort und Wert.


    Damit ist das Modul unabhängiger vom Manager, man braucht keine Setter und Getter definieren usw.


    Der Manager arbeitet dann die Liste ab und wandelt die dann wenn gewünscht um.


    Dann brauchst du noch eine GetIcon bzw. GetThumbnail Funktion.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Also wenn ich das jetzt richtig verstanden habe, dann soll es nur noch eine Property-Liste aus Key-Value-Paaren geben und als Getter:


    GetProperty("Title").GetString() bzw. GetInteger() oder GetBoolean().


    und damit die Pflichtwerte besser identifiziert werden können, gibt es eine Reihe "static const char* TITLE = "title""-Definitionen, damit die Module, wissen was zu setzen ist?


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Zitat

    Das würde dann aber nur die Schnittstelle zum User-Frontend bedeuten, wenn ich alles auf SetTag festlegen würde.

    Nein, nicht zum User-Frontend, sondern zu den Modulen, die Dir die Medien bzw. Metadaten liefern.
    Johns hat es verstanden und Dir anders erklären können.


    Zitat

    Container, oder in deiner Definition Tags

    Nö - das ist ein Mistverständnis.


    Tags sind keine Container, sondern benannte Variablen mit einem Inhalt.
    Diese Variablen können Bezug zum Medium an sich (dem Mediumcontainer als TS oder MKV) haben, oder zu einem einzelnen Stream.
    Auch die ganzen MP3-Tags lassen sich dort ablegen.
    Ferner kann man die Tags auch verwenden um Stream-Attribute abzulegen, die eher seltener vorkommen, dann aber doch von Interesse sind.


    Zitat

    Was mir an der Struktur nicht wirklich gefällt, dass sie - was aus deiner Sicht genau so geplant wurde - komplett vom Standard weg geht.

    Das habe ich schon wiederholt versucht rüber zu bringen:
    Der Standard definiert den Datenaustausch zwischen unterschiedlichen Systemen, aber nicht deren internen Aufbau.


    Nimm z.B. SAP - die Software kann eine Vielzahl von Schnittstellenstandards bedienen, aber kein Schnittstellenstandard beeinflusst den internen Aufbau.


    Dein Datenmodell sollte sich daran orientieren, was Du an Daten hast. Also Deine Medien, Deine Metadaten, was auch immer.
    Dann solltest Du überlegen, welche Daten in eine Datenbank müssen und welche eher nicht.
    Erst danach solltest Du Dir Gedanken machen, wie Du die Schnittstelle befriedigen kannst.
    Schließlich machst Du kein Renderer-Device, das von den Daten anderer leben muss, sondern ein ContentDirectory-Device, welches Daten liefert.
    Deine Daten!


    Schreib doch einfach mal ein Testproggy, welches Dir die Daten zusammenträgt, die Du veröffentlichen willst - und zwar ohne nach der Schnittstelle zu schielen.
    Dann weißt Du, wie Du an die Daten kommst, weißt auch, welche Daten Du hast und kannst dann überlegen, wie Du weiter machen willst.


    Zitat

    Das macht die spätere Erweiterung und Aktuallisierung an Folgereleases der Standards schwieriger.

    Ganz im Gegenteil. Wenn Du zwischen internem Aufbau und Schnittstelle zu extenern Systemen unterscheidest, kannst Du viel flexibler auf Änderungen eingehen.
    Teile Dein Plugin gedanklich mal in Bausteine auf, denen Du Funktionalitäten und Verantwortlichkeiten zuordnest.
    Versuch dabei so vorzugehen, dass ein Baustein möglichst autark ist, d.h. so wenig wie möglich von anderen Bausteinen braucht.
    Dort wo Berührungspunkte unvermeidlich sind, sorge für eine klare Schnittstelle.
    So kannst Du die Komplexität der Aufgaben reduzieren und für eine stabilere Basis sorgen.


    Zitat

    ... warum eine Property nur 45 oder 255 Zeichen statt 1024

    Die Schnittstelle sagt nur, dass max. 1024 Zeichen erlaubt sind. Das bedeutet nicht, dass es immer 1024 Zeichen sein müssen.


    255 ist deshalb eine "magische" Grenze, weil bei vielen Datenbanken Felder bis 255 Zeichen Länge als interne Tabellenspalte behandelt werden. Über 255 Zeichen wird implizit ein Blob draus, der dann nicht mehr indiziert werden kann und einen Extra-Zugriff erfordert. Textfelder > 255 Zeichen machen den Datenzugriff langsamer - deshalb versucht jeder DB-Admin mit 255 Zeichen auszukommen, so lange es geht.
    Manchmal muss es trotzdem sein, dass man ein größeres Feld nimmt, aber das sollte wie gesagt gut überlegt sein.


    Zitat

    Die Entwickler sollen sich, wenn sie eine Erweiterung schreiben, ruhig mit dem Werk mal auseinander setzen, um zu begreifen, wie es funktioniert

    Hm, jetzt forderst Du etwas, was Du selbst nicht bereit bist zu tun?!?
    Du schnitzt ein Plugin für den VDR und bist nicht bereit, Dir anzuschauen, was der VDR bietet und warum er so ist wie er ist.


    Zitat

    Das ist meiner Meinung nach einer der Hauptgründe, warum viele UPnP/DLNA-Server/-Client-Kombinationen nicht funktionieren.

    Ich würde behaupten, dass es eher daran liegt, dass viele von der Schnittstellen-Definition ausgehen, ohne zu sehen, was sie wirklich ist, nämlich eine Schnittstellen-Definition.


    Zitat

    GetProperty("Title").GetString() bzw. GetInteger() oder GetBoolean().

    Das halte ich für suboptimal. Sowohl von der Lesbarkeit, als auch von der Laufzeit.
    Ein Funktionsaufruf ist prinzipiell als teuer einzustufen, deshalb nicht unnötig viele machen.
    Das gleiche kannst Du erreichen, mit

    Code
    GetStringProperty("Title")
    GetIntegerProperty("total")

    ist lesbarer und spart einen Funktionsaufruf.



    Gruß Gero

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

  • Zitat

    Schreib doch einfach mal ein Testproggy, welches Dir die Daten zusammenträgt, die Du veröffentlichen willst - und zwar ohne nach der Schnittstelle zu schielen.
    Dann weißt Du, wie Du an die Daten kommst, weißt auch, welche Daten Du hast und kannst dann überlegen, wie Du weiter machen willst.


    Wie mehrfach gesagt, das kann ich nicht. Ich weiß nicht welche Daten geliefert werden. Ich will die Module nicht durch meine interne Struktur kastrieren. Es ist und bleibt mir völlig unbekannt, was für Daten auf mich zukommen, deswegen muss ich diese so abbilden, wie es die Schnittstelle mir vorgibt, weil es ein Anforderungsdokument ist! Ich biete nur einen Service an, der die Daten von einer Datenbasis in eine UPnP-Funktionalität transkodiert. Es ist nicht meine Aufgabe mich um die Effizienz der Datenbasis zu kümmern. Es ist als solches ohnehin sinnlos, die Datenbank zu optimieren, weil SQLite intern eh nur mit long integer, strings und blobs arbeitet. Welchen Vorteil hätte ich also?


    Zitat

    Das halte ich für suboptimal. Sowohl von der Lesbarkeit, als auch von der Laufzeit.
    Ein Funktionsaufruf ist prinzipiell als teuer einzustufen, deshalb nicht unnötig viele machen.
    Das gleiche kannst Du erreichen, mit

    Code
    GetStringProperty("Title")
    GetIntegerProperty("total")


    ist lesbarer und spart einen Funktionsaufruf.


    Hmm.. is mir recht. Ändert am Funktionsumfang als solches nichts. Im Gegenteil, es könnte die "Property"-Klasse obsolete machen.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Zu den ständigen Forderungen nach einem Test-Proggy: auch dazu hatte ich mehrfach gebeten, dass DU das ja machen könntest, da ich es einfach nicht schaffe! Sowohl zeitlich als auch von der Lust her! Ich lasse mich gerne belehren, aber momentan sehe ich keinen Mehrwert mich damit tagelang zu beschäftigen, um dann doch wieder zu dem Schluss zu kommen, dass mir die Flexibilität genommen wird, weil ich meine interne Struktur auf eine externe gemappt werden muss.


    Also lieber Gero, mach mir ein Testprogramm, an dem ich effizient anhand einer SQLite (das ist meine Anforderung an das System, weil ich eine leichtgewichtige Datenbank haben möchte, du kannst auch gerne eine andere Datenbank welcher Art auch immer einsetzen, aber eben kein MySQL, weil es mit knapp 100MB einfach ein viel zu großes Mörderwerk wäre) Daten ein- und auslesen kann und darin nach den Anforderungen von UPnP und DLNA suchen kann (siehe UPnP:ContentDirectory, Abschnitt search, DLNA sagt lediglich, dass man zusätzlich noch in der Beschreibung und im Creator suchen können muss). Dann bilde mir das in einer Schnittstelle so ab, dass ein Entwickler ohne Probleme erkennt, welche Property der internen Struktur auf welche Property von UPnP mappt. Es MUSS am Ende aber, wie gesagt, möglich sein, die Anforderungen von UPnP und DLNA zu erfüllen, ohne dass die Manager die Arbeit der Module erledigen müssen (zum Beispiel zusätzliche Metadaten der Resourcen zu ermitteln, wie Größe der Datei, Protocolnfos, oder einfach nur Titel und Beschreibung.)


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Wie andere vorher schon geschrieben haben. Halte ich auch nicht viel von großen Tests,
    aber einfache Abschätzungen können helfen. Einmal 100000 Properties anlegen und darin suchen helfen beim Überlegen.
    Diese Tests sollten einfache 3 Zeiler sein. Bzw. können gleich dein Datenbank Modul testen.


    Also ich würde für ein Scanner Modul keine Property Klasse brauchen.
    Auch kein GetString usw. . Aber schaden tut es auch nicht.


    Für Pflichtproperties kann man auch anders herum arbeiten.


    z.b.:

    Code
    property_list = NewPicturePropertyList("Name", 1024, 768);
    Add("Aufnahme Datum", date);


    NewPicturePropertyList erzeugt die Leere Property Liste und fügt dann die ersten Elemente in Liste.


    Ansonsten lass dich von uns nicht mehr lange aufhalten, schreibe den Manager.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Zitat

    Halte ich auch nicht viel von großen Tests,
    aber einfache Abschätzungen können helfen.

    Hm, also das halte ich für einen großen Irrtum.


    Wie willst Du Abschätzungen machen, wenn Du keine Zeitbasis hast?


    Als ich mit CMP anfing habe ich auch über alle möglichen Datenstrukturen und Zugriffszeiten nachgedacht.
    Dann habe ich ein kleines Testproggy geschrieben, dass mit VDR-Mitteln die EPG-Daten einliest - erweitert um eine Zugriffssuche nach einem nicht vorhandenen Schlüssel.
    Das waren vielleicht 10 Zeilen Code.
    Aber die haben mir die Augen geöffnet.
    Ich bin mir sicher, dass manche hier anders diskutieren würden, wenn sie mehr Messungen machen würden.


    Zitat

    Also lieber Gero, mach mir ein Testprogramm ...


    Lach - und wovon träumst Du nachts?


    Meine (Test-)Proggies laufen bereits. Sogar mit benchmarking - aber Du bist ja nicht bereit die anzuschauen.
    Der Datenscanner mit Datenbank ist Teil von VdrAssistant und befüllt eine mysql-Datenbank. Läuft inzwischen seit eingen Jahren.
    Der Datenscanner ohne Datenbank ist der Serverpart (cmps) von CMP und lädt beim Start direkt alle Medien vom Dateisystem.
    Von beiden Anwendungen sind die Quältexte veröffentlicht, es steht Dir also frei, dort mal stöbern zu gehen.


    Den Tip ein Testproggy zu schreiben habe ich Dir nur gegeben, damit Du ein Gefühl für die Materie bekommst, über die Du hier diskutierst.
    Der Sinn eines Testproggies oder auch Prototypen ist der, dass man sich auf einen Aspekt konzentriert und alles andere ausblendet. Wenn's dann tut, kann man den Code in finale KLassen transferieren, verliert also nix.
    Prototyping ist "eigentlich" die Grundlage von jedem ernsthaften Software-Projekt, denn erst wenn man Messungen eines Prototypen hat, kann man seriöse Abschätzungen machen. Aber wenn Du meinst, sowas nicht zu brauchen ...


    Gruß Gero

    Ich bin verantwortlich für das, was ich schreibe, nicht für das, was Du verstehst!

  • Als ich mit CMP anfing habe ich auch über alle möglichen Datenstrukturen und Zugriffszeiten nachgedacht.
    Dann habe ich ein kleines Testproggy geschrieben, dass mit VDR-Mitteln die EPG-Daten einliest - erweitert um eine Zugriffssuche nach einem nicht vorhandenen Schlüssel.
    Das waren vielleicht 10 Zeilen Code.
    Aber die haben mir die Augen geöffnet.
    Ich bin mir sicher, dass manche hier anders diskutieren würden, wenn sie mehr Messungen machen würden.


    Ich weiß nicht, wie häufig ich es noch sagen muss. Du kümmerst dich um DEINE Daten. Ich kann das nicht. Ich stelle nur die Plugins für den VDR bereit, wo ich das bereits getan habe, ich stehe also mit den gleichen Erkenntnissen da, wie du. Ich weiß bereits, wie ich effizient die VDR-Daten abgreife. Es geht mir einzig und allein um die Anbindung aller anderen Profile. Du hast doch in deinem CMP auch berücksichtigt, dass DVD-Abbilder, Bilder und Audio-Dateien angeboten werden können. Du legst das für dich fest, weil du dir die Standards nicht reinziehen willst. Okay, kann ich verstehen, weil die Dokumente umfangreich und teilweise ziemlich kompliziert sind.


    Um die Diskussion zu begraben: du verwehrst dich gegen den Standard und implementierst deine eigene Welt. Ich implementiere vollständig nach Standard und lasse die ganze Welt zu. Was der bessere Weg ist, soll hier nicht mehr diskutiert werden. Ich habe hier die entsprechende Kritik der Datenstruktur mitgenommen, die Optimierung muss dann im Nachgang stattfinden, sobald alles fertig ist und die ersten Plugins angeboten werden können. Bitte deswegen keine Diskussion mehr über die Art und Weise der Datenstruktur, sondern allenfalls noch Dinge, die ich absolut vergessen habe (z.B. Icons und die seek-Funktion). Danke!


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Ich kann Toshiba TV und Xbox Client testen.
    Zur Not bastel ich den Bilderscanner, ich denke ich muß, die Metadaten auslesen,
    sowieso in mein Play Plugin einbauen.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Ich habe einen Xtreamer, nen Samsung TV, Win7 Rechner und nen Android-Smartphone. Da werden sich schon einige Tests ergeben. :)


    Der Samsung zeigt zumindest die Server-Icons an.


    Es wäre jedenfalls genial, wenn die Icons angezeigt werden, weil dann könnte man beim Tuner-Container die Sender-Logos einbinden.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • So... nachdem jetzt git wieder geht (Danke Tobi!) hier der aktuelle Stand der Schnittstelle.


    Die festen Standard-Properties der cMetadata sind, wie hier häufig vorgeschlagen wurde, dann noch in die Property-Liste verschoben worden. Die GetPropertyString(), GetPropertyBool() habe ich doch weggelassen, da die Multimap eine Reihe von Properties mit einem Key liefern kann und ich dann wieder iterieren müsste, was rein von der Anzahl der Funktionsaufrufe wahrscheinlich auf's gleiche hinauskommt.


    Die Property-Keys habe ich in einen eigenen Namespace verfrachtet, da ich die nicht in der Metadata-Klasse initialisieren kann.


    Die aktuelle Version wieder zur Diskussion: http://projects.vdr-developer.…er/entry/include/plugin.h


    Bitte seid wieder so nett und helft mir beim verbessern.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

Jetzt mitmachen!

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