Hi,
ich habe just for fun mal eine
Unit zum extrahieren der ID-Infos aus MP3 Dateien geschrieben und es sieht so aus, als würde diese auch gut funktionieren.
Nun möchte ich gern mal das 'tausend-augen-prinzip' nutzen und euch mal bitten, dass ihr euch den Code mal anseht, ob da evtl. Fehler drin sind oder was ich noch verbessern kann. Das ganze bezieht sich bisher nur auf ID3v1 Tags, die ID3v2´s kommen später mit rein.
Ich danke allen, die sich die Mühe machen, im vorraus.
Der Delphicode ist die komplette .pas Datei.
Delphi-Quellcode:
unit mp3idvx;
interface
uses classes, SysUtils;
type
TID3v1 =
record
Songtitel:
string;
Kuenstler:
string;
Album:
string;
Erscheinungsjahr:
string;
Kommentar:
string;
Genre:
string;
end;
TMP3ID3vX =
class
private
public
function getID3v1Information(filenameWithPath:
string;
var ID3v1Infos: TID3v1): integer;
end;
var
clsMP3ID3vX: TMP3ID3vX;
implementation
function TMP3ID3vX.getID3v1Information(filenameWithPath:
string;
var ID3v1Infos: TID3v1): integer;
var
fstream: TFileStream;
buffer:
string;
i: integer;
begin
// Stream öffnen
fstream := TFileStream.Create(filenameWithPath,fmOpenRead
or fmShareDenyNone);
// Pufferlänge einstellen
SetLength(buffer,128);
// An den Anfang der ID3v1 Informationen gehen
fstream.Seek(-128,soFromEnd);
// 128 Bytes in den Puffer laden
if (fstream.
Read(buffer[1],128) < 128)
then
begin
// Datenmenge reicht nicht für einlesen aus, Fehler
result := -1;
exit;
end;
// Freigeben des FileStreams, da nicht mehr benötigt
fstream.Free;
// Songtitel extrahieren
ID3v1Infos.Songtitel := '
';
for i:=4
to 33
do
ID3v1Infos.Songtitel := ID3v1Infos.Songtitel+buffer[i];
// Künstler/Interpret extrahieren
ID3v1Infos.Kuenstler := '
';
for i:=34
to 63
do
ID3v1Infos.Kuenstler := ID3v1Infos.Kuenstler+buffer[i];
// Albuminformationen extrahieren
ID3v1Infos.Album := '
';
for i:=64
to 93
do
ID3v1Infos.Album := ID3v1Infos.Album+buffer[i];
// Erscheinungsjahr extrahieren
ID3v1Infos.Erscheinungsjahr := '
';
for i:=94
to 97
do
ID3v1Infos.Erscheinungsjahr := ID3v1Infos.Erscheinungsjahr+buffer[i];
// Kommentar extrahieren
ID3v1Infos.Kommentar := '
';
for i:=98
to 127
do
ID3v1Infos.Kommentar := ID3v1Infos.Kommentar+buffer[i];
// Genre extrahieren
ID3v1Infos.Genre := buffer[128];
// Alles okay, Rückgabe
result := 0;
end;
end.
Wer das ganze mal testen möchte, braucht eine Form, einen Button und einen FileDialog (bei mir aus den
Jedi Sachen, kann aber auch der Standartdialog sein), 6 Labels und einen Verweis auf die obige
Unit.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
mp3info: TID3v1;
begin
if JvOpenDialog1.Execute then
begin
if (clsMP3ID3vX.getID3v1Information(JvOpenDialog1.FileName,mp3info) >= 0) then
begin
Label1.Caption := 'Songtitel: '+mp3info.Songtitel;
Label2.Caption := 'Künstler/Interpret: '+mp3info.Kuenstler;
Label3.Caption := 'Album: '+mp3info.Album;
Label4.Caption := 'Erscheinungsjahr: '+mp3info.Erscheinungsjahr;
Label5.Caption := 'Kommentar: '+mp3info.Kommentar;
Label6.Caption := 'Genre: '+mp3info.Genre;
end
else begin
MessageDlg('Es trat ein Fehler auf!', mtError, [mbOK], 0);
end;
end;
end;