AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ID3v2 Chapter Baumstruktur erzeugen

Offene Frage von "Gausi"
Ein Thema von PaulchenPanter · begonnen am 30. Jul 2011 · letzter Beitrag vom 4. Aug 2011
Antwort Antwort
PaulchenPanter

Registriert seit: 5. Mär 2008
Ort: Jena
2 Beiträge
 
#1

ID3v2 Chapter Baumstruktur erzeugen

  Alt 30. Jul 2011, 15:10
Delphi-Version: XE
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:
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;
Danach packe ich die jeweiligen Klassen in ein TOjectList und zum Schluss übergebe ich Sie der Funktion "GetTreeText".

Delphi-Quellcode:
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;
Diese Funktion sollte mir in folgender Form ein String zurück geben:

Code:
+TOC1
  -TOC2
  -ch1
  -ch2
  +TOC3
    +TOC4
      +TOC5
      -ch3
    -ch4
Das Problem was ich jetzt habe ist, die Inhaltsverzeichnisse kommen im ID3v2 Tag der MP3 Datei alle zuerst und dann erst die Kapitel.
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:
+TOC1
  +TOC2
  -ch1
  -ch2
  +TOC3
+TOC2
+TOC3
  +TOC4
  -ch4
+TOC4
  +TOC5
  -ch3
+TOC5
-ch1
-ch2
-ch3
-ch4
Wenn jemand sich die Funktion mal anschauen könnte währe ich unendlich dankbar.

Im vorraus schon mal 1000 Dank.

Paulchen
  Mit Zitat antworten Zitat
PaulchenPanter

Registriert seit: 5. Mär 2008
Ort: Jena
2 Beiträge
 
#2

AW: ID3v2 Chapter Baumstruktur erzeugen

  Alt 3. Aug 2011, 20:37
Push
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ID3v2 Chapter Baumstruktur erzeugen

  Alt 3. Aug 2011, 21:28
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.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ID3v2 Chapter Baumstruktur erzeugen

  Alt 4. Aug 2011, 11:57
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:
for i := 0 to self.ElementIDList.Count - 1 do
begin
    result := result + ElementIDList[i].TreeText + #13#10; //
end;
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.

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.
The angels have the phone box.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz