Jump to content

C# .Net API Wrapper MediaServer


Siox

Recommended Posts

Danke dir. :)

 

Ich habe noch eine Frage zu den Thumbnails der Videos. Ich musste leider aus Performance Gründen auf die Implementation der mediafiles.html verzichten. Denn der Basiseinstieg funktioniert nur über eine Verzeichnisliste. (Die nächsten beiden Sätze bitte nicht falsch verstehen) Und das ist relativ ungünstig, weil es ehrlich gesagt nicht interessiert, wie die Videos abgelegt sind. Ich will die Videos. o:) Dabei habe ich folgenden SQL-Befehl abgefeuert:

SELECT objects.Object_ID, objects.Enabled, 
       objects.found, object_details.Details_ID, 
       objects.Ext, paths.idPath, objects.Filename, paths.Path, 
       object_details.channel, object_details.Added, 
       object_details.Description, object_details.Duration, 
       object_details.Info, object_details.Lastplayed, 
       object_details.Time, object_details.Titel, 
       object_details.filesize 
  FROM paths INNER JOIN objects 
       ON paths.idPath = objects.PathID 
             INNER JOIN object_details 
       ON objects.Detail_ID = object_details.Details_ID 
 WHERE found = 1

Das ist quasi der/das Basis SQL-Query den/welches ich dann entsprechend noch variiere. Leider habe ich keine Thumbnails finden können. Nun werden die Thumbnails ja über die vThumbs.exe erzeugt. Und ihr müsst dabei grundlegend Daten nehmen, welche bei jedem Video vorhanden sind. Ich habe mir das angeschaut und dachte mir: "Mathematisch könnte die Duration da ein Wörtchen mitspielen..." aber es kommt mir nicht in den Sinn, wie ihr das anstellt?

 

Könnt ihr das Geheimniss um den Namen der Thumbs lüften?

 

PS: Falls ihr einmal Fragen zu SQL-Datenbanken habt. Ich bin darin ... ausgebildet.

Link to comment
33 minutes ago, Siox said:

Könnt ihr das Geheimniss um den Namen der Thumbs lüften?

 

Das ist ein als Hash verwendeter CRC32-Wert über den in Kleinbuchstaben gewandelten UTF-16-Pfad und Dateinamen als dezimaler Integer. Im DMS berechnet das eine tabellengestützte in x86-Assembler geschriebene Routine.

 

40 minutes ago, Siox said:

PS: Falls ihr einmal Fragen zu SQL-Datenbanken habt. Ich bin darin ... ausgebildet.

 

Ich habe mich schon gefragt, ob du generell die DMS-Entwicklung mit deinen Fähigkeiten/Kenntnissen bereichern könntest.

 

Link to comment

Vielen Dank für die Antwort.

vor 22 Stunden schrieb Griga:

Das ist ein als Hash verwendeter CRC32-Wert über den in Kleinbuchstaben gewandelten UTF-16-Pfad und Dateinamen als dezimaler Integer. Im DMS berechnet das eine tabellengestützte in x86-Assembler geschriebene Routine.

Bei CRC32 bin ich direkt in die erwartete Falle gelaufen. Denn ich hatte damit relativ wenig zu tun. Und beim Programmieren noch gar nicht. Und bei dem Versuch es nach zu bilden ist mir schon beim Einlesen klar geworden. Nein, ohne Polynomial und Seed oder der Lookup Table kommst du da nicht weiter.

 

vor 22 Stunden schrieb Griga:

Ich habe mich schon gefragt, ob du generell die DMS-Entwicklung mit deinen Fähigkeiten/Kenntnissen bereichern könntest.

 

Ich würde das gerne machen. Ich habe dir einmal ein Beispiel reingestellt - Datenbank svcmediaVideo.db3. Man könnte Stück für Stück die DB in ein sauberes Konstrukt migrieren. Das Beispiel beschädigt keine Daten.

-- vorbereiten der Datenbank, wird wieder rückgängig gemacht am Ende des Scripts.
-- Zuerst die referentielle Integrität
PRAGMA foreign_keys = ON;
-- Wir setzen eine Zahl, welche nicht 0 sein darf auf NULL, das hat etwas mit der neuen Tabelle objectsTemp zu tun
-- damit könnte man die Tabelle objects in die referentielle Integrität migrieren
UPDATE objects SET Parent_ID = null WHERE Parent_ID = 0;

