![]() |
Delphi-Version: XE
ID3v2 Chapter Baumstruktur erzeugen
Erstmal Hallo an euch alle.
Das ist mein erstes Thema was ich heute schreibe. Also bitte nicht so streng sein mit mir. Was die Erklärung der Frage angeht, weiß ich noch nicht so ganz wie ich sie formulieren soll. :) Ich lese aus einer MP3 Datei, alle gefundenen Inhaltsverzeichnisse und Kapitel in zugehörige Klassen ein. Die zwei Klassen stehen hier.
Delphi-Quellcode:
Danach packe ich die jeweiligen Klassen in ein TOjectList und zum Schluss übergebe ich Sie der Funktion "GetTreeText".
type TCHAP=class // Kapitel
ElementID: String; // eindeutiger Bezeichner (z.b. ch1) end; type TCTOC=class //Inhaltsverzeichnisse ElementID: String; // eindeutiger Bezeichner (z.b. TOC1) TopLevel: Boolean; // Wurzelknoten EntryCount: Integer; // Anzahl der Childelemente ElementIDList: array of String; //Childelementen Liste (z.b. TOC2, ch1, ch2, TOC3) end;
Delphi-Quellcode:
Diese Funktion sollte mir in folgender Form ein String zurück geben:
function GetTreeText(Playlist:TObjectList): String;
procedure InlineGetTreeText(ElementID: String = ''; space: string = ''); var i, y: Integer; Begin if Playlist.Count <> 0 then Begin for i := 0 to Pred(Playlist.Count) do Begin if Playlist.Items[i].ClassType = TCTOC then Begin if (ElementID = '') or (ElementID = TCTOC(Playlist.Items[i]).ElementID) then Begin Result := Result + space + '+' + TCTOC(Playlist.Items[i]).ElementID + #13; if ElementID = TCTOC(Playlist.Items[i]).ElementID then Begin Delete(space,length(space)-1,2); break; End; if TCTOC(Playlist.Items[i]).EntryCount <> 0 then Begin for y := 0 to Pred(TCTOC(Playlist.Items[i]).EntryCount) do Begin InlineGetTreeText(TCTOC(Playlist.Items[i]).ElementIDList[y],space + ' '); End; End; End; End else Begin if (ElementID = '') or (ElementID = TCHAP(Playlist.Items[i]).ElementID) then Result := Result + space + '-' + TCHAP(Playlist.Items[i]).ElementID + #13; if ElementID = TCTOC(Playlist.Items[i]).ElementID then Begin Delete(space,length(space)-1,2); break; End; End; End; End else result := ''; End; Begin InlineGetTreeText; End;
Code:
Das Problem was ich jetzt habe ist, die Inhaltsverzeichnisse kommen im ID3v2 Tag der MP3 Datei alle zuerst und dann erst die Kapitel.
+TOC1
-TOC2 -ch1 -ch2 +TOC3 +TOC4 +TOC5 -ch3 -ch4 Also in dieser Form: TOC1 TOC2 TOC3 TOC4 TOC5 ch1 ch2 ch3 ch4 In dieser Reihenfolge befinden sie sich auch im TObjectList. Ich müsste also die ursprüngliche Baumstruktur wiederherstellen. Das wollte ich auch tun aber die Funktion GetTreeText liefert mir folgendes zurück:
Code:
Wenn jemand sich die Funktion mal anschauen könnte währe ich unendlich dankbar.
+TOC1
+TOC2 -ch1 -ch2 +TOC3 +TOC2 +TOC3 +TOC4 -ch4 +TOC4 +TOC5 -ch3 +TOC5 -ch1 -ch2 -ch3 -ch4 Im vorraus schon mal 1000 Dank. Paulchen |
AW: ID3v2 Chapter Baumstruktur erzeugen
Push
|
AW: ID3v2 Chapter Baumstruktur erzeugen
Da mich ID3-Tags generell interessieren, hab ich das Thema hier im Auge. Da id3.org aber seit einigen Tagen nicht erreichbar ist, und ich mich erst über den Aufbau dieses TOC-Frames schlau machen wollte, habe ich noch nicht geantwortet.
Ich würde es aber für sinnvoll halten, beim Auslesen aus dem Tag direkt die logische Struktur dahinter auch in den Daten zu erzeugen. Dann hättest du das Problem hier gar nicht. Der Code finde ich nicht so schön übersichtlich bzw. nicht leicht nachvollziehbar, aber das Problem habe ich generell bei Rekursionen. Vor allem dann, wenn die Rekursion auch noch in einer Schleife steckt. ;-) |
AW: ID3v2 Chapter Baumstruktur erzeugen
Ok, die Seite ist wieder erreichbar.
Ich würde das Anzeigen des TreeTextes auch über OOP machen. Anstelle der "ElementIDList: array of String;" wäre eine TObjectList vermutlich besser, die einzelne Objekte vom Typ "TChapter" bzw. "TTableOfContent" aufnehmen kann. Welche da wie reinkommen, muss man über die IDs in den Frames ermitteln. Diese sind ja im Grunde dafür da, um in der mp3-Datei eine Baumstruktur der Inhalts-Elemente nachzubilden. D.h. beim Auslesen packst du die einzelnen Frames erstmal in eine Liste. Bevor du damit dann arbeitest, baust du anhand der ElementIDs die Baumstruktur nach. Um den TreeText bei einem TChapter zu bekommen, gibst du einfach die ElementID oder den Inhalt der optional enthaltenen Subframes aus. Das geht über eine Property mit einem schönen Getter, der ermittelt, was zum Ausgeben vorhanden ist. Bei einem TTableOfContent wäre das in etwa sowas:
Delphi-Quellcode:
Um den Text eines TOC auszugeben, wird einfach der Reihe nach der Text der Unterelemente ausgegeben. Eventuell bei der Methode TreeText noch einen Parameter einführen, der die Tiefe der Einrückung für den Text angibt. Für die Anzeige des Inhaltsverzeichnis muss du dann nur WuzelElement.TreeText aufrufen, den Rest machen die Unter-Objekte dann von alleine.
for i := 0 to self.ElementIDList.Count - 1 do
begin result := result + ElementIDList[i].TreeText + #13#10; // end; Ist jetzt nicht alles bis ins Detail erläutert, aber die Idee sollte klar werden, denke ich. Bau da eine OOP-Struktur auf, dann klappt das auch. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz