MP3 tag.. lamerski problem

0

Taki oto kodzik:

Type
TID3Tag = record
ID:string[3];
Titel:string[30];
Artist:string[30];
Album:string[30];
Year:string[4];
Comment:string[30];
Genre:byte;
end;
var
ID3Tag:TID3Tag;



procedure Lese_ID3Tag(Filename:string);
var Buffer:array[1..128] of char;
F:File;
begin
try
AssignFile(F, Filename);
Reset(F,1);
Seek(F,FileSize(F)-128);
BlockRead(F, Buffer, SizeOf(Buffer));
CloseFile(F);
with ID3Tag do
begin
ID:=copy(Buffer,1,3);
Titel:=copy(Buffer,4,30);
Artist:=copy(Buffer,34,30);
Album:=copy(Buffer,64,30);
Year:=copy(Buffer,94,4);
Comment:=copy(Buffer,98,30);
Genre:=ord(Buffer[128]);
end;
finally

end;
end;

Celem jest oczywiście odczyt taga MP3... problem pojawia się przy niektórych plikach, występuje "<font color=red>File Acces Error</font>" - myślałem, że <b>Try</b> coś da, ale niestety dalej jest to samo. Jak można zabezpieczyć tą procedurkę na wszystkie możliwości.. jeżeli by jakiś mp3 nie miał TAGa, to niech nic nie zapisuje do zmiennych...

0

sciagnij sobie id3tag.zip to jest chyba nawet na tej stronie :)

0

Błąd przy plikach readonly/hidden/system. Otwórz jako tylko do odczytu. Zmienna filemode:=blebleble (odpowiednio), oczywiście zanim użyjesz reset. Aha zmienna globalna, więc uważaj na jej stan.

// do postu poniżej:
Detox, sorry, ale myślałem, że jak już odpalisz helpa, to się doczytasz.

0

Hmm zrobiłem tak i nadal nie działa...

var
FileMode: Byte = 2;

procedure Lese_ID3Tag(Filename:string); // odczyt MP3 TAG
var
  Buffer: array[1..128] of char; // Bufer
  F:File; // plik MP3
  DwAttr: Dword; // Atrybut
begin

  DwAttr := GetFileAttributes(PChar(Filename));
  if dwattr and File_Attribute_ReadOnly = File_Attribute_ReadOnly then
    FileMode := 0
  else
    FileMode := 2;

        
AssignFile(F, Filename);
Reset(F,1);
Seek(F,FileSize(F)-128);
BlockRead(F, Buffer, SizeOf(Buffer));
CloseFile(F);
with ID3Tag do
begin
ID:=copy(Buffer,1,3);
Title:=copy(Buffer,4,30);
Artist:=copy(Buffer,34,30);
Album:=copy(Buffer,64,30);
Year:=copy(Buffer,94,4);
Comment:=copy(Buffer,98,30);
Genre:=ord(Buffer[128]);
end;

end;

0

Może dlatego nie działa, że zmienna FileMode to zmienna globalna, ale zadeklarowana już w SysUtils, czyli nie musisz (a moze nawet nie powinieneś) jej deklarowac u siebie.

0

[...]Seek(F,FileSize(F)-128);[...]

Po tej linijce powinieneś odczytać tekst w następnych 3 znakach, i sprawdzić czy text = 'TAG'; ewentualnie w JediVCL jest 4 komponenty do odczytu tagów mp3 (ID3v1 i ID3v2)

1 użytkowników online, w tym zalogowanych: 0, gości: 1