-- Neue Tabelle objectsTemp anlegen (identisch zu objects aber mit Änderungen)
-- Die Parent_ID kann nun nur noch mit Werten belegt werden, wenn ein Wert in der Spalte Object_ID existiert
-- Die Spalte PathID referenziert nun auf die Spalte idPath in paths
-- Autoincrement in Object_ID ist eigentlich nicht nötig, aber durch Parent_ID ist das leider für
-- spätere Migrationen sehr sinnvoll.
CREATE TABLE objectsTemp (
			Object_ID integer PRIMARY KEY AUTOINCREMENT,
			Parent_ID integer DEFAULT null REFERENCES objectsTemp(Object_ID) ON DELETE RESTRICT,
			Detail_ID integer DEFAULT null,
			Type integer,
			PathID Integer REFERENCES paths(idPath) ON DELETE RESTRICT,
			Filename text collate SYSTEMNOCASE,
			sortname text collate SYSTEMNOCASE,
			Ext text collate SYSTEMNOCASE,
			Enabled Boolean Default 1,
			found Boolean Default 0
			);
			
-- die neue Tabelle mit den gleichen Werten füllen wie objects
-- durch die Order by sorgen wir dafür, dass auch immer der kleinere Wert zuerst in Object_ID geschrieben wird,
-- damit wir keinen Fehler erhalten, weil in Parent_ID vielleicht ein Wert eingefügt wird, der in Object_ID noch nicht existiert.
INSERT INTO objectsTemp SELECT * FROM objects ORDER BY Object_ID;

-- Wenn jetzt z.B. folgendes versucht wird, wird die Datenbank streiken
DELETE FROM paths WHERE paths.idPath > 0;

-- Oder das geht auch nicht mehr, sofern die Object_ID 1 in der Spalte Parent_ID existiert.
DELETE FROM objectsTemp WHERE Object_ID = 1;

-- Rückgängig machen der Änderungen
UPDATE objectsTemp SET PARENT_ID = Null;
DROP TABLE objectsTemp;
UPDATE objects SET Parent_ID = 0 WHERE objects.Parent_ID IS NULL;
PRAGMA foreign_keys = OFF;

Das ist nur ein Beispiel und kann auch so nicht direkt eingesetzt werden, weil ich nicht weiß wie ihr die Daten überhaupt in den Tabellen ablegt. Wenn die referentielle Integrität wie in meinem Beispiel erzwungen wird, dann ist es hier z.B. wichtig das zuerst ein Eintrag in paths existiert, bevor in objects ein Eintrag überhaupt eingetragen werden kann. Leider ist in der aktuellen Version von Objects wohl ein Denkfehler, somit scheitert die Bindung z.B. an object_details, weil diese eigentlich erst nach objects befüllt werden sollte. Hier aber eine Abhängigkeit zwischen beiden Tabellen besteht welche man so, wie aktuell gedacht, nicht auflösen kann. Es würde zwar irgendwie funktionieren, aber es macht nicht wirklich Sinn.

 

 

Link to comment
On 20.2.2018 at 9:38 PM, Siox said:

Bei CRC32 bin ich direkt in die erwartete Falle gelaufen.

 

Du könntest den Code bei Bedarf haben. Ist aber wie gesagt x86-Assembler. Es gibt auch eine auskommentierte leichter durchschaubare Delphi-Variante, von der ich aber nicht 100pro weiß, ob sie der Assembler-Variante entspricht. Müsste man probieren...

 

On 20.2.2018 at 9:38 PM, Siox said:

Ich würde das gerne machen.

 

Voraussetzung wäre zunächst Betatester-Status mit Zugang zu weiteren Ressourcen wie interne Testversionen und Diskussionen. Mit Verpflichtungen ist es nicht verbunden, aber wer auf dem Level ehrenamtlich mitwirken will, sollte sich zunächst fragen, ob er das längerfristig leisten will und kann. Nur für ein paar Wochen und ein paar vereinzelte Beiträge lohnt es sich nicht.

 

On 20.2.2018 at 9:38 PM, Siox said:

Man könnte Stück für Stück die DB in ein sauberes Konstrukt migrieren. Das Beispiel beschädigt keine Daten.

 

Da bin ich ja beruhigt :)

 

Deinem Datenbank-Beispiel kann ich nicht ganz folgen. Mir ist nicht klar, wozu der Eingriff dienen soll. Etwas zu abstrakt für meinen Kenntnisstand... was an praktischem Nutzwert kommt dabei heraus? Diese Frage stellt sich bei hiesigen Entwicklungen immer zuerst.

 

Letztes Jahr war angedacht, dass eine Informatikstudentin in ihrer Praxisphase die DMS-Datenbanken auf eine gesunde Basis stellt. Sie hatte dazu angemerkt, dass eine DB-Restrukturierung normalerweise eine Standardaufgabe ist, wenn es nur eine bestimmte DB z.B. bei einer Firma betrifft, aber eine ganz andere Sache, wenn es sich um eine kompatible Umstellungen von tausenden bei Anwendern vorhandenen DBs in unbekanntem und eventuell fehlerhaftem Zustand handelt. Das wäre eine besondere Herausforderung.

 

Zu den Arbeiten ist es dann aber aus Zeitgründen nicht gekommen. Nichtsdestotrotz war ich in den letzten Monaten schwerpunktmäßig in dem Themenbereich tätig, angefangen bei einer Analyse, was da eigentlich intern alles abläuft. Neben eher geringfügigen Ergänzungen/Anpassungen in den Datenbank-Strukturen, z.B. neue Spalten, die aus praktischen Gründen erforderlich waren, hat eine Renovierung des Überbaus viel Raum eingenommen, d.h. der Strukturen, die auf die Datenbanken zugreifen. Sie waren zum großen Teil ebenso schlecht und unzweckmäßig wie die DBs selbst designed und enthielten gravierende Fehler, z.B. das Schreiben von uninitialisierten zufälligen Werten in die DB ;)

 

Kurz gesagt habe ich hauptsächlich unter pragmatischen Gesichtspunkten das durchgeführt, wozu meine Fähigkeiten und Kenntnisse ausreichen und was ohne eine Komplett-Restrukturierung machbar war. So unschön wie die DMS-DBs auch designed sind, sie funktionieren im wesentlichen, und ich versuche, das Beste draus zu machen. Das Ergebnis ist eine verbesserte Basis für zukünftige Entwicklungen, ein paar zusätzliche Möglichkeiten für Anwender sowie (hoffentlich) eine verbesserte Stabilität der ganzen Angelegenheit.

 

Link to comment
vor 12 Stunden schrieb Griga:

 

Du könntest den Code bei Bedarf haben. Ist aber wie gesagt x86-Assembler. Es gibt auch eine auskommentierte leichter durchschaubare Delphi-Variante, von der ich aber nicht 100pro weiß, ob sie der Assembler-Variante entspricht. Müsste man probieren...

 

 

Ich denke mal es gibt einen anderen Weg. Weil alles was "quasi" irgendwo doppelt erledigt wird, muss auch doppelt gepflegt werden. Da dieses Bild nicht ständig benötigt wird, reicht es auch aus, wenn es zur Laufzeit vom Server bezogen wird. Im Wrapper halte ich es sonst so, dass ich die Daten vom Server hole und dem aktuellen Zustand im Arbeitsspeicher vorhalte. Aber es reicht aus, wenn das Bild oder eine kleine Anzahl von Bildchen immer dann über die API bezogen werden, wenn diese auch benötigt werden. Das reduziert das Datenaufkommen und im Wrapper muss nichts gepflegt werden, wenn ihr die Erstellung der Vorschaubilder ändert. ;)

 

vor 12 Stunden schrieb Griga:

Deinem Datenbank-Beispiel kann ich nicht ganz folgen. Mir ist nicht klar, wozu der Eingriff dienen soll. Etwas zu abstrakt für meinen Kenntnisstand... was an praktischem Nutzwert kommt dabei heraus? Diese Frage stellt sich bei hiesigen Entwicklungen immer zuerst.

 

Letztes Jahr war angedacht, dass eine Informatikstudentin in ihrer Praxisphase die DMS-Datenbanken auf eine gesunde Basis stellt. Sie hatte dazu angemerkt, dass eine DB-Restrukturierung normalerweise eine Standardaufgabe ist, wenn es nur eine bestimmte DB z.B. bei einer Firma betrifft, aber eine ganz andere Sache, wenn es sich um eine kompatible Umstellungen von tausenden bei Anwendern vorhandenen DBs in unbekanntem und eventuell fehlerhaftem Zustand handelt. Das wäre eine besondere Herausforderung.

 

Zu den Arbeiten ist es dann aber aus Zeitgründen nicht gekommen. Nichtsdestotrotz war ich in den letzten Monaten schwerpunktmäßig in dem Themenbereich tätig, angefangen bei einer Analyse, was da eigentlich intern alles abläuft. Neben eher geringfügigen Ergänzungen/Anpassungen in den Datenbank-Strukturen, z.B. neue Spalten, die aus praktischen Gründen erforderlich waren, hat eine Renovierung des Überbaus viel Raum eingenommen, d.h. der Strukturen, die auf die Datenbanken zugreifen. Sie waren zum großen Teil ebenso schlecht und unzweckmäßig wie die DBs selbst designed und enthielten gravierende Fehler, z.B. das Schreiben von uninitialisierten zufälligen Werten in die DB ;)

 

Kurz gesagt habe ich hauptsächlich unter pragmatischen Gesichtspunkten das durchgeführt, wozu meine Fähigkeiten und Kenntnisse ausreichen und was ohne eine Komplett-Restrukturierung machbar war. So unschön wie die DMS-DBs auch designed sind, sie funktionieren im wesentlichen, und ich versuche, das Beste draus zu machen. Das Ergebnis ist eine verbesserte Basis für zukünftige Entwicklungen, ein paar zusätzliche Möglichkeiten für Anwender sowie (hoffentlich) eine verbesserte Stabilität der ganzen Angelegenheit.

 

 

