{
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
}
unit taggen;

interface

uses umbenennen, controls,classes,Comctrls,mpegfile,dialogs,pkid3;


procedure showtag(tag:ttagrec);
procedure erkennetag(filename,dirgegeben:string;var tag:ttagrec);
procedure writebatchtag(dateien:tstringlist;erkennen:boolean;genre:integer);

implementation

uses renamer, Windows, SysUtils,graphics,options,lyrics_form;

type tvararray=array of texpstrarr;

procedure showtag(tag:ttagrec);
var i:integer;
    multi:boolean;
begin
 case tag.lyricstag of
  0: form1.label22.caption:='ID3v1 '+form1.StrHolder1.strings[1];
  1: form1.label22.caption:='Lyrics3v1 '+form1.StrHolder1.strings[1];
  2: form1.label22.caption:='Lyrics3v2 '+form1.StrHolder1.strings[1];
 end;
 if tag.id3v2<>0 then form1.id3v2tag_found.caption:='ID3v2.'+inttostr(tag.id3v2)+' '+form1.StrHolder1.strings[1];
 form1.label22.Font.Style:=[fsbold];
 form1.id3v2tag_found.Font.Style:=[fsbold];
 if form1.tabsheet6.showing then multi:=form1.dateienliste.selcount>1
  else multi:=form1.mylistview1.selcount>1;
 if (form1.edit1.text<>tag.song) and multi and
        form2.notshowfulltag.checked then form1.edit1.text:='' else form1.edit1.text:=tag.song;
 if (form1.edit2.text<>tag.kuenstler) and multi and
  form2.notshowfulltag.checked then form1.edit2.text:='' else form1.edit2.text:=tag.kuenstler;
 if (form1.edit3.text<>tag.album) and multi and
   form2.notshowfulltag.checked then form1.edit3.text:='' else  form1.edit3.text:=tag.album;
 if (form1.edit4.text<>tag.jahr) and multi and
   form2.notshowfulltag.checked then form1.edit4.text:='' else  form1.edit4.text:=tag.jahr;
 if (form1.edit5.text<>tag.kommentar) and multi and
   form2.notshowfulltag.checked then form1.edit5.text:='' else  form1.edit5.text:=tag.kommentar;
 if (form1.edit8.text<>tag.track) and multi and
   form2.notshowfulltag.checked then form1.edit8.text:='' else  form1.edit8.text:=tag.track;
 if (form5.author.Text<>tag.author) and multi and
   form2.notshowfulltag.checked then form5.author.text:='' else  form5.author.text:=tag.author;
 if (form5.images.items.Text<>tag.images) and multi and
   form2.notshowfulltag.checked then form5.images.items.text:='' else  form5.images.items.text:=tag.images;
 if (form5.infos.Text<>tag.info) and multi and
   form2.notshowfulltag.checked then form5.infos.text:='' else  form5.infos.text:=tag.info;
 if (form5.lyrics.Text<>tag.lyrics) and multi and
   form2.notshowfulltag.checked then form5.lyrics.text:='' else  form5.lyrics.text:=tag.lyrics;
 i:=0;
 while (i<form1.combobox1.Items.count)
    and (transint2art[tag.genre]<>form1.combobox1.items[i]) do inc(i);
 if (transint2art[tag.genre]=form1.combobox1.items[i]) then
   if (form1.combobox1.ItemIndex<>i) and multi and
   form2.notshowfulltag.checked then form1.combobox1.ItemIndex:=-1 else form1.combobox1.ItemIndex:=i;
//13.02.00 tric: beim einlesen der Tags update wegen LyricsTag machen
 form1.edit1.update;
 form1.edit2.update;
 form1.edit3.update;
 form1.edit5.update;
end;

procedure browsename(vonn,datei:string;var strarr:tvararray;dir:boolean);
var n,grenzer,varanzahl:integer;
begin
 varanzahl:=length(strarr)-1;
 while pos('%',vonn)>0 do
  begin
   inc(varanzahl);
   setlength(strarr,varanzahl+1);
   n:=pos(copy(vonn,1,pos('%',vonn)-1), datei);
   if pos('%',vonn)<>length(vonn) then
    begin
     strarr[varanzahl].vari:=vonn[pos('%',vonn)+1];
     if n>0 then
        delete(datei,1,n+pos('%',vonn)-2);
      delete(vonn,1,pos('%',vonn)+1);
      n:=pos('%',vonn);
      if n>0 then
        dec(n);
      grenzer:=pos(copy(vonn,1,n), datei)-1;
      // if vonn='' then
      if grenzer<1 then  if not dir then grenzer:=length(datei)-length(extractfileext(datei))
         else grenzer:=length(datei);
      if (n=0) and (vonn<>'') then grenzer:=pos(vonn,datei)-1;
      strarr[varanzahl].str:=copy(datei,1,grenzer);
     end else
     begin
      delete(vonn,pos('%',vonn),1);
     end;
   end;
