aboutsummaryrefslogblamecommitdiffstats
path: root/ScoreConverter/USongs.pas
blob: a43ea61eeed9c2ea9f35b7b695106a14146488ce (plain) (tree)






























































































































































                                                                                                          
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.