Václav Kadlec 26.4.2005
Dnešní díl seriálu je ryze praktický: společně v něm totiž vytvoříme jednoduchý editor tagů ID3v2. Aplikace bude umožňovat načtení tagu ze souboru MP3, jeho následnou modifikaci a znovuuložení do souboru. Uvidíte, že ač je technologie ID3v2 poměrně sofistikovaná, vytvoření zmíněné aplikace bude velmi, velmi snadné.
V dnešním článku navážeme na informace, které jsme si prozradili minule. Začneme však tradičním shrnutím. Už delší dobu se v našem seriálu zabýváme zpracováním souborů MP3, což je velmi populární formát pro uchování komprimované digitální hudby. Několik posledních pokračování seriálu se pak týkalo technologie ID3, resp. její novější odnože ID3v2, které umožňují obohatit zmíněné hudební soubory (v našem případě soubory MP3) o textové nebo jiné informace, díky nimž se součástí skladby může stát i jméno autora, text písně, rok vydání apod.
Připomeňme, že před týdnem jsme se zabývali možnostmi praktické implementace technologie ID3v2: zatímco první verze tagů se vyznačuje značnou jednoduchostí (a tedy poměrně snadnou a nekomplikovanou implementací), druhá verze je podstatně tužší.
Takže jsme se nakonec dobrali k tomu, že nemá příliš význam pokoušet se implementovat podporu druhé verze tagů ID3 přímo, protože existuje celá řada knihoven, které za nás obstarají špinavou implementační práci a které přitom dokáží zachovat většinu možností a většinu flexibility, kterou s sebou technologie ID3v2 nese.
V důsledku těchto úvah jsme nakonec zvolili, stáhli a nainstalovali knihovnu, která by nám měla v našem snažení pomoci: knihovna je doporučena (a odkazována) přímo z webu http://www.id3.org/ a měla by poskytovat dostatečnou flexibilitu a zároveň funkční variabilitu k pokrytí drtivé většiny požadavků, které bychom na práci s technologií ID3v2 mohli klást.
Přestože všechny podstatné informace týkající se zvolené knihovny jsou uvedeny v předchozí části seriálu, připomeňme, že její domovská stránka je k nalezení na URL http://www.audioxl.com/id3v2lib.html, stáhnout knihovnu potom lze na adrese http://www.audioxl.com/idl-download.html.
Po stažení je pouze nutné archiv ve formátu ZIP rozbalit a jsme připraveni k používání knihovny. Hlavní složkou celé knihovny je zkomprimovaná Delphi jednotka (id3v2.dcu), kterou stačí přidat do projektu a můžete automaticky začít přistupovat ke všem funkcím, které jsou v knihovně k dispozici.
Pojďme se tedy vrhnout na vytvoření ukázkové aplikace. Aplikace, kterou společně vytvoříme v následujících odstavcích, je převzata přímo z knihovny id3v2, kde je uvedena jako ukázkový projekt.
První věc, kterou musíme udělat, je zpřístupnění knihovny své aplikaci.
Takže, spustíme Delphi, založíme nový projekt (File – New – Application) a ihned poté jej uložíme. Zvolte libovolný název (pro potřeby dalšího popisu ponechám název Unit1.pas) a libovolnou složku. Co je však důležité, ihned poté do téže složky zkopírujte výše zmíněný soubor s knihovní jednotkou (id3v2.dcu).
Poté je třeba udělat ještě jeden krok, a tím je přidání knihovny do sekce Uses v hlavním modulu. Přepněte se proto do Code Editoru a v souboru Unit1.pas editujte sekci Uses. Připište do ní jednotku id3v2, viz příklad:
uses
Windows, Messages, ..., id3v2;
Pojďme se pustit do vytváření samotné aplikace. Výsledkem bude jednoduchý editor, který bude umožňovat následující operace:
Vytvoření aplikace bude velmi jednoduché: na formulář vložíme následující komponenty:
Následně ošetříme událost OnCreate hlavního formuláře:
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := `Nazev`;
Label2.Caption := `Interpret`;
Label3.Caption := `Album`;
Label4.Caption := `Rok`;
Label5.Caption := `Zanr`;
Label6.Caption := `Komentar`;
Label7.Caption := `Cislo skladby`;Button1.Caption := `Nacist tag`;
Button2.Caption := `Ulozit tag`;Edit1.Text := ``;
Edit2.Text := ``;
Edit3.Text := ``;
Edit4.Text := ``;
Edit5.Text := ``;
Edit6.Text := ``;
Edit7.Text := ``;
end;
Nyní se zaměříme na samotnou práci s tagem (a s knihovnou). Jak jsme si prozradili minule, hlavní třídou celé knihovny je třída Tid3v2tag, která reprezentuje celý tag v rámci aplikace. Abychom mohli s knihovnou pracovat, musíme tedy definovat objekt této třídy, nad nímž pak budeme volat veškeré metody pro zpracování tagu.
V našem případě tedy najděte sekci globálních definic (sekci var v horní části modulu – již v současnosti obsahuje objekt Form1 třídy TForm1) a připište do ní jeden řádek, viz následující výpis:
var
Form1: TForm1;
myTag: Tid3v2Tag;
Od tohoto okamžiku můžeme kdekoliv v modulu (definice je globální) používat objekt myTag, která bude reprezentovat celý ID3v2 tag.
Čím začít? Pravděpodobně načtením tagu ze souboru. Ošetříme tedy klepnutí na tlačítko Button1, které bude právě k tomuto účelu sloužit.
Abychom byli schopni metodu implementovat, musíme si prozradit následující informace:
Máme-li tyto informace, můžeme již bez potíží implementovat obsluhu události pro načtení tagu ze souboru:
procedure TForm1.Button1Click(Sender: TObject);
var
tempStr : string;
tempInt : word;
myCOMM : COMM;begin
if OpenDialog1.execute then begin
tempInt := myTag.loadFromFile(OpenDialog1.filename, 0);
if (tempInt > 255) then
ShowMessage(format(`Error #%d! Could not load Tag!`,[tempInt]))
else begin
myTag.getAsciiText(`TIT2`, tempStr); //Get Song Title
Edit1.text := tempStr;myTag.getAsciiText(`TPE1`, tempStr); //Get Artist Name
Edit2.text := tempStr;myTag.getAsciiText(`TALB`, tempStr); //Get Album Name
Edit3.text := tempStr;myTag.getAsciiText(`TYER`, tempStr); //Get Release Year
Edit4.text := tempStr;myTag.getAsciiText(`TCON`, tempStr); //Get Genre
Edit5.text := tempStr;myTag.getAsciiText(`TRCK`, tempStr); //Get Track #
Edit7.text := tempStr;myTag.getCOMM(myCOMM, ``); //Get basic comment (no description)
Edit6.text := myCOMM.body;
end;
end;
end;
Obsluha načtení tagu ze souboru je dokončena. Dostáváme se k další požadované operaci, a tou je editace tagu. S tou si nemusíme dělat příliš starostí, protože díky použití editačních polí je podpora editace textů již implementována.
Jedeme tedy dál, konkrétně k uložení tagu do souboru. Ošetříme tedy událost OnClick tlačítka Button2, které slouží právě k ukládání tagu do souboru.
Abychom mohli ukládání implementovat, musíme si opět prozradit pár informací (jedná se v zásadě o analogii výše uvedených bodů):
Snad až na drobný zádrhel se speciálními rámci je zpracování tagu velmi přímočaré, co říkáte? Nyní tedy můžeme metodu implementovat:
procedure TForm1.Button2Click(Sender: TObject);
var
tempInt : word;
myCOMM : COMM;begin
myTag.setAsciiText(`TIT2`, Edit1.text); //Set Song Title
myTag.setAsciiText(`TPE1`, Edit2.text); //Set Artist Name
myTag.setAsciiText(`TALB`, Edit3.text); //Set Album Name
myTag.setAsciiText(`TYER`, Edit4.text); //Set Release Year
myTag.setAsciiText(`TCON`, Edit5.text); //Set Genre
myTag.setAsciiText(`TRCK`, Edit7.text); //Set Track #myCOMM.encoding := etASCII;
myCOMM.language := `ENG`;
myCOMM.description := ``;
myCOMM.body := Edit6.text;
myTag.setCOMM(myCOMM, myCOMM.description);
tempInt := myTag.saveToFile;
if (tempInt > 255) then
showMessage(format(`Error #%d! Could not save Tag!`,[tempInt]));
end;
K dokončení aplikace nám chybí už jen opravdu několik maličkostí, například vytvoření samotného objektu :-), nicméně protože si k aplikaci ještě povíme několik málo doplňujících informací, dokončíme její vytváření za týden.
Dnes jsme se však už dostali poměrně daleko – implementovali jsme dvě nejdůlěžitější operace s ID3 tagem, a to sice jeho načtení z MP3 souboru a jeho následné uložení do MP3 souboru.
Za týden tvorbu aplikace dokončíme a povíme si několik zbývajících maličkostí k implementaci ID3v2 technologie.
Dnešní díl seriálu byl věnován praktické implementaci ID3v2 technologie. Začali jsme vytvářet aplikaci, která ve výsledku bude umožňovat načítání, modifikaci a ukládání ID3v2 tagů z a do MP3 souborů.
K tomuto výsledku se dobereme již za týden, kdy vytváření aplikace dokončíme.