Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem beim id3-Tag auslesen (https://www.delphipraxis.net/21270-problem-beim-id3-tag-auslesen.html)

Schneider-Huetter 30. Apr 2004 08:03


Problem beim id3-Tag auslesen
 
Hallo zusammen,
ich habe ein für mich völlig unverständliches Problem beim Auslesen des id3-Tags:
Die Tags werden mittels TFileStream in ein "Array of Char" eingelesen und dann in 2 getrennte Strings (für Interpret und Titel) kopiert, das funktioniert so weit auch ganz gut solange ich nur entweder den Titel oder den Interpret z.B. in ein Edit-Feld schreibe. Wenn ich jedoch die beiden Strings zusammenfügen möchte (z.B.: Interpret + ' - ' + Titel) wird nur der Interpret angezeigt(bzw der String, der vorne steht). Wenn ich zuert den Titel in ein Edit-Feld schreibe, dann den Interpret in ein anderes Edit-Feld schreibe und sie dann zusammenfüge funktionirt es
:wiejetzt: ????

Im Voraus schon mal vielen Dank

Muetze1 30. Apr 2004 08:16

Re: Problem beim id3-Tag auslesen
 
Moin!

Tja, das Problem klingt gut und interessant, aber ein wenig Code wäre schonmal nicht schlecht, weil so kann ich nur folgendes sagen: Tjoa, schick, scheint irgendwo der Wurm drin zu sein...

MfG
Muetze1

fiasko 30. Apr 2004 08:23

Re: Problem beim id3-Tag auslesen
 
Hängt den Strings vielleicht ein #0 drann, welches Delphi beim konkatinieren nicht mitbekommt?!

Ghostwalker 30. Apr 2004 08:41

Re: Problem beim id3-Tag auslesen
 
hmmm...

ok..hier mal meine Routine zum Lesen von ID3 (nur V1 !!)

Code:
procedure TID3V1.Readtag;
var
  st : TFilestream;
  buf: array[0..127] of char;
  tmppos,curpos : integer;


  function ArrayToStr(count:integer):string;
  var
    i,ende : integer;
  begin
    result := '';
    ende := curpos+(count-1);
    for I := curpos to ende do
      result := result+buf[i];
    curpos := ende+1;
  end;

begin
  readed := false;
  changed := false;
  try
    st := TFilestream.create(ffilename,fmOpenRead);
    st.Seek(-128,soFromEnd);
    st.ReadBuffer(buf[0],128);
    st.free;
    if (BUF[0]='T') and (BUF[1]='A') and (BUF[2]='G') then
    begin
      readed := true;
      curpos := 3;
      fTitle := ArrayToStr(30);
      fartist := arraytostr(30);
      falbum := arraytostr(30);
      fyear := arraytostr(4);
      tmppos := curpos+28;
      if (ord(buf[tmppos]) =$00) and (ord(buf[tmppos+1]) <> $00) then
      begin
        fversion := 1;
        fcomment := arraytostr(28);
        falbumtrack := ord(buf[curpos+1]);
        inc(curpos,2);
      end
      else
      begin
        fversion := 0;
        fcomment := trim(arraytostr(30));
      end;
      fgenre := ord(buf[127]);
    end;
  except
    on e:exception do
      raise e;
  end;
end;

Hoffe es hilft weiter:)

Muetze1 30. Apr 2004 09:19

Re: Problem beim id3-Tag auslesen
 
Moin!

Ok, die Strings die du dir zusammenholst aus dem Record sind alle am Ende mit einer #0 aufgefüllt und diese wird die Probleme machen. Daher musst du vorher die Strings mal kürzen, bzw. die #0 hinten entfernen.

MfG
Muetze1

Robert Marquardt 30. Apr 2004 09:46

Re: Problem beim id3-Tag auslesen
 
Besorg dir doch die JediVCL. Da sind ID3 Komponenten mit dabei.

Muetze1 30. Apr 2004 10:33

Re: Problem beim id3-Tag auslesen
 
Moin!

Zitat:

Zitat von Robert Marquardt
Besorg dir doch die JediVCL. Da sind ID3 Komponenten mit dabei.

Oder meine ID3 Tag Lib, die ist aber noch nicht auf der neuen Page online. Wenn interesse besteht lade ich die gleich heute abend mal hoch. Die Lib kann dann ID3v1.x Tags sowie ID3v2.2.x.x und höher. Zusätzlich auch support für unbekannte Tags und Bilder Tags.

MfG
Muetze1

Robert Marquardt 30. Apr 2004 14:58

Re: Problem beim id3-Tag auslesen
 
Muetze1, kannst du mal deine Komponente mit der Jedi-Komponente vergleichen?
Eine von beiden ist bestimmt besser und der andere lernt was.

Muetze1 30. Apr 2004 17:06

Re: Problem beim id3-Tag auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!

Ok, habe mir mal die JEDI VCL runtergeladen und den Source angeschaut. Meine Lib entstand aus der Not und ist daher einfacher, aber einen kleinen Vergleich wage ich mal.

ID3 Tag Lib
- keine Komprimierung / Verschlüsselte Tags
- keine ID3v2.2.x.x, erst ab v2.3.x.x und höher (4 Buchstabige Tag IDs)
- kein Unicode UTF-8/UTF-16 Support
+ alle Tags, auch unbekannte, können über Streams geschrieben und gelesen werden
+ kleinerer Code
+ eine Lib für beide Tag Typen

JEDI ID3
- keine Komprimierung / verschlüsselte Tags
- unbekannte Tags können nicht gelesen / geschrieben werden, bleiben nil
- 2 Klassen / Units für die unterschiedlichen Tag Typen
+ auch ID3v2.2.x.x Tags
+ Unicode anscheinend supported