Ich versuche das mal an einem Beispiel: Ihr habt euch die Mühe gemacht und ein Datenbanksystem integriert. (w00t) Ihr habt sogar die elementaren Abhängigkeiten zwischen den Tabellen erstellt und nutzt diese. z.B. Paths-Table und Objects-Table über die PathID oder Objects und ObjectDetails über die Details_ID. Das ist auch gut verstanden und umgesetzt. Hier und da merkt man zwar, das es mehr als einen Autor gegeben haben muss oder einfach zu viel Zeit dazwischen lag, als die DB erweitert wurde, aber das ist völlig nebensächlich.

 

Aber was dann Schade ist. Die Datenbank schützt nicht die eigene Integrität. Sie nutzt nicht die Möglichkeiten, welche jetzt alle vom DMS angedeckt werden müssen.

 

Datenintegrität gegen versehentliches Löschen:

Es scheint so als schütze niemand die Integrität der Daten. Ich kann aus der Tabelle paths einfach ein paar Zeilen löschen und niemand sieht, dass es aber Abhängigkeiten zur Tabelle objects gibt. Der DMS bewahrt diese Abhängigkeit vielleicht, aber warum soll sich der DMS darum kümmern, wenn es eine kostenlose Funktion dazu in der SQL-Datenbank gibt? Wenn ich darin, über den SQL-Browser etwas lösche, mag es aus versehen oder mit Absicht sein, dann ist niemand da, der sagt: "Nein mein Freundchen du beschädigst gerade die Datenintegrität, das geht nicht."

 

Ein anderer Punkt ist: Ich kann in der Tabelle objects meine eigenen Daten eintragen. Und niemand schaut mir auf die Finger und sagt: "Nein, nein du brauchst auch einen gültigen Pfad und du brauchst auch einen gültigen Object_Details Eintrag". Ich kann da als IDs auch 9999999 eintragen, die Datenbank schluckt das ohne murren. Da passt niemand auf.

 

Am Ende könnte es dazu kommen, dass du Support leistest und evtl. herumratest wieso und weshalb die Fehler denn entstanden sind, weil du als Entwickler diese eine Fehlerquelle nicht ausgeschlossen hast. Auch meine Abfrage 2 Etagen weiter oben funktioniert dann nicht mehr und rennt in einen Fehler, weil die Integrität nicht mehr vorhanden ist. Und dann stehe ich als Entwickler da und suche einen Fehler, der eigentlich im Datenbank-Design zu suchen wäre. Zusätzlich meckern die Leute und meinen: "Geht nicht, Mist ...."

 

Es gibt aber auch andere kompfortablere Gründe.

Kaskadierendes Löschen:

Zusätzlich zur Integrität kann man auch kompfortabel löschen lassen oder ändern lassen. Wenn z.B. ein Pfad nicht mehr existiert, kann dieser eigentlich aus der Datenbank gelöscht werden. Damit du den Pfad aber löschen kannst, musst du auch in Objects die Videos dazu löschen. Weil aber dazu Object_Details existieren, musst du auch die Object_Details löschen. Das bedeutet du musst viel in Delphi programmieren. Aber es geht viel einfacher, wenn die Abhängigkeiten als solche, auch in der Datenbank gekennzeichnet sind. In meinem Beispiel als "ON DELETE RESTRICT" (heißt beim löschen verweigern, wenn eine Abhängigkeit erkannt wird). Diese kann man auch ändern in "ON DELETE CASCADE". Das bewirkt dann folgendes. Wenn du einen Pfad aus der Tabelle paths löschst, werden alle Einträge in Objects gelöscht welche als Abhängigkeit erkannt werden. Hat man dieses CASCADE zusätzlich von Objects zu Object_Details gesetzt, dann funktioniert das allerdings nicht in Object_Details, weil hier Object_Details das Elternelement ist und nur von Parent zu Child kaskadierend gelöscht wird (müsste man ändern). Also die Datenbank löscht dann folgendes in dieser Reihenfolge automatisch:

 

  • Alle Einträge in objects welche als Abhängigkeit zum Pfad erkannt wurden über die PathID.
  • Keine Einträge in Object_Details. (Eigentlich Schade)
  • Den entsprechenden Eintrag in paths.

Dies erhält insgesamt die Datenintegrität. Und das ist eindeutig die Aufgabe einer Datenbank. Du musst auch das kaskadierende nicht überprüfen, weil es Aufgabe der Datenbank ist dies sicherzustellen. Wenn man die Features nicht nutzt kann man auch in Textdateien speichern. Das ist genauso sicher, wie die aktuelle Lösung.

 