end;

procedure var2name(var str:string;nach:string;strarr:tvararray);
var n,k:integer;
begin
 n:=1;
 str:='';
 while n<=length(nach) do
  begin
      while (n<=length(nach)) and (nach[n]<>'%')do
       begin
        str:=str+nach[n];
        inc(n);
       end;
//16.02.00 tric added n<=length below 3 times

      if (n<=length(nach)) then
       begin
        inc(n);
        k:=0;
        while (k<=length(strarr)-1) and (n<=length(nach)) and (nach[n]<>strarr[k].vari) do inc(k);
        if (n<=length(nach)) and (k<=length(strarr)-1) then str:=str+strarr[k].str;
        inc(n);
       end;
     end;
end;

procedure clearstring(var str:string);
var i:integer;
    s:string;
begin
 if form2.zwischenraumwahl.text=form2.zwischenraumwahl.items[0] then s:=' '
  else
 if form2.zwischenraumwahl.text=form2.zwischenraumwahl.items[1] then s:='_'
  else
 if form2.zwischenraumwahl.text=form2.zwischenraumwahl.items[2] then s:='.'
  else form2.zwischenraumwahl.text;
 while (length(str)>0) and (str[1]=s) do delete(str,1,1);
 i:=length(str);
 while (length(str)>0) and (str[i]=s)  do
  begin
   delete(str,i,1);
   dec(i);
  end;
end;

procedure erkennetag(filename,dirgegeben:string;var tag:ttagrec);
var s,year_tmp,track_tmp,dir_tmp,line_tmp:string;
    n,i:integer;
    strarr:tvararray;
begin
 tag.song:='';
 tag.kuenstler:='';
 tag.album:='';
 year_tmp:=tag.jahr;
 tag.jahr:='';
 tag.kommentar:='';
 track_tmp:=tag.track;
 tag.track:='';
 if dirgegeben<>'' then filename:=expanddir(dirgegeben)+filename;
 if form1.presets.checked then
  begin
   browsename(form2.name2tag_arr[form1.tag_album_wahl.itemindex].filename,extractfilename(filename),strarr,false);
   s:=ExtractFilePath(dirgegeben);
   if s[length(s)]='\' then delete(s,length(s),1);
   s:=ExtractFilename(s);
   browsename(form2.name2tag_arr[form1.tag_album_wahl.itemindex].dir1,s,strarr,true);
   browsename(form2.name2tag_arr[form1.tag_album_wahl.itemindex].dir2,ExtractFilename(dirgegeben),strarr,true);
   var2name(tag.song,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagtitel,strarr);
   var2name(tag.kuenstler,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagartist,strarr);
   var2name(tag.album,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagalbum,strarr);
   var2name(s,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagyear,strarr);
   tag.jahr:=s;
   var2name(s,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagtrack,strarr);
   tag.track:=s;
   var2name(tag.kommentar,form2.name2tag_arr[form1.tag_album_wahl.itemindex].tagcomment,strarr);
  end
  else
  begin
   s:=extractfilename(filename);
   dir_tmp:=extractfilepath(filename);
   if (length(dir_tmp)>0) then delete(dir_tmp,length(dir_tmp),1);
   line_tmp:=form1.fast_tag.text;
   while pos('\',line_tmp)>0 do
    begin
     s:=extractfilename(dir_tmp)+'\'+s;
     i:=length(dir_tmp);
     while (length(dir_tmp)>0) and (dir_tmp[i]<>'\') do
      begin
       delete(dir_tmp,i,1);
       dec(i);
      end;
     if (length(dir_tmp)>0) then delete(dir_tmp,i,1);
     i:=length(line_tmp);
     while (length(line_tmp)>0) and (line_tmp[i]<>'\') do
      begin
       delete(line_tmp,i,1);
       dec(i);
      end;
     if (length(line_tmp)>0) then delete(line_tmp,i,1);
    end;
   browsename(form1.fast_tag.text,s,strarr,false);
   var2name(tag.song,'%S',strarr);
   var2name(tag.kuenstler,'%K',strarr);
   var2name(tag.album,'%A',strarr);
   var2name(s,'%J',strarr);
   tag.jahr:=s;
   var2name(s,'%N',strarr);
   tag.track:=s;
   var2name(tag.kommentar,'%C',strarr);
  end;
 val(tag.jahr,i,n);
 if n<>0 then tag.jahr:=year_tmp;
 val(tag.track,i,n);
 if n<>0 then tag.track:=track_tmp;
 clearstring(tag.album);
 clearstring(tag.song);
 clearstring(tag.kommentar);
 clearstring(tag.kuenstler);
end;

procedure writebatchtag(dateien:tstringlist;erkennen:boolean;genre:integer);
var dir,datei:string;
    n,i,k:integer;
    neu:tstringlist;
    tag,tag2:ttagrec;
//    ltag:TpkLyrics3;
begin
{ dirgegeben:=expanddir(dirgegeben);}
 if form1.playlistauto.checked then if form1.edit7.text<>'<directoryname>.m3u' then
  form1.schreibeplaylist(expanddir(extractfiledir(dateien[0]))+form1.edit7.text) else
  form1.schreibeplaylist(expanddir(extractfiledir(dateien[0]))+extractfilename(extractfiledir(dateien[0])));
  dir:='';
  if form1.rekursiv.checked then
  begin
   i:=dateien.count-1;
   while i>=0 do
    begin
     if hasattr(expanddir(dateien[i]),fadirectory) then
      begin
       datei:=dateien[i];
       getneueliste(expanddir(datei),neu);
       for k:=0 to neu.count-1 do
         dateien.insert(i+1,neu[k]);
      end;
     dec(i);
    end;
   try neu.free except end;
  end;
 progressbar:=tprogressbar.create(form1.statusbar1);
 progressbar.parent:=form1.statusbar1;
 progressbar.align:=alClient;
 progressbar.step:=1;
 progressbar.max:=dateien.count;
 for k:=0 to dateien.count-1 do
  begin
   progressbar.stepit;
   if not hasattr(expanddir(dateien[k]),fadirectory)  and not
    (readtag(dateien[k],tag) and form1.notagthere.checked) then
    begin
     tag2:=tag;
     if erkennen then
      begin
       erkennetag(extractfilename(dateien[k]),extractfiledir(dateien[k]),tag);
       if ansiuppercase(form2.Edit6.text)='%OLD' then tag.song:=tag2.song;
       if ansiuppercase(form2.Edit7.text)='%OLD' then tag.kuenstler:=tag2.kuenstler;
       if ansiuppercase(form2.Edit8.text)='%OLD' then tag.album:=tag2.album;
       if ansiuppercase(form2.Edit9.text)='%OLD' then tag.kommentar:=tag2.kommentar;
       if ansiuppercase(form2.Edit10.text)='%OLD' then tag.jahr:=tag2.jahr;
       if ansiuppercase(form2.Edit11.text)='%OLD' then tag.track:=tag2.Track;
       tag.genre:=tag2.genre;
      end;
     if (form1.checkbox9.down and erkennen) or (not erkennen and not form1.checkbox9.down) then tag.song:=form1.edit1.text;
     if (form1.checkbox10.down and erkennen) or (not erkennen and not form1.checkbox10.down) then tag.kuenstler:=form1.edit2.text;
     if (form1.checkbox11.down and erkennen) or (not erkennen and not form1.checkbox11.down)  then tag.album:=form1.edit3.text;
     if (form1.checkbox12.down and erkennen) or (not erkennen and not form1.checkbox12.down)  then tag.jahr:=form1.edit4.text;
     if (form1.checkbox13.down and erkennen) or (not erkennen and not form1.checkbox13.down)  then tag.kommentar:=form1.edit5.text;
     if (form1.checkbox15.down and erkennen) or (not erkennen and not form1.checkbox15.down)  then tag.track:=form1.edit8.text;
     if form1.leaveold.checked then
      begin
       if form1.checkbox9.down then tag.song:=tag2.song;
       if form1.checkbox10.down then tag.kuenstler:=tag2.kuenstler;
       if form1.checkbox11.down then tag.album:=tag2.album;
       if form1.checkbox12.down then tag.jahr:=tag2.jahr;
       if form1.checkbox13.down then tag.kommentar:=tag2.kommentar;
       if form1.checkbox15.down then tag.track:=tag2.track;
      end;
     {genre schreiben wenn keins da, oder nicht erkannt werden soll}
     if (not erkennen and not form1.checkbox15.down) or (erkennen and (not form1.checkbox15.down or (tag.genre=255))) then
      for n:=0 to genremenge do
       if ansiuppercase(transint2art[n])=ansiuppercase(form1.combobox1.text) then
       if n<>genremenge then tag.genre:=n else tag.genre:=255;
     if (tag.jahr='') and (tag2.jahr<>'') then tag.jahr:=tag2.jahr;
     if form1.leaveold.checked and form1.checkbox14.down then tag.genre:=tag2.genre;
     writetag(dateien[k],tag,form2.achtungschreibschutz.checked,form2.lyrcstag.checked);
    end;
  end;
 progressbar.free;
 dateien.free;
end;


end.

