unit USongs;
interface
type
TScore = record
Name: string;
Score: integer;
Length: string;
end;
TSong = record
Path: string;
FileName: string;
Title: string;
Artist: string;
Score: array[0..2] of array of TScore;
end;
TSongs = class
LastCount: Integer;
Song: array of TSong; // array of songs
function ReadHeader(var rSong: TSong): boolean;
procedure BrowseDir(Dir: string); // Browse a dir + subdirs for songfiles
end;
var Songs: TSongs;
implementation
uses Sysutils, UMainForm, Dialogs;
function TSongs.ReadHeader(var rSong: TSong): boolean;
var
Line, Identifier, Value: String;
Temp: word;
Done: byte;
SongFile: Textfile;
begin
Result := False;
//Open File and set File Pointer to the beginning
AssignFile(SongFile, rSong.Path + rSong.FileName);
Reset(SongFile);
//Read Header
Result := true;
//Read first Line
ReadLn (SongFile, Line);
if (Length(Line)<=0) then
begin
Result := False;
Exit;
end;
Done := 0;
//Read Lines while Line starts with #
While (Line[1] = '#') do
begin
Temp := Pos(':', Line);
//Line has a Seperator-> Headerline
if (Temp <> 0) then
begin
//Read Identifier and Value
Identifier := Uppercase(Trim(Copy(Line, 2, Temp - 2))); //Uppercase is for Case Insensitive Checks
Value := Trim(Copy(Line, Temp + 1,Length(Line) - Temp));
//Check the Identifier (If Value is given)
if (Length(Value) <> 0) then
begin
//-----------
//Required Attributes
//-----------
//Title
if (Identifier = 'TITLE') then
begin
rSong.Title := Value;
//Add Title Flag to Done
Done := Done or 1;
end
//Artist
else if (Identifier = 'ARTIST') then
begin
rSong.Artist := Value;
//Add Artist Flag to Done
Done := Done or 2;
end;
end;
end;
if not EOf(SongFile) then
ReadLn (SongFile, Line)
else
begin
Result := False;
break;
end;
//End on first empty Line
if (Length(Line) = 0) then
break;
end;
//Check if all Required Values are given
if (Done <> 3) then
begin
Result := False;
end;
//And Close File
CloseFile(SongFile);
end;
procedure TSongs.BrowseDir(Dir: string);
var
SR: TSearchRec; // for parsing Songs Directory
SLen: integer;
begin
if FindFirst(Dir + '*', faDirectory, SR) = 0 then begin
repeat
if (SR.Name <> '.') and (SR.Name <> '..') then
BrowseDir(Dir + Sr.Name + '\');
until FindNext(SR) <> 0;
end;
FindClose(SR);
if FindFirst(Dir + '*.txt', 0, SR) = 0 then begin
repeat
SLen := Length(Song);
SetLength(Song, SLen + 1);
Song[SLen].Path := Dir;
Song[SLen].FileName := SR.Name;
if (ReadHeader(Song[SLen]) = false) then SetLength(Song, SLen);
//update Songs Label
if LastCount <> SLen div 30 then
begin
LastCount := SLen div 30;
MainForm.UpdateLoadedSongs(Dir, SLen);
end;
until FindNext(SR) <> 0;
end; // if FindFirst
FindClose(SR);
end;
end.