Wenn man zusätzlich die Einträge in Object_Details löschen möchte müsste man folgendes machen.

  1. Eine Spalte ObjectsID in Object_Details erstellen
  2. Die richtige Object_ID in die Spalte ObjectsID der Tabelle Object_Details eintragen
  3. Die Spalte Detail_ID in Objects löschen
  4. Die Anhängigkeiten zwischen den Spalten Object_Details.ObjectID und Objects.Object_ID  beider Tabellen herstellen. (In SQLite leider nicht nachträglich möglich)

Also insgesamt, kannst du dann bestimmt einige Zeilen Delphi löschen und es als Optimierung durch Outsourcing von Kompetenzen bezeichnen. Und ich kann dazu wirklich ein Lied singen.

 

Um jetzt aber zum einen die Integrtät sicher zustellen muss man fast so vorgehen, wie ich es oben einmal kurz geschildert habe, weil SQLite keine Änderungen von Beziehungen an bestehenden Tabellen zulässt. Dazu müsste man die aktuelle Tabelle umbenennen, die neue Tabelle erzeugen und die Daten dann übernehmen. Nichts anderes macht da das Beispiel von mir oben, nur das da die TempTable mit den Beziehungen erzeugt wird.

Am Delphi-Code müsste man entweder nichts oder nur die Reihenfolge ändern. Aber ich denke, dass ihr da gar nichts ändern müsst, weil ohne idPath ein Eintrag in Objects keinen Sinn macht. Außer ihr berechnet die idPath selbst und tragt zuerst eine Zeile zum Video in Objects ein und erst dann in Paths. Insgesamt steht dir dann aber eine Datenbank zur Seite, welche dir schon beim Programmieren sagt: "Nein, du hast das nicht bedacht!". Das entspannt die Entwicklung, weil die Datenbank auf dich aufpasst und nicht umgekehrt.

 

Das Gesamte ist trotzdem etwas komplizierter, aber diese Datenbanken, lassen sich in saubere Konstrukte ändern. Dazu würde es eines Migrationskonzeptes bedürfen. Heißt man definiert den gewünschten Endzustand und definiert dann die einzelnen Schritte, wie man dies gezielt umsetzt und was das für die Anwender bedeutet, wenn also z.B. jemand von Version 1 auf Version 10 springt, weil er die letzten Änderungen nicht mitgegangen ist. Gegebenfalls definiert man "Meilensteine" ab derer man eine Unterstützung früherer Versionen als Neuinstallation betrachtet. Also nichts anderes als "Datenbank neu aufbauen". Aber ich weiß auch, dass diese letzten Sätze meistens schon das Todesurteil für solche Vorhaben sind, weil bereits Abhängigkeiten außerhalb der eigenen Reichweite existieren, die ein Risiko darstellen, welches nicht unbedingt eingegangen werden muss. Bisher hat es ja funktioniert. :whistle:

 

Gruß

Edited by Siox
Link to comment
vor 12 Stunden schrieb Griga:

Voraussetzung wäre zunächst Betatester-Status mit Zugang zu weiteren Ressourcen wie interne Testversionen und Diskussionen. Mit Verpflichtungen ist es nicht verbunden, aber wer auf dem Level ehrenamtlich mitwirken will, sollte sich zunächst fragen, ob er das längerfristig leisten will und kann. Nur für ein paar Wochen und ein paar vereinzelte Beiträge lohnt es sich nicht.

 

Wäre kein Problem. Der DMS ist bei mir so fest integriert, wie der Wasserhahn in Küche und Bad. Und ich nutze den DVBViewer gefühlt schon immer. Aber wohl erst seit: 2009? glaube ich. Den RecordingService (DMS) seit irgendwann einmal. War nicht so einfach das Konzept zu verstehen. Aber nun ist er nicht mehr wegzudenken.

 

Ehrenamtlich ist auch kein Problem: Habe guten Job, über die Bezahlung lässt sich ja immer streiten. Für den DMS stelle ich meine Freizeit gerne zur Verfügung. Immerhin belohnt er ja auch meine restliche Freizeit. Dafür ist diese "Frei"Zeit natürlich nicht uneingeschränkt verfügbar. Weswegen ich gerne wieder auf ein Konzept verweise.

 

Gruß

Link to comment

So, jetzt noch mal hierzu. Die letzten Tage war ich durch andere Themen besetzt.

 

On 20.2.2018 at 9:38 PM, Siox said:

Bei CRC32 bin ich direkt in die erwartete Falle gelaufen.

 

Hälst du es für sinnvoll, die Ermittlung von Vorschaubild-Dateinamen (also die CRC32-Berechnung) über das DMS API anzubieten? Falls ja, was wäre dein Bedarf/Vorschlag hinsichtlich Input/Output?

 

On 22.2.2018 at 5:41 PM, Siox said:

Ich versuche das mal an einem Beispiel: Ihr habt euch die Mühe gemacht und ein Datenbanksystem integriert.

 