Dann ist noch die Frage ob die JEDI ID3 Lib unbekannte Tags automatisch entfernt, wenn diese auch nicht gelesen werden konnten. Das konnte ich beim überschauen des Codes nicht herauslesen.

Ich wollte die JEDI VCL nicht installieren und ich habe auch nicht mit der JEDI ID3 Klasse gearbeitet. Das müsste man vielleicht nochmal im Detail klären. Auch kann es noch weitere Unterschiede geben, aber ich habe den Code nur überflogen.

It's your choice...

MfG
Muetze1

Schneider-Huetter 3. Mai 2004 08:03

Re: Problem beim id3-Tag auslesen
 
Vielen Dank für eure Antworten, werde eure Vorschläge mal testen, das mit der #0 hört sich ziemlich vernünftig an. Die Komponenten will ich eigentlich nur als Notlösung einsetzen, man will ja auch was lernen beim Programmieren ;)

MfG Schneider-Huetter

Robert Marquardt 3. Mai 2004 08:17

Re: Problem beim id3-Tag auslesen
 
Danke Muetze1.
Da werde ich mal in unsere Newsgroup posten und sehen ob einer die Komponenten verbessert.

Muetze1 3. Mai 2004 11:10

Re: Problem beim id3-Tag auslesen
 
Moin!

Zitat:

Zitat von Robert Marquardt
Danke Muetze1.
Da werde ich mal in unsere Newsgroup posten und sehen ob einer die Komponenten verbessert.

Wie, welche Newsgroup? Arbeitest du bei JEDI mit?

Ich habe die Lib nur mal schnell geschrieben weil damals gab es dazu noch nix und ich brauchte was für meine Musik-Library, daher habe ich das mal schnell b'n'd programmiert. Ich habe bisher auch noch nie Unicode ID3v2 Tags gehabt, wenn ich mal ein solches File bekommen sollte, dann werde das Unicode auch mal implementieren. Auch serializing und komprimierte Tags sind mir bisher noch nicht untergekommen. Daher steht das Projekt schon seit einiger Zeit und ich warte auf überhaupt eine Rückmeldung ob die Klasse irgendwem nutzt und werde anhand dessen die Entwicklung fortführen...

MfG
Muetze1

Robert Marquardt 3. Mai 2004 13:49

Re: Problem beim id3-Tag auslesen
 
Ich bin einer der fleissigen JVCL-Mitarbeiter.
Namentlich habe ich einen Grossteil der Sourcen der JVCL 3 stylistisch ueberarbeitet.

Frueher haben wir ueber Mailinglisten zusammengearbeitet. Inzwischen sid die fast ausgetrocknet und
die Kommunikation erfolgt ueber unsere Newsgroups auf dem Server news://forums.talkto.net
Alle Komponenten sind MPL und wenn du deine Komponente auch unter der MPL veroeffentlichst, dann kannst
du gerne die Komponenten zusammenfuehren. Wir sind immer an fleissigen Mitarbeitern interessiert.

Muetze1 3. Mai 2004 16:34

Re: Problem beim id3-Tag auslesen
 
Moin!

Zitat:

Zitat von Robert Marquardt
Alle Komponenten sind MPL und wenn du deine Komponente auch unter der MPL veroeffentlichst, dann kannst
du gerne die Komponenten zusammenfuehren. Wir sind immer an fleissigen Mitarbeitern interessiert.

Naja, das wird schwierig. Meine Lib geht da einen ganz anders ran - die Ansätze sind schon verschieden. Das unter die MPL stellen wäre nicht das Problem, aber wozu. Es gibt so oder so nun schon genug Implementationen von ID3 Libraries für Delphi - z.T. besser als meine und die von JEDI zusammen (die offizielle ID3Lib z.B.)...

MfG
Muetze1

Schneider-Huetter 4. Mai 2004 12:11

Re: Problem beim id3-Tag auslesen
 
Warum schreibt Delphi eigentlich eine #0 in das letzte Array-Feld? Hat das irgendeinen tieferen Sinn?

Gruß Schneider-Huetter

Muetze1 4. Mai 2004 12:20

Re: Problem beim id3-Tag auslesen
 
Moin!

Zitat:

Zitat von Schneider-Huetter
Warum schreibt Delphi eigentlich eine #0 in das letzte Array-Feld? Hat das irgendeinen tieferen Sinn?

Auch wenn ich dich jetzt vielleicht falsch verstanden habe, aber nicht Delphi schreibt das da rein, sondern es wird so ausgelesen. Es ist immer so definiert, das du den String hast und am Ende (wenn noch Platz ist in dem Feld) mit #0 aufgefüllt wird.

MfG
Muetze1

Schneider-Huetter 5. Mai 2004 14:53

Re: Problem beim id3-Tag auslesen
 
Wie schaffe ich es nun am einfachsten den String so zu kürzen, dass alle #0 am Ende gelöscht werden?

Gruß Schneider-Huetter

Muetze1 5. Mai 2004 15:47

Re: Problem beim id3-Tag auslesen
 
Moin!

In meiner Library mache ich das so:

Delphi-Quellcode:
Trim(String(Buffer.Artist));
Das String brauche ich, da mein Buffer direkt aus den Char's besteht:

Delphi-Quellcode:
  typID3v1Record = Packed Record
    HeaderID : Array[0..2] Of Char;
    Title,
    Artist,
    Album    : Array[0..29] Of Char;
    Year     : Array[0..3] Of Char;
    Comment  : Array[0..29] Of Char;
    Genre    : Byte;
  End;
MfG
Muetze1

Schneider-Huetter 9. Jun 2004 20:46

Re: Problem beim id3-Tag auslesen
 
Vielen Dank Muetze1, endlich hat's dank deines Tips funktioniert :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 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