Autor Beitrag
Default112
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Sa 27.05.06 20:53 
Ich hab mir aus dem FAQ-Beitrag zum auslesen von ID3Tags die MP3FileUtils runtergeladen. Im Grunde bin ich sehr zufrieden damit, nur habe ich ein kleines Problem....

Ich habe 3 Listboxen. Die erste für ID3v1, die zweite für ID3v2 und die dritte für den Dateinamen.

Jeder Eintrag wird nummeriert. ("1 Song - Artist")

Viele meiner Dateien besitzen keinen ID3v2 Tag, was weiter kein Problem ist, das Feld bleibt bis auf die Nummer leer. ABer ich habe auch einige Dateien, welche kein ID3v1 Tag besitzen. Da zeigt sich das Problem, dass hier der Tag der vorherigen Datei in das Feld eingetragen wird.

ausblenden Quelltext
1:
2:
3:
Listbox1                Listbox 2                Listbox 3
1 Rammstein - bla       1 Rammstein - bla        1 C:\MP3\Rammsteinbla.mp3
2 Rammstein - bla       2 Metallica - blubb      2 C:\MP3\Metallicablub.mp3


Das ist ziemlich nervig, da ich keinen Plan hab wo das Problem liegt.
Auslesen tue die Tags wiefolgt:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure TForm1.Button1Click(Sender: TObject);
var stream: TFilestream;
    F: TSearchRec;
    dateiname : String;
    i : Integer;
begin
  i := 1;
  if FindFirst('f:\MP3\*.mp3',faANYFIle,F) = 0 then
  begin
    repeat
    begin
      if (F.Attr and faDirectory) = 0 then
      begin
        dateiname:= 'F:\MP3\'+ F.Name;
        stream := TFileStream.Create(dateiname, fmOpenRead or fmShareDenyWrite);
        Id3v2Tag.ReadFromStream(stream);
        if Not Id3v2Tag.exists then
          stream.Seek(0, sobeginning)
        else
        stream.Seek(Id3v2Tag.size, soFromBeginning);
        MpegInfo.LoadFromStream(Stream);
        Id3v1Tag.ReadFromStream(stream);
        Listbox1.Items.Add(inttostr(i) + ' ' + Id3v1Tag.Artist + ' - ' +Id3v1Tag.Title);
        Listbox2.Items.Add(inttostr(i) + ' ' + Id3v2Tag.Artist + ' - ' +Id3v2Tag.Title);
        Listbox3.Items.Add(inttostr(i) + ' ' + dateiname);
        stream.free;
        i := i + 1;
      end;
    end;
    until FindNext(f) <> 0;
    FindClose(F);
  end;
end;


Ich würde es begrüssen, wenn man mir bei diesem Problem zur Hand gehen könnte.

Gruss
Def
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 27.05.06 21:11 
Boah...hast du mich jetzt erschreckt mit dem Titel :lol:

Id3v1Tag etc. scheinen bei dir ja globale Variablen zu sein. D.h. nach einem Id3v1Tag.ReadfromFile stehen da die Infos drin und bleiben da drin.
Ich habe jetzt den Code nicht im Kopf. Es kann sein, dass die Infofelder "Artist" etc. nicht gelöscht werden, wenn kein Tag vorhanden ist. Dein Problem sollte sich beheben lassen, wenn du vor dem Setzen der Listbox-Einträge überprüfst, ob "Id3v1Tag.exists".

Zu meiner Verteidigung: Bei ID3v2 werden die Felder ja scheinbar gelöscht. Den v1-Teil habe ich fast unverändert von tommie-lee's UltimaTag übernommen. Im Zweifelsfall ist also er Schuld :mrgreen:

Ich werde aber demnächst mal über den Code drübergucken, und evtl. die Felder dann auf einen Leerstring zurücksetzen, wenn kein Tag gefunden wird, bzw. vor dem auslesen die Infos zurücksetzen. Ich melde mich dann nochmal ;-)

Edit: Uh, das ging schnell: Die Änderung sollte in einer Zeile erledigt sein: Füge in der Funktion TID3v1Tag.ReadFromStream am ANfang einfach eine Zeile clear; ein. Die Zeile FExists := False; kannst du dann weglassen. Dann sollte es klappen.

_________________
We are, we were and will not be.
Default112 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 76

Win XP
D6 Prof
BeitragVerfasst: Sa 27.05.06 21:16 
Sehr schön, Ziel erreicht. Gausi mit Herzinfarkt am Boden und mein Programm läuft. Was für ein Tag...

Gruss
Def :D