Lars hat das früher gemacht. Seit seinem Abschied versuche ich, mit seinen Hinterlassenschaften zurechtzukommen und das Beste draus zu machen.

 

Ich denke, ich habe jetzt verstanden, worauf du hinauswillst. Manchmal liegt's ja nur an der Sprache: Was will der? Migrieren? Datenintegrität? Die Vokabeln kommen hier normalerweise nicht vor :)

 

Zur Zeit ist das, was du angedacht hat, für die Arbeiten am DMS eher nicht relevant. Delphi Wrapper kümmern sich um Schreib/Löschzugriffe auf die Datenbanken und sorgen dafür, dass keine "hängenden" Referenzen entstehen. Insofern gibt es in der Hinsicht keine dringend zu lösenden Probleme. Für Anwender brächte eine solche Umgestaltung keine Vorteile, sondern eher Nachteile, wenn sie zu einer vorherigen DMS-Version zurückkehren möchten, weil sie in ihrem Kontext besser läuft - das kommt immer mal wieder vor. Wenn eine neue Version die Datenbanken so umstruktiuriert hat, dass ältere Versionen beim Zugriff scheitern, geht das schlecht. ;)

 

Umgestaltungen mit Kompatibilitäts-Brüchen müssen gut vorbereitet sein, z.B. durch ein oder zwei Releases, die noch mit der bisherigen Datenbankstruktur arbeiten, aber auch mit einer zukünftigen neuen zurechtkommen, oder indem man allen Datenbanken neue Dateinamen gibt, so dass die alten erst mal unberührt stehenbleiben. Und wenn man in der Hinsicht schon Aufwand treibt, sollten in dem Zuge gleich weitere Umgestaltungen stattfinden, damit man den Prozess nicht mehrfach durchlaufen muss.

 

Ehrenamtlich Mitwirkende mit professionellem Hintergrund haben erfahrungsgemäß oft Schwierigkeiten, mit der hiesigen Arbeitsweise "in tune" zu kommen, oder krasser gesagt, sich auf das hiesige Niveau herabzubegeben. Daran sind schon vielversprechende Ansätze für eine Kooperation gescheitert bzw. waren für die DVBViewer/DMS-Entwicklung eher hinderlich, weil es viel Zeit gekostet hat, wiederholt zu erläutern, warum Verbesserungsvorschläge hier nicht realisierbar / nicht angebracht / mit praktischen Erfordernissen nicht vereinbar sind. Wer sich hier (mit Betatester-Status) einklinken will, tut gut daran, sich den Betrieb erst mal etwas anzuschauen. Was hier anliegt und wobei Hilfe gebraucht wird, ist oft wesentlich trivialer und "handfester" als Ideen für konzeptionelle Umgestaltungen.

 

Link to comment
vor 13 Stunden schrieb Griga:

So, jetzt noch mal hierzu. Die letzten Tage war ich durch andere Themen besetzt.

Das ist kein Thema, weil ich die Zeit direkt in den Wrapper investiert habe. :)

 

vor 13 Stunden schrieb Griga:

Hälst du es für sinnvoll, die Ermittlung von Vorschaubild-Dateinamen (also die CRC32-Berechnung) über das DMS API anzubieten? Falls ja, was wäre dein Bedarf/Vorschlag hinsichtlich Input/Output?

Nein, es reicht wenn die Bildchen über die mediafiles.html zur Verfügung stehen. Und das sind sie ja schon. Ich habe auch die PathID so kann ich das recht leicht über PathID und Filename filtern. Das passt erst einmal. Außer du möchtest gerne das Thumb über die ObjectID zusätzlich ausgeben, da wäre ich nicht abgeneigt. Also so etwa: mediafiles.html?objid=3920&upnp=1&thumbs=1 Weil die ObjectID liefert ihr ja auch mit (siehe objid).

 

Spoiler

