Thursday, May 15, 2008

Nyní jsme tedy již teoreticky připraveni a můžeme se pustit do samotné implementace načítání tagů v Delphi. Věřím, že většina z vás by již tuto fázi zvládla bez problému sama, ale pro úplnost si uvedeme ukázkový kód. V něm si nejprve nadefinujeme strukturu záznamu pro ID3 tag a dále pak jednoduchou funkci pro načítání tagu ze souboru. Na formulář dále umístěte tlačítko, dialog pro otevření souboru a komponentu Memo pro výpis tagu. Samotné načítání umístíme do události OnClick tlačítka a zde bude zároveň i výpis.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TagRecord = record
Header: array [1..3] of Char;
Title: array [1..30] of Char;
Artist: array [1..30] of Char;
Album: array [1..30] of Char;
Year: array [1..4] of Char;
Comment: array [1..30] of Char;
Genre: Byte;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

function ReadTag(const FileName: string; var TagData: TagRecord): Boolean;
var
SourceFile: file;
begin
try
Result := true;
AssignFile(SourceFile, FileName);
FileMode := 0;
Reset(SourceFile, 1);
Seek(SourceFile, FileSize(SourceFile) - 128);
BlockRead(SourceFile, TagData, 128);
CloseFile(SourceFile);
except
Result := false;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Tag: TagRecord;
begin
OpenDialog1.Execute;
if OpenDialog1.FileName <> '' then ReadTag(OpenDialog1.FileName, Tag);
if Tag.Header = 'TAG' then
begin
Memo1.Clear;
Memo1.Lines.Add('Titulek: ' + TrimRight(Tag.Title));
Memo1.Lines.Add('Interpret: ' + TrimRight(Tag.Artist));
Memo1.Lines.Add('Album: ' + TrimRight(Tag.Album));
Memo1.Lines.Add('Rok: ' + TrimRight(Tag.Year));
if ((Tag.Comment[29] = #0) and (Tag.Comment[30] <> #0)) or ((Tag.Comment[29] = #32) and (Tag.Comment[30] <> #32)) then
begin
Memo1.Lines.Add('Komentář: ' + TrimRight(Copy(Tag.Comment, 1, 28)));
Memo1.Lines.Add('Číslo stopy: ' + IntToStr(Ord(Tag.Comment[30])));
end
else
Memo1.Lines.Add('Komentář: ' + TrimRight(Tag.Comment));
end;
end;

end.
Pozornější z vás si jistě všimli, že jsem "takticky" vynechal položku žánr. Ten se samozřejmě během načítání rovněž ze souboru načte a uloží do záznamu Genre, ale v podobě čísla, které danému žánru odpovídá a jeho slovní vyjádření je nutné najít v příslušné tabulce (viz. úvodní text). Abych výsledný kód příliš nekomplikoval a neprodlužoval (žánrů je celkem 147), rozhodl jsem se tuto položku vynechat a opět vás musím odkázat na adresu, kde tyto hodnoty a jejich slovní vyjádření naleznete.
To bude pro dnešek vše a příště pravděpodobně ještě u MP3 souborů zůstaneme a povíme si něco o jeho vlastnostech, přesněji řečeno, jak tyto vlastnosti ze souborů získat.