You are on page 1of 5

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MPlayer, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type TForm1 = class(TForm) btnOpenFolder: TBitBtn; txtFolder: TStaticText; mp3List: TListBox; Progress: TProgressBar; ProgressTimer: TTimer; GroupBox1: TGroupBox; Title: TLabel; Artist: TLabel; Album: TLabel; Year: TLabel; Genre: TLabel; Comment: TLabel; edTitle: TEdit; edArtist: TEdit; edAlbum: TEdit; edYear: TEdit; edGenre: TEdit; edComment: TEdit; MediaPlayer1: TMediaPlayer; procedure btnOpenFolderClick(Sender: TObject); procedure mp3ListClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; type TID3Rec = packed record Tag : array[0..2] of Char; Title, Artist, Comment, Album : array[0..29] of Char; Year : array[0..3] of Char; Genre : Byte; end; const MaxID3Genre = 147; ID3Genre : array[0..MaxID3Genre] of string = (

'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B', 'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack', 'Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance', 'Classical', 'Nstrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel', 'Noise', 'AlternRock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop', 'Instrumental Rock', 'Ethnic', 'Gothic', 'Darkwave', 'Techno-Industrial', 'Electronic', 'Pop-Folk', 'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American', 'Cabaret', 'New Wave', 'Psychadelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi', 'Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll', 'Hard Rock', 'Folk', 'Folk-Rock', 'National Folk', 'Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band', 'Chorus', 'Easy Listening', 'Acoustic', 'humour', 'Speech', 'Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus', 'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power Ballad', 'Rythmic Soul', 'Freestyle', 'Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-House', 'Dance Hall', 'Goa', 'Drum & Bass', 'Club House', 'Hardcore', 'Terror', 'Indie', 'Britpop', 'Negerpunk', 'Pols Punk', 'Beat', 'Christian Gangsta Rap', 'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian', 'Christian Rock', 'Merengue', 'Salsa', 'Trash Metal', 'Anime', 'Jpop', 'Synthpop' ); implementation uses ShellAPI, ShlObj; {$R *.dfm} procedure FillID3TagInformation(mp3File:string; Title, Artist, Album, Year, Genr e, Comment:TEdit); var ID3 : TID3Rec; fmp3: TFileStream; begin fmp3 := TFileStream.Create(mp3File, fmOpenRead); try fmp3.Position := fmp3.Size-128; fmp3.Read(ID3, SizeOf(ID3)); finally fmp3.Free; end; {try

AssignFile(fmp3, mp3File); Reset(fmp3); try Seek(fmp3, FileSize(fmp3) - 128); BlockRead(fmp3, ID3, SizeOf(ID3)); finally CloseFile(fmp3); end; } if ID3.Tag <> 'TAG' then begin Title.Text := 'Wrong or no ID3 Tag Information'; Artist.Text:= 'Wrong or no ID3 Tag Information'; Album.Text := 'Wrong or no ID3 Tag Information'; Year.Text := 'Wrong or no ID3 Tag Information'; Genre.Text := 'Wrong or no ID3 Tag Information'; Comment.Text:= 'Wrong or no ID3 Tag Information'; end else begin Title.Text := Artist.Text:= Album.Text := Year.Text := ID3.Title; ID3.Artist; ID3.Album; ID3.Year;

if ID3.Genre in [0..MaxID3Genre] then Genre.Text := ID3Genre[ID3.Genre] else Genre.Text := IntToStr(ID3.Genre); Comment.Text := ID3.Comment end; end; procedure ChangeID3Tag(NewID3: TID3Rec; mp3FileName: string); var fmp3 : file of Byte; OldID3 : TID3Rec; begin try AssignFile(fmp3, mp3FileName); Reset(fmp3);

try Seek(fmp3, FileSize(fmp3) - 128); BlockRead(fmp3, OldID3, SizeOf(OldID3)); if OldID3.Tag = 'TAG' then Seek(fmp3, FileSize(fmp3) - 128) else Seek(fmp3, FileSize(fmp3)); BlockWrite(fmp3, NewID3, SizeOf(NewID3)); finally end; finally CloseFile(fmp3); end; end; procedure FillMP3FileList(Folder: string; sl: TStrings); var Rec : TSearchRec; begin sl.Clear; if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then try repeat sl.Add(Rec.Name); until SysUtils.FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end; function BrowseDialog(const Title: string; const Flag: integer) : string; var lpItemID : PItemIDlist; BrowseInfo : TBrowseInfo; DisplayName: array[0..MAX_PATH] of char; TempPath : array[0..MAX_PATH] of char; begin Result := ''; FillChar(BrowseInfo, sizeof(TBrowseInfo), #0); with BrowseInfo do begin hwndOwner := Application.Handle; pszDisplayName := @DisplayName; lpszTitle := PChar(Title); ulFlags := Flag; end; lpItemID := SHBrowseForFolder(BrowseInfo); if lpItemID <> nil then begin SHGetPathFromIDList(lpItemID, TempPath); Result := IncludeTrailingBacklash(TempPath); GlobalFreePtr(lpItemID);

end; end; procedure TForm1.btnOpenFolderClick(Sender: TObject); var mp3Folder : string; begin mp3Folder := BrowseDialog('Choose a folder with mp3 files', BIF_RETURNONLYFSDI RS); if mp3folder = '' then exit; txtFolder.Caption := mp3Folder; Fillmp3FileList(mp3Folder, mp3List.Items); end; procedure TForm1.mp3ListClick(Sender: TObject); var mp3File: string; begin if mp3List.Items.Count = 0 then exit; mp3File := Concat(txtFolder.Caption, mp3List.Items.Strings[mp3List.ItemIndex]) ; if not FileExixts(mp3File) then begin ShowMessage('MP3 file '+#13#10+ mp3File +#13#10+'does not exist!'); exit; end; end.

You might also like