<?xml version="1.0" encoding="utf-8" ?>
<videofiles>
  <file name="-01- TELEKOLLEG Physik - Elektrizität - Transformatoren.mpg" objid="163" title="-01- TELEKOLLEG Physik - Elektrizität - Transformatoren" dur="1771" hres="720" vres="576">
    <thumb>thumbnails/video/3236465894_SM.jpg</thumb>
  </file>
  <file name="-02- TELEKOLLEG Physik - Elektrizität - Elektrische Ladung.mpg" objid="164" title="-02- TELEKOLLEG Physik - Elektrizität - Elektrische Ladung" dur="1726" hres="720" vres="576">
    <thumb>thumbnails/video/67811491_SM.jpg</thumb>
  </file>
  <file name="-03- TELEKOLLEG Physik - Elektrizität - Elektrisches Feld.mpg" objid="165" title="-03- TELEKOLLEG Physik - Elektrizität - Elektrisches Feld" dur="1692" hres="720" vres="576">
    <thumb>thumbnails/video/902787126_SM.jpg</thumb>
  </file>
  <file name="-04- TELEKOLLEG Physik - Elektrizität - Elektrische Spannung.mpg" objid="166" title="-04- TELEKOLLEG Physik - Elektrizität - Elektrische Spannung" dur="1697" hres="720" vres="576">
    <thumb>thumbnails/video/1342228837_SM.jpg</thumb>
  </file>
  <file name="-05- TELEKOLLEG Physik - Elektrizität - Elektrische Arbeit und Leistung.mpg" objid="167" title="-05- TELEKOLLEG Physik - Elektrizität - Elektrische Arbeit und Leistung" dur="1771" hres="720" vres="576">
    <thumb>thumbnails/video/2378570467_SM.jpg</thumb>
  </file>
  <file name="-06- TELEKOLLEG Physik - Elektrizität - Verzweigter Stromkreis.mpg" objid="168" title="-06- TELEKOLLEG Physik - Elektrizität - Verzweigter Stromkreis" dur="1789" hres="720" vres="576">
    <thumb>thumbnails/video/3215266225_SM.jpg</thumb>
  </file>
  <file name="-07- TELEKOLLEG Physik - Elektrizität - Elektromagnetismus.mpg" objid="169" title="-07- TELEKOLLEG Physik - Elektrizität - Elektromagnetismus" dur="1791" hres="720" vres="576">
    <thumb>thumbnails/video/3336055506_SM.jpg</thumb>
  </file>
  <file name="-08- TELEKOLLEG Physik - Elektrizität - Kraft auf bewegte Ladung.mpg" objid="170" title="-08- TELEKOLLEG Physik - Elektrizität - Kraft auf bewegte Ladung" dur="1716" hres="720" vres="576">
    <thumb>thumbnails/video/3283528806_SM.jpg</thumb>
  </file>
  <file name="-09- TELEKOLLEG Physik - Elektrizität - Elektromagnetische Induktion.mpg" objid="171" title="-09- TELEKOLLEG Physik - Elektrizität - Elektromagnetische Induktion" dur="1791" hres="720" vres="576">
    <thumb>thumbnails/video/3556099110_SM.jpg</thumb>
  </file>
  <file name="-10- TELEKOLLEG Physik - Elektrizität - Wechselspannung.mpg" objid="172" title="-10- TELEKOLLEG Physik - Elektrizität - Wechselspannung" dur="1778" hres="720" vres="576">
    <thumb>thumbnails/video/531631132_SM.jpg</thumb>
  </file>
</videofiles>

 

 

 

vor 13 Stunden schrieb Griga:

Lars hat das früher gemacht. Seit seinem Abschied versuche ich, mit seinen Hinterlassenschaften zurechtzukommen und das Beste draus zu machen.

 

Ich denke, ich habe jetzt verstanden, worauf du hinauswillst. Manchmal liegt's ja nur an der Sprache: Was will der? Migrieren? Datenintegrität? Die Vokabeln kommen hier normalerweise nicht vor :)

 

Zur Zeit ist das, was du angedacht hat, für die Arbeiten am DMS eher nicht relevant. Delphi Wrapper kümmern sich um Schreib/Löschzugriffe auf die Datenbanken und sorgen dafür, dass keine "hängenden" Referenzen entstehen. Insofern gibt es in der Hinsicht keine dringend zu lösenden Probleme. Für Anwender brächte eine solche Umgestaltung keine Vorteile, sondern eher Nachteile, wenn sie zu einer vorherigen DMS-Version zurückkehren möchten, weil sie in ihrem Kontext besser läuft - das kommt immer mal wieder vor. Wenn eine neue Version die Datenbanken so umstruktiuriert hat, dass ältere Versionen beim Zugriff scheitern, geht das schlecht. ;)

 

Umgestaltungen mit Kompatibilitäts-Brüchen müssen gut vorbereitet sein, z.B. durch ein oder zwei Releases, die noch mit der bisherigen Datenbankstruktur arbeiten, aber auch mit einer zukünftigen neuen zurechtkommen, oder indem man allen Datenbanken neue Dateinamen gibt, so dass die alten erst mal unberührt stehenbleiben. Und wenn man in der Hinsicht schon Aufwand treibt, sollten in dem Zuge gleich weitere Umgestaltungen stattfinden, damit man den Prozess nicht mehrfach durchlaufen muss.

 

