Files
lazarus-ccr/applications/cactusjukebox/source/editid3.pas
jesusr 00a628b20a compile with 2.5.1 and lazarus trunk,
reading unicode tags and filenames, 
show/hide app window with single click tray icon, 
create album cover if not exists, 
several fixes when there is just one song in collection, 
artist tree icons, handling of track numbers in n[/m] format, 
show path of current file (in playlist and title list), 
log output was corrupt due the use of crt unit, 
etc.


git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1761 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2011-07-26 06:36:09 +00:00

941 lines
27 KiB
ObjectPascal
Executable File

Unit editid3;
{
Edit/show file info dialog for Cactus Jukebox
written by Sebastian Kraft, <c> 2006-2008
Contact the author at: sebastian_kraft@gmx.de
This Software is published under the GPL
}
{$mode objfpc}{$H+}
Interface
Uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, FileUtil,
{ExtCtrls,} Buttons, ComCtrls, lcltype, mediacol, ExtCtrls, skin, last_fm, streamcol,
settings, debug, mp3file;
Const ALBUM_MODE = 1;
Const ARTIST_MODE = 2;
Const STREAM_MODE = 2;
Type
PLabel = ^TLabel;
PEdit = ^TEdit;
{ TEditID3 }
TEditID3 = Class(TForm)
albumedit1: TEdit;
albumedit2: TEdit;
albumedit3: TEdit;
artistedit1: TEdit;
artistedit2: TEdit;
artistedit3: TEdit;
btnOptions: TButton;
Button1: TButton;
cancelbut1: TButton;
cmbYear: TComboBox;
cmbComment: TComboBox;
GenreBox: TComboBox;
commentedit1: TEdit;
Edit1: TEdit;
Edit3: TEdit;
GroupBox1: TGroupBox;
NameEdit: TEdit;
URLEdit: TEdit;
guessname1: TButton;
Filelogo: TImage;
AlbumCoverImg: TImage;
Label1: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label2: TLabel;
Label3: TLabel;
lblTrack: TLabel;
Label21: TLabel;
idlabel: TLabel;
indexlabel: TLabel;
DescEdit: TMemo;
mtype: TLabel;
bitrate: TLabel;
fsize: TLabel;
btnReset: TButton;
srate: TLabel;
plength: TLabel;
Label7: TLabel;
Label9: TLabel;
savebut1: TButton;
id3v1tab: TTabSheet;
fileinfo: TTabSheet;
PicDownloadTimer: TTimer;
StreamTab: TTabSheet;
titleedit2: TEdit;
titleedit3: TEdit;
trackedit1: TEdit;
trackedit2: TEdit;
yearEdit1: TEdit;
lblArtist: TLabel;
lblTitle: TLabel;
lblAlbum: TLabel;
lblYear: TLabel;
lblGenre: TLabel;
lblComment: TLabel;
lblPath: TLabel;
metacontrol: TPageControl;
pathedit1: TEdit;
metatab: TTabSheet;
id3v2tab: TTabSheet;
titleedit1: TEdit;
yearEdit2: TEdit;
yearEdit3: TEdit;
procedure btnOptionsClick(Sender: TObject);
Procedure Button1Click(Sender: TObject);
Procedure btnResetClick(Sender: TObject);
Procedure EditID3Close(Sender: TObject; Var CloseAction: TCloseAction);
Procedure FormCreate(Sender: TObject);
Procedure FormHide(Sender: TObject);
Procedure PicDownloadTimerStartTimer(Sender: TObject);
Procedure PicDownloadTimerTimer(Sender: TObject);
Procedure cancelbutClick(Sender: TObject);
Procedure guessnameClick(Sender: TObject);
Procedure savebutClick(Sender: TObject);
Procedure yearEdit1Change(Sender: TObject);
Procedure cmbYearChange(Sender: TObject);
Procedure activateEMode(Sender: TObject);
Private
{ private declarations }
artist_only, album_only: Boolean;
timer_loop_count: integer;
request_send: boolean;
picrequest_send: boolean;
LastFMAPI: TLastfmAPIObject;
bEModeActive: boolean;
MedFileObj: TMediaFileClass;
MedColObj: TMediaCollectionClass;
StreamInfoObj: TStreamInfoItemClass;
GenreIDtoCBIndex: array[0..255, 0..255] of integer; //used to translate genre id to checkbox item index
// Edit-mode specific variable
ptrControls: array Of array Of ^TControl;
// ..
Procedure show_tags();
function GetCoverPath: boolean;
function GetTrack: string;
Public
{ public declarations }
fileid: integer;
Procedure display_window(MedFile:TMediaFileClass; intMode: Integer = 0);
Procedure display_window(StreamInfo: TStreamInfoItemClass);
End;
Var
EditID3win: TEditID3;
Implementation
{$R *.lfm}
Uses mainform, config, functions;
{ TEditID3 }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.savebutClick(Sender: TObject);
Var curartist, newart, oldart, oldalbum, newalbum, strNewYear, strNewComment: string;
z: integer;
bYearLongEnough: Boolean;
Begin
// only save if s.th. has been changed
If bEModeActive = false
Then
Begin
EditID3win.Hide;
exit;
End;
// check if the file exists and is writable
If (FileGetAttr(MedFileObj.path)<>faReadOnly)
Then
Begin
// write changes (artist-mode)
If artist_only=true
Then
Begin
oldart := lowercase(MedFileObj.artist);
newart := artistedit1.text;
strNewComment := self.cmbComment.Caption;
strNewYear := self.cmbYear.Caption;
If Length(strNewYear) = 4 Then
bYearLongEnough := true;
z := MedColObj.getTracks(oldart, MedFileObj.index);
Repeat
Begin
MedFileObj := MedColObj.Items[z];
DebugOutLn('artist_mode: '+ artistedit1.Text +' #'+ IntToStr(z),3);
MedFileObj.artist := newart;
if GenreBox.ItemIndex>=0 then MedFileObj.GenreID:= GenreIDtoCBIndex[0, GenreBox.ItemIndex];
If bYearLongEnough Then MedColObj.items[z].year := self.cmbYear.Caption;
MedFileObj.comment := strNewComment;
MedFileObj.write_tag;
z := MedColObj.getNext;
End;
Until z<0;
End
// write changes (album-mode)
Else If album_only=true
Then
Begin
curartist := lowercase(MedFileObj.artist);
oldalbum := lowercase(MedFileObj.album);
newalbum := albumedit1.text;
newart := artistedit1.text;
strNewComment := self.cmbComment.Caption;
strNewYear := self.cmbYear.Caption;
If Length(strNewYear) = 4 Then
bYearLongEnough := true;
z := MedColObj.getTracks(curartist, oldalbum, MedFileObj.index);
Repeat
Begin
MedFileObj := MedColObj.items[z];
MedFileObj.album := newalbum;
MedFileObj.Artist := newart;
If bYearLongEnough Then MedFileObj.year := self.cmbYear.Caption;
MedFileObj.comment := strNewComment;
if GenreBox.ItemIndex>=0 then MedFileObj.GenreID:= GenreIDtoCBIndex[0, GenreBox.ItemIndex];
MedFileObj.write_tag;
z := MedColObj.getNext;
End;
Until z<0;
End
// write changes (title-mode)
Else
Begin
MedFileObj.artist := artistedit1.text;
MedFileObj.title := titleedit1.text;
MedFileObj.album := albumedit1.text;
MedFileObj.year := yearedit1.text;
MedFileObj.comment := commentedit1.text;
MedFileObj.track := GetTrack;
if GenreBox.ItemIndex>=0 then MedFileObj.GenreID:= GenreIDtoCBIndex[0, GenreBox.ItemIndex];
MedFileObj.write_tag;
RenameFile(MedFileObj.path, UTF8ToSys(editid3win.pathedit1.text));
MedFileObj.path := UTF8ToSys(editid3win.pathedit1.text);
End;
If main.player_connected Then PlayerCol.SaveToFile(CactusConfig.DAPPath+'cactuslib');
main.update_artist_view;
update_title_view;
main.update_playlist;
End
Else
ShowMessage('Error: File(s) is/are read-only');
EditID3win.Hide;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.cancelbutClick(Sender: TObject);
Begin
EditID3win.Hide;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.yearEdit1Change(Sender: TObject);
Begin
// ensure only YYYY (years of four digits) are entered (if anything is entered)
If self.yearEdit1.Visible = true
Then
Begin
Case Length(self.yearEdit1.Caption) Of
0: self.savebut1.Enabled := true;
4:
Try
self.savebut1.Enabled := true;
StrToInt(self.yearEdit1.Caption);
Except
self.savebut1.Enabled := false;
End;
otherwise self.savebut1.Enabled := false;
End;
activateEMode(Sender);
End;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.cmbYearChange(Sender: TObject);
Begin
// ensure only YYYY (years of four digits) are entered (if anything is entered)
If self.cmbYear.Visible = true
Then
Begin
Case Length(self.cmbYear.Caption) Of
0: self.savebut1.Enabled := true;
4:
Try
self.savebut1.Enabled := true;
StrToInt(self.cmbYear.Caption);
Except
self.savebut1.Enabled := false;
End;
otherwise self.savebut1.Enabled := false;
End;
activateEMode(Sender);
End;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.activateEMode(Sender: TObject);
Var
i, j: Integer;
ptrLabel: ^TLabel;
ptrEdit: ^TEdit;
Begin
// disable all labels
If bEModeActive = false
Then
Begin
For i := 0 To Length(ptrControls) -1 Do
Begin
ptrLabel := PLabel(ptrControls[i,0]);
ptrLabel^.Enabled := false;
End;
bEModeActive := true;
btnReset.Enabled := true;
End;
// enable label if sender (a text-box) belongs to it
For i := 0 To Length(ptrControls) -1 Do
Begin
ptrLabel := PLabel(ptrControls[i,0]);
For j := 1 To Length(ptrControls[i]) -1 Do
Begin
ptrEdit := PEdit(ptrControls[i,j]);
If ptrEdit^ = Sender Then ptrLabel^.Enabled := true;
End
End;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.FormHide(Sender: TObject);
Begin
// reset form components
self.guessname1.Enabled := true;
self.Button1.Enabled := true;
self.pathedit1.Caption := '';
self.pathedit1.Enabled := true;
self.artistedit1.Caption := '';
self.artistedit1.Enabled := true;
self.titleedit1.Caption := '';
self.titleedit1.Enabled := true;
self.albumedit1.Caption := '';
self.albumedit1.Enabled := true;
self.trackedit1.Caption := '';
self.trackedit1.Enabled := true;
self.yearEdit1.Caption := '';
self.yearEdit1.Enabled := true;
self.commentedit1.Caption := '';
self.commentedit1.Enabled := true;
self.AlbumCoverImg.Canvas.Clear;
self.AlbumCoverImg.Picture.Clear;
self.PicDownloadTimer.Enabled := false;
self.cmbYear.Visible := false;
self.yearEdit1.Visible := true;
self.cmbComment.Visible := false;
self.commentedit1.Visible := true;
// self.ShowInTaskBar := stNever;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.PicDownloadTimerStartTimer(Sender: TObject);
Begin
timer_loop_count := 0;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.PicDownloadTimerTimer(Sender: TObject);
Begin
inc(timer_loop_count);
If (timer_loop_count Mod 8)=0 Then AlbumCoverImg.Canvas.Clear
Else AlbumCoverImg.Canvas.TextOut(10,10, 'Loading...');
If (timer_loop_count>20) Then
Begin
DebugOutLn('TIMEOUT while loading album cover image from Internet', 2);
AlbumCoverImg.Canvas.Clear;
AlbumCoverImg.Canvas.TextOut(10,10, 'No cover found :(');
LastFMAPI.free;
picrequest_send := false;
PicDownloadTimer.Enabled := false;
End;
If (picrequest_send) And LastFMAPI.data_ready Then
Begin
writeln(MedFileObj.CoverPath);
AlbumCoverImg.Canvas.Clear;
Try
AlbumCoverImg.Picture.LoadFromFile(MedFileObj.CoverPath);
Except
DebugOutLn('EXCEPTION', 1);
End;
LastFMAPI.free;
picrequest_send := false;
PicDownloadTimer.Enabled := false;
End;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.EditID3Close(Sender: TObject; Var CloseAction: TCloseAction);
Begin
// Filelogo.free;
// AlbumCoverImg.free;
// PicDownloadTimer.Enabled:=false;
// PicDownloadTimer.Free;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.FormCreate(Sender: TObject);
Var
i: integer;
GenreList, numberlist: TStringlist;
Aname, Avalue: string;
Begin
// initialize index of labels and text boxes on form - used for edit-mode
SetLength(ptrControls, 8);
For i := 0 To Length(ptrControls) -1 Do
SetLength(ptrControls[i], 2);
ptrControls[0,0] := @self.lblPath;
ptrControls[0,1] := @self.pathedit1;
ptrControls[1,0] := @self.lblArtist;
ptrControls[1,1] := @self.artistedit1;
ptrControls[2,0] := @self.lblTitle;
ptrControls[2,1] := @self.titleedit1;
ptrControls[3,0] := @self.lblAlbum;
ptrControls[3,1] := @self.albumedit1;
ptrControls[4,0] := @self.lblTrack;
ptrControls[4,1] := @self.trackedit1;
ptrControls[5,0] := @self.lblGenre;
ptrControls[5,1] := @self.GenreBox;
SetLength(ptrControls[6], 3);
ptrControls[6,0] := @self.lblComment;
ptrControls[6,1] := @self.commentedit1;
ptrControls[6,2] := @self.cmbComment;
SetLength(ptrControls[7], 3);
ptrControls[7,0] := @self.lblYear;
ptrControls[7,1] := @self.yearEdit1;
ptrControls[7,2] := @self.cmbYear;
// (FIXME) ressourcestring translations need to be added here
//TODO: translation for editid3 window
Icon.LoadFromFile(CactusConfig.DataPrefix+'icon'+DirectorySeparator+'cactus-icon.ico');
GenreList:=TStringList.Create;
for i:= 0 to high(ID3Genre) do begin
GenreList.Add(ID3Genre[i]+'='+IntToStr(i));
end;
GenreList.Sorted:=true;
for i:= 0 to high(ID3Genre) do begin
GenreList.GetNameValue(i, Aname, Avalue);
GenreIDtoCBIndex[0,i]:=StrToInt(Avalue);
GenreIDtoCBIndex[StrToInt(Avalue),0]:=i;
GenreBox.Items.Add(Aname);
end;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.show_tags();
Var
strYears: Array Of String[4];
strComments: Array Of String;
bExists: Boolean;
i, j: Integer;
ptrLabel: ^TLabel;
Begin
// reset all labels indicating edit-mode and changes
GenreBox.ItemIndex:=-1;
For i := 0 To Length(ptrControls) -1 Do
Begin
ptrLabel := PLabel(ptrControls[i,0]);
ptrLabel^.Enabled := true;
End;
// display tags...
artistedit1.Text := MedFileObj.artist;
// artist and album(-mode) specific actions
If (artist_only = true) Or (album_only = true)
Then
Begin
// collect all "years" set for files of the chosen artist/album
// and display them
SetLength(strYears, 0);
For i := 0 To MedColObj.ItemCount -1 Do
If MedColObj.items[i].artist = MedFileObj.artist
Then
Begin
If album_only = true Then
If MedColObj.items[i].album <> MedFileObj.album Then continue;
// ensure "year" is added only once
bExists := false;
For j := 0 To Length(strYears) -1 Do
If strYears[j] = MedColObj.items[i].year
Then
Begin
bExists := true;
break;
End;
If bExists = true Then continue;
// add "year"
SetLength(strYears, Length(strYears) +1);
strYears[Length(strYears) -1] := MedColObj.items[i].year;
End;
// and display...
yearEdit1.Visible := false;
cmbYear.Visible := true;
cmbYear.Clear;
For i := 0 To Length(strYears) -1 Do
cmbYear.Items.Add(strYears[i]);
// collect all "comments" set for files of the chosen artist/album
// and display them
SetLength(strComments, 0);
For i := 1 To self.MedColObj.ItemCount-1 Do
If MedColObj.items[i].artist = MedFileObj.artist
Then
Begin
If album_only = true Then
If MedColObj.items[i].album <> self.MedFileObj.album Then continue;
// ensure "comment" is added only once
bExists := false;
For j := 0 To Length(strComments) -1 Do
If strComments[j] = MedColObj.items[i].comment
Then
Begin
bExists := true;
break;
End;
If bExists = true Then continue;
// add "comment"
SetLength(strComments, Length(strComments) +1);
strComments[Length(strComments) -1] := MedColObj.items[i].comment;
End;
// and display...
commentedit1.Visible := false;
cmbComment.Visible := true;
cmbComment.Clear;
For i := 0 To Length(strComments) -1 Do
cmbComment.Items.Add(strComments[i]);
// album(-mode) specific actions
If album_only = true
Then
Begin
albumedit1.text := MedFileObj.album;
// select first entry from combobox as default for the album
If cmbYear.Items.Count > 0 Then cmbYear.ItemIndex := 0;
If cmbComment.Items.Count > 0 Then cmbComment.ItemIndex := 0;
End;
End
// title(-mode) specific actions
Else
Begin
pathedit1.text := SysToUTF8(MedFileObj.path);
//TODO: scroll TEdit to end of path
titleedit1.text := MedFileObj.title;
albumedit1.text := MedFileObj.album;
commentedit1.text := MedFileObj.comment;
yearedit1.text := MedFileObj.year;
trackedit1.text := MedFileObj.track;
GenreBox.ItemIndex:=GenreIDtoCBIndex[MedFileObj.GenreID, 0];
End;
btnReset.Enabled := false;
bEModeActive := false;
End;
function TEditID3.GetCoverPath: boolean;
begin
MedFileObj.CoverPath := CactusConfig.GetCoverPath(MedFileObj.GetCoverFile);
result := FileExists(MedFileObj.CoverPath);
end;
function TEditID3.GetTrack: string;
var
A,B: Integer;
AStr,BStr: string;
begin
// track must conform to n[/m]
AStr := Trim(trackedit1.text);
A := pos('/', AStr);
if A>0 then begin
BStr := Trim(Copy(AStr, A+1, Length(AStr)));
AStr := Trim(Copy(AStr, 1, A-1));
B := StrToIntDef(BStr, -1);
end else
B := -1;
A := StrToIntDef(AStr, -1);
if A<0 then
result := ''
else
if B<0 then
result := AStr
else
result := AStr + '/' + BStr;
end;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.display_window(MedFile: TMediaFileClass; intMode: Integer);
Begin
// set up gui elements
metacontrol.Pages[0].TabVisible := true;
metacontrol.Pages[1].TabVisible := true;
metacontrol.Pages[2].TabVisible := false;
metacontrol.ActivePage := metacontrol.Pages[0];
btnReset.Enabled := true;
MedFileObj := MedFile;
MedColObj := MedFileObj.Collection;
fileid := 0;
self.artist_only := false;
self.album_only := false;
Case intMode Of
ALBUM_MODE: self.album_only := true;
ARTIST_MODE: self.artist_only := true;
End;
Button1.Hint := '( ' + CactusConfig.strTagToNameFormatString + ' )';
Button1.Enabled := true;
// artist and album(-mode) specific actions
If (artist_only = true) Or (album_only = true)
Then
Begin
self.guessname1.Enabled := false;
self.pathedit1.Enabled := false;
self.titleedit1.Enabled := false;
self.indexlabel.Caption := 'File-Index: ' + IntToStr(MedFileObj.index);
// artist(-mode) specific actions
If artist_only = true
Then
self.albumedit1.Enabled := false;
// album(-mode) specific actions
If album_only = true
Then
Begin
DebugOutLn('########AlbumCover', 5);
If (MedFileObj.album<>'') and CactusConfig.CheckCoverPath
Then
Begin
if GetCoverPath then
Begin
Try
AlbumCoverImg.Picture.LoadFromFile(MedFileObj.CoverPath);
Except
writeln('EXCEPTION loading cover file from '+MedFileObj.CoverPath);
End;
End
Else
Begin
If CactusConfig.CoverDownload
Then
Begin
LastFMAPI := TLastfmAPIObject.Create;
if CactusConfig.CoverSize='large' then LastFMAPI.CoverSize:=ExtralargeImage
else LastFMAPI.CoverSize:=LargeImage;
LastFMAPI.album_downloadCover(MedFileObj.artist, MedFileObj.album, MedFileObj.CoverPath);
picrequest_send := true;
AlbumCoverImg.Canvas.TextOut(10,10, 'Loading...');
PicDownloadTimer.Enabled := true;
Application.ProcessMessages;
End;
End;
End;
End;
End
// title(-mode) specific actions
Else
Begin
self.guessname1.Enabled := true;
mtype.caption := 'Mediatype: '+MedFileObj.filetype;
If MedFileObj.filetype='.mp3' Then
Filelogo.Picture.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+'icon'+
DirectorySeparator+'mp3_64.png');
If MedFileObj.filetype='.ogg' Then
Filelogo.Picture.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+'icon'+
DirectorySeparator+'ogg_64.png');
If MedFileObj.filetype='.wav' Then
Filelogo.Picture.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+'icon'+
DirectorySeparator+'wav_64.png');
If MedFileObj.filetype='.wma' Then
Filelogo.Picture.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+'icon'+
DirectorySeparator+'wma_64.png');
If (MedFileObj.filetype='.flac') or (MedFileObj.filetype='.fla') Then
Filelogo.Picture.LoadFromFile(SkinData.DefaultPath+DirectorySeparator+'icon'+
DirectorySeparator+'flac_64.png');
plength.caption := 'Length: '+MedFileObj.playtime;
fsize.caption := 'Size: '+ByteToFmtString(MedFileObj.size, 2, 2);
srate.Caption := 'Samplerate: ' + IntToStr(MedFileObj.samplerate) + ' Hz';
bitrate.Caption := 'Bitrate: ' + IntToStr(MedFileObj.bitrate) + ' kbps';
idlabel.Caption := 'File-Id: ' + IntToStr(MedFileObj.id);
indexlabel.Caption := 'File-Index: ' + IntToStr(MedFileObj.index);
writeln('########AlbumCover');
// DEBUG-INFO
If (MedFileObj.album<>'') and CactusConfig.CheckCoverPath
Then
Begin
if GetCoverPath
Then
Begin
Try
AlbumCoverImg.Picture.LoadFromFile(MedFileObj.CoverPath);
Except
writeln('EXCEPTION loading cover');
End;
End
Else
Begin
If CactusConfig.CoverDownload
Then
Begin
LastFMAPI := TLastfmAPIObject.Create;
if CactusConfig.CoverSize='large' then LastFMAPI.CoverSize:=ExtralargeImage
else LastFMAPI.CoverSize:=LargeImage;
LastFMAPI.album_downloadCover(MedFileObj.artist, MedFileObj.album, MedFileObj.CoverPath);
picrequest_send := true;
AlbumCoverImg.Canvas.TextOut(10,10, 'Loading...');
PicDownloadTimer.Enabled := true;
Application.ProcessMessages;
End;
End;
End;
End;
show_tags();
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.display_window(StreamInfo: TStreamInfoItemClass);
Begin
StreamInfoObj := StreamInfo;
metacontrol.Pages[0].TabVisible := false;
metacontrol.Pages[1].TabVisible := false;
metacontrol.Pages[2].TabVisible := true;
metacontrol.ActivePage := metacontrol.Pages[2];
btnReset.Enabled := true;
NameEdit.Text := StreamInfoObj.Name;
URLEdit.Text := StreamInfoObj.URL;
DescEdit.Text := StreamInfoObj.Description;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.Button1Click(Sender: TObject);
Var
//s: string;
z: integer;
Begin
{
// write changes (artist-mode)
If artist_only=true
Then
Begin
oldart := lowercase(MedFileObj.artist);
newart := artistedit1.text;
strNewComment := self.cmbComment.Caption;
strNewYear := self.cmbYear.Caption;
If Length(strNewYear) = 4 Then
bYearLongEnough := true;
z := MedColObj.getTracks(oldart, MedFileObj.index);
Repeat
Begin
MedFileObj := MedColObj.Items[z];
writeln('artist_mode: '+ artistedit1.Text +' #'+ IntToStr(z));
// DEBUG-INFO
MedFileObj.artist := newart;
If bYearLongEnough Then MedColObj.items[z].year := self.cmbYear.Caption;
MedFileObj.comment := strNewComment;
MedFileObj.write_tag;
z := MedColObj.getNext;
End;
Until z<0;
End
// write changes (album-mode)
}
if artist_only = true then // title-mode
begin
z := MedColObj.getTracks(lowercase(MedFileObj.artist), MedFileObj.index);
repeat
begin
MedFileObj := MedColObj.items[z];
MedFileObj.PathNameFromTag(CactusConfig.strTagToNameFormatString);
z := MedColObj.getNext;
End;
Until z < 0;
end
else if album_only = true then // album-mode
begin
z := MedColObj.getTracks(lowercase(MedFileObj.artist), lowercase(MedFileObj.album),
MedFileObj.index);
repeat
begin
MedFileObj := MedColObj.items[z];
MedFileObj.PathNameFromTag(CactusConfig.strTagToNameFormatString);
z := MedColObj.getNext;
End;
Until z < 0;
end
else // title-mode
begin
MedFileObj.PathNameFromTag(CactusConfig.strTagToNameFormatString);
EditID3win.pathedit1.text := SysToUTF8(MedFileObj.Path);
end;
// EditID3win.pathedit1.text := s;
End;
procedure TEditID3.btnOptionsClick(Sender: TObject);
Var
setupwin: TSettings;
begin
Enabled := false;
setupwin := Tsettings.Create(Application);
setupwin.ShowModal(TSETTINGS_SELECT_ID3);
setupwin.Free;
Enabled := true;
end;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Procedure TEditID3.btnResetClick(Sender: TObject);
Begin
show_tags();
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// TODO: check ....
Procedure TEditID3.guessnameClick(Sender: TObject);
Var z: integer;
tmps: string;
Begin
tmps := extractfilename(UTF8ToSys(pathedit1.Text));
If ((tmps[1]<#60) And (tmps[2]<#60) And (tmps[4]=#45)) Then
Begin
trackedit1.text := SysToUTF8(copy(tmps,1,2));
delete(tmps, 1, 5);
End;
z := pos(' - ', tmps)+3;
If z<>3 Then
Begin
titleedit1.text := SysToUTF8(TrimRight(copy(tmps,z,length(tmps)-z-3)));
artistedit1.text := SysToUTF8(TrimRight(copy(tmps,1,z-3)));
End
Else
Begin
artistedit1.text := '';
titleedit1.text := '';
End;
End;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
End.