aboutsummaryrefslogtreecommitdiffstats
path: root/ScoreConverter/USongs.pas
blob: a43ea61eeed9c2ea9f35b7b695106a14146488ce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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.