Ehrenamtlich Mitwirkende mit professionellem Hintergrund haben erfahrungsgemäß oft Schwierigkeiten, mit der hiesigen Arbeitsweise "in tune" zu kommen, oder krasser gesagt, sich auf das hiesige Niveau herabzubegeben. Daran sind schon vielversprechende Ansätze für eine Kooperation gescheitert bzw. waren für die DVBViewer/DMS-Entwicklung eher hinderlich, weil es viel Zeit gekostet hat, wiederholt zu erläutern, warum Verbesserungsvorschläge hier nicht realisierbar / nicht angebracht / mit praktischen Erfordernissen nicht vereinbar sind. Wer sich hier (mit Betatester-Status) einklinken will, tut gut daran, sich den Betrieb erst mal etwas anzuschauen. Was hier anliegt und wobei Hilfe gebraucht wird, ist oft wesentlich trivialer und "handfester" als Ideen für konzeptionelle Umgestaltungen.

 

 

Erst einmal Danke für die Blumen. Doch dafür wäre es zu früh. Ich bin völlig bei dir und denke dass meine letzten Sätze, in den verherigen Posts, genau deine Schilderung wiedergespiegelt haben:

Zitat

Umgestaltungen mit Kompatibilitäts-Brüchen müssen gut vorbereitet sein, z.B. durch ein oder zwei Releases, die noch mit der bisherigen Datenbankstruktur arbeiten, aber auch mit einer zukünftigen neuen zurechtkommen, oder indem man allen Datenbanken neue Dateinamen gibt, so dass die alten erst mal unberührt stehenbleiben.

 Ich möchte es auch dabei belassen. Und ich hatte da nicht nur 2 Releases im Hinterkopf, sondern eher mehr. (langsam eben)

 

Zitat

Ehrenamtlich Mitwirkende mit professionellem Hintergrund haben erfahrungsgemäß oft Schwierigkeiten, mit der hiesigen Arbeitsweise "in tune" zu kommen, oder krasser gesagt, sich auf das hiesige Niveau herabzubegeben.

Und dafür Danke für die Blumen...

 

Ich wäre gerne Beta-Tester. Den Rest wird die Zukunft bringen... :bye:

Edited by Siox
Link to comment
  • 2 weeks later...

Das Projekt nimmt langsam Gestalt an. Die letzten Änderungen leider nur in Englisch. Aber mittlerweile lässt sich damit schon gut arbeiten. :bye:

 

v0.4.1.0
  - added EPG Clear to EPGList
  - added classes TimerList, TimerItem and TimerOptions to represent the timers of the DMS
  - changed: class EpgList - the epgChannelID has been replaced by ChannelItem
  - renamed function GetChannelListAsync(long channelID) to GetChannelListByChannelIDAsync(long channelID)
  - renamed function GetChannelListAsync(string epgChannelID) to GetChannelListByEpgChannelIDAsync(long epgChannelID)

v0.4.0.1
  - added Image to VideoFileItem
  - added MediaFileList and MediaFileItem to parse mediafiles.html for VideoFiles
    - used only to get the mediafile thumb in the VideoFileItem

v0.4.0.0
  - changed Datatype of EpgChannelID from string to long
  - renamed ID to ChannelID in class ChannelSubItem
  - added classes EpgList, EpgItem for EPG support
  - added Enum EpgSearchOptions for EPG Search
  - added class Lists to Helper, for removing double codeinstructions
  - rewritten base features of each List to get the data from the server
  - added CreateM3UFile to ChannelItem, to get a UPnPStream for playback that channel on a player of your choice
  - added GetEpgListNow to ChannelItem to get the current EPGList entry
  - added GetEpgList to ChannelItem to get the complete EPGList from this channel

Die Neuerungen sind natürlich auf GitHub immer aktuell vorhanden.

Link to comment
  • 2 weeks later...

Ups es sind doch einige Bugs vorhanden gewesen. Die aktuelle Version arbeitet mit der DMS-Version 2.0.4.0.

 

v0.4.2.0

    changed: ChannelItem, the type of ChannelID was changed from long to string: The default ChannelID in the DMS is IDOfTheChannel|ChannelName.
    changed: ChannelList, parameters channelID from long to string.
    renamed: ChannelList, function GetChannelListByChannelIDAsync(long channelID) to GetChannelListAsync(string channelID).
    renamed: ChannelList, function GetChannelListByEpgChannelIDAsync(long epgChannelID) to GetChannelListAsync(long epgChannelID).
    added: ChannelList, added function GetChannelListAsync(ChannelItem channelItem) to get a ChannelList with one channel from the DMS. The ChannelItem in this case must be filled only with a ChannelID.
    fix: TimerItem, the type of the property Enabled was changed from bool to int.
    fix: TimerItem, the type of the property Channel was changed from string to ChannelItem.
    add: TimerItem, add property Type for the type of the timer.
    fix: TimerList, correct parameters to deserialize the XML-Data.
    removed: RecordingItem, the property EventID was removed. This is maybe current temporary, so I can check the references.
    fix: EpgItem, the XML-Element name "Description" was changed to the lower case name "description".

 

Edited by Siox
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...