Программа для работы с тегами файлов .mp3
Северо-Кавказский
горно-металлургический институт
(Государственный
Технологический университет)
Курсовая
работа
по
дисциплине "Программирование на Delphi"
"Программа
для работы с тегами файлов .mp3"
г.
Владикавказ, 2015 г.
Задание на курсовую работу
Основная задача: Написать программу для работы с
тегами .mp3 файлов.
Необходимые функции: a)
Позволить пользователю задавать произвольную директорию, содержащую музыкальные
файлы.
б) Программа в зависимости от функциональности
осуществляет поиск или рекурсивный поиск файлов в этой директории и формирует csv-файл
следующим образом: абсолютный путь к mp3-файлу,
название, исполнитель, альбом, год. жанр.
в) Разделитель csv-файлов
задается пользователем.
г) Возможно выполнение обратной задачи:
пользователь задает csv-файл
аналогичного формата, программа исправляет теги в музыкальных файлах в
соответствии с данными, содержащимся в указанном csv-файле.
Метод решения.
Так как программа должна иметь графический и
интуитивно-понятный интерфейс, то для решения очень подходит Delphi.
Была выбрана и признана наиболее подходящей версия 7.0.
программа файл тег музыкальный
1. Входные и выходные данные
Входные данные:
Пользователь вводит при использовании функции
"загрузка mp3-файлов"
разделитель csv-файла в
строке ввода и выбирает директория для поиска mp3-файлов.
В данном случае mp3-файлы
являются входными файлами. И далее выбирает директорию для сохранения csv-файла
с загруженными Mp3-тегами.
Сsv-файла является в
данном случае выходными данными.
Выходные данные:
При использование функции "Загрузка csv-файла"
пользователь выбирает csv-файл
(который является входными данными). После этого в mp3-файлах,
указанных в csv-файле,
происходит корректировака mp3-тегов.
Mp3-файлы в этом
случае являются выходной информацией.
. Список процедуры и функций
Ядро программы:
) procedure
findfiles(startfolder,
mask: string;
tabl: TStringGrid;
scansubfolders: boolean
= true) - процедура ищет
файлы в указанной директории.
) procedure
FormActivate(Sender:
TObject) - процедура,
выполняющая начальные действия.
) procedure
Loadmp31Click(Sender:
TObject) - процедура
загрузки mp3-файлов.
) procedure
Exit1Click(Sender:
TObject) - процедура
выхода из программы.
) procedure
Loadcsv1Click(Sender:
TObject) - процедура
загрузки csv-файлов.
) procedure
About1Click(Sender:
TObject) - процедура
вызова формы, описывающего программу.
) procedure
delspace(var
s: string)
- процедура удаления пробелов их строк.
) function
getmp3tag(fn:
string): tmp3tag
функция получения mp3-тегов.
9) function write_probel(Count:
integer; rasmer : integer) : string - функция
написания
недостающих
пробелов.
) function SetMp3Tag(MP3Tag:
TMP3Tag; FileName: string): Boolean - функция
записи
тегов.
) procedure del_kavychki(var s:
string) - процедура удаления
кавычек
) procedure
write_db(adress_file_local : string; tabl : TStringGrid; str : string) - процедура
записи
в
csv-файл.
) procedure read_db (FileName:
String; separator: char; tabl : TStringGrid) - процедура
чтения
сsv-файла.
) function find_char(str : string) :
char -функция
нахождения
разделителя.
3. Вид окон программы
Ядро программы:
Подключаемые модули:
Модуль 1 (Заставка):
Модуль 2 (Выбор директории для сканирования):
Сохранение csv-файла:
Модуль 3 (Описание
программы):
4. Описание программы
Используемые элементы.
Ядро программы:
1) MainMenu1: TMainMenu;
) File1: TMenuItem;
) Loadmp31: TMenuItem;
) Exit1: TMenuItem;
) od1: TOpenDialog;
) tabl: TStringGrid;
) Loadcsv1: TMenuItem;
) About1: TMenuItem;
) sd1: TSaveDialog;
10) StatusBar1:
TStatusBar;
Подключаемые модули:
Модуль 1 (Заставка):
1) Panel1: TPanel;
) OKButton: TButton;
) Timer1: TTimer;
4) Image1:
TImage;
) Label1:
TLabel;
Модуль 2 (Выбор директории для сканирования):
1) DirectoryOutline1:
TDirectoryOutline;
) Label1: TLabel;
) Label2: TLabel;
) Button1: TButton;
) Edit1: TEdit;
7) Label3:
TLabel;
) Label4:
TLabel;
Модуль 3 (Описание программы):
1) Panel1: TPanel;
) ProductName: TLabel;
) Version: TLabel;
) Copyright: TLabel;
) Comments: TLabel;
) OKButton: TButton;
7) Image1:
TImage;
. Код программы
Ядро программы:
unit Unit2;, Messages, SysUtils,
Classes, Graphics, Controls, Forms,, StdCtrls, Menus, Grids, Outline, DirOutln,
ComCtrls, ShellCtrls, Masks,;tag = packed record, title, artist, album, year,
comment : string;;= class(TForm): TMainMenu;: TMenuItem;: TMenuItem;:
TMenuItem;: TOpenDialog;: TStringGrid;: TMenuItem;: TMenuItem;: TSaveDialog;findfiles(startfolder,
mask: string; tabl: TStringGrid;: boolean = true);FormActivate(Sender:
TObject);Loadmp31Click(Sender: TObject);Exit1Click(Sender:
TObject);Loadcsv1Click(Sender: TObject);About1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TForm1;:
integer;_db : string;Unit1, Unit4, Unit5;
{$R
*.dfm}
//------------------------------------------------------------------------------
//Функция для получения тегов
function getmp3tag(fn: string):
tmp3tag;: array[0..127] of char;: file;: byte;: string;delspace(var s: string);
begin // Удаляет пробелы и символы
// #0 в конце строки.
if length(s) = 0 then
exit;s[length(s)] in [' ', #0] do(s,length(s),1);s = '' then break;;;.filename
:= fn;.title := '';.artist := '';.album := '';.year := '';.comment :=
'';(f,fn); // Открываем файл
{$i-} // с проверкой его существования
:)(f,1);(f,filesize(f)-128); // Читаем тэг - последние 128 байт
blockread(f,tag,128);(f);
{$i+}ioresult<>0 then;;:= '';i
:= 0 to 127 do:= s + tag[i];.title := copy(s,4,30);(result.title);.artist :=
copy(s,34,30);(result.artist);.album := copy(s,64,30);(result.album);.year :=
copy(s,94,4);(result.year);.comment := copy(s,98,30);
delspace(result.comment);;
//конец функция для получения тегов
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Функция
для
написания
пробеловwrite_probel(Count:
integer; rasmer : integer) : string;: integer;:= '';(rasmer - count) = 1 then:=
' 'count < rasmer then:= ' ';i := 1 to 120 do:= result + ' ';;
end;
// Функция для написания пробелов
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//Функция для записи тегов в mp3-файл
function SetMp3Tag(MP3Tag: TMP3Tag;
FileName: string): boolean;_write : file of byte;: string[30];_probel :
string;_str : integer;:= false;(f_write, FileName);
{$i-}(f_write);
{$i+}(f_write,filesize(f_write)-125);
//Заносим
название_str
:= length(MP3Tag.Title);_probel := write_probel(size_str,30);:= MP3Tag.Title +
str_probel;(f_write, str, 30);
//Заносим
артиста_str
:= length(MP3Tag.Artist);_probel := write_probel(size_str,30);:= MP3Tag.Artist
+ str_probel;(f_write, str, 30);
//Заносим
альбом_str
:= length(MP3Tag.Album);_probel := write_probel(size_str,30);:= MP3Tag.Album +
str_probel;(f_write, str, 30);
//Заносим
год_str
:= length(MP3Tag.Year);_probel := write_probel(size_str,4);:= MP3Tag.Year +
str_probel;(f_write, str, 4);
//Заносим
комменты_str
:= length(MP3Tag.Comment);_probel := write_probel(size_str,30);:=
MP3Tag.Comment + str_probel;(f_write, str, 30);
// str := write_probel(1,128);
// write(f, str);(f_write);:=
true;:= false;
end;;
//конец функциb для записи тегов
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//Функция
для
удаления
" из
строкdel_kavychki(var
s: string);: integer;.length(s) = 0 then exit;
{$I-}(s,1,1);(s,length(s),1);
{$I+}
end;
//конец функции для удаления " из строк
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//функция для записи строк в csv-файл
procedure write_db(adress_file_local
: string; tabl : TStringGrid; str : string);: textfile;: integer;:=
'"'+str+'"';(fw, adress_file_local);(fw);i := 1 to tabl.RowCount - 1
do // ïðîõîä
ïî âñåì
ñòðîêàìtabl.Cells[0,i]<>
'' then begin(fw,
'"'+tabl.Cells[0, i],
str,.Cells[1, i], str,.Cells[2, i], str,.Cells[3, i], str,.Cells[4, i],
str,.Cells[5, i], str,.Cells[6, i]);;
end;
closefile(fw);
end; //конец
функции для записи строк в csv-файл
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//функция чтения строк из csv-файл
procedure read_db (FileName: String;
separator: char; tabl : TStringGrid);f: TextFile;, s2: string;, j: integer;:=
1;.RowCount := 2;.Cells[0, 1] := '';.Cells[1, 1] := '';.Cells[2, 1] :=
'';.Cells[3, 1] := '';.Cells[4, 1] := '';.Cells[5, 1] := '';.Cells[6, 1] :=
'';(f, FileName);
{$i+}not eof(f) do(f, s1);:= i +
1;:= 0;pos(separator, s1)<>0 do:= copy(s1,1,pos(separator, s1)-1);:= j +
1;(s1, 1, pos(separator, S1));_kavychki(s2);.Cells[j-1, i-1] := s2;;pos
(separator, s1)=0 then:= j + 1;.Cells[j-1, i-1] := s1;;.RowCount := i+1;;(f);
end;
//функция чтения строк из csv-файл
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//функция нахождения файлов и вложенных
кодкаталогов в указанной директории
procedure
TForm1.findfiles(startfolder, mask: string; tabl: TStringGrid;: boolean =
true);: tsearchrec;
findresult: integer;: integer;tag :
tmp3tag;
begin:=includetrailingbackslash(startfolder);:=findfirst(startfolder+'*.*',
faanyfile, searchrec);findresult = 0 do with searchrec do begin(attr and
fadirectory)<>0 then beginscansubfolders and (name<>'.') and
(name<>'..') then(startfolder+name, mask, tabl, scansubfolders);else
beginMatchesMask(name, mask) then
begintag :=
getmp3tag(startfolder+name);
tabl.RowCount:=tabl.RowCount+1;:= 1;
while tabl.Cells[0,nomer]<>'' do // ищем
пустую строку для добавления записи
nomer :=nomer+1;.Cells[0,nomer]:=
inttostr(nomer); // поле номер
задания.Cells[1,nomer]:=
mp3tag.filename; //поле имя
файла
получаем
из
OpenDialog
tabl.cells[2,nomer]:=
mp3tag.title;.Cells[3,nomer]:= mp3tag.artist;.Cells[4,nomer]:= mp3tag.album;
tabl.Cells[5,nomer]:=
mp3tag.year;.Cells[6,nomer]:=
mp3tag.comment;;;:=findnext(searchrec);;(searchrec);;
nomer := 1;;;
//конец функции нахождения файлов и вложенных
кодкаталогов в указанной директории
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//при создании формы создаем начало таблицу
procedure
TForm1.FormActivate(Sender: TObject);
//заполняем
шапку.cells[0,0]:=
'Номер';.cells[1,0]:=
'Адрес
файла';.cells[2,0]:=
'Название';.cells[3,0]:=
'Артист';.cells[4,0]:=
'Альбом';.cells[5,0]:=
'Год
выпуска';.cells[6,0]:=
'Комментарии';.ShowModal;.free;;
//Конец создание начало таблицы
//------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//Процедура на загрузку тегов в csv-файл из
указанного mp3-файла
procedure
TForm1.Loadmp31Click(Sender: TObject);: integer;.SimpleText:= 'Загружаем
mp3-файлы...';.Button1.Font.Color:=clWindowText;.ShowModal;OKRightDlg.Button1.Font.Color
= clScrollBar then:= 1;tabl.Cells[0,nomer]<>'' do.cells[0,nomer]:= '';
tabl.cells[1,nomer]:=
'';.cells[2,nomer]:= '';.cells[3,nomer]:= '';.cells[4,nomer]:=
'';.cells[5,nomer]:= '';.cells[6,nomer]:= '';
nomer := nomer + 1;;.RowCount :=
2;(OKRightDlg.DirectoryOutline1.directory, '*.mp3', tabl,
true);(OKRightDlg.Edit1.Text <> '"') and (length(OKRightDlg.Edit1.Text)
= 1) thensd1.execute then_db(sd1.filename , tabl,
OKRightDlg.Edit1.Text);.SimpleText:= 'Были
загруженны
mp3-файлы
из
директории'+OKRightDlg.DirectoryOutline1.directory+'.';
end.SimpleText:= 'Выбран неправильный
разделитель! Пожалуйста, выберите другой.';
end.SimpleText:= 'Загрузка
mp3-файлов
была
отменена!';
end;
//Конец процедуры на загрузку тегов в csv-файл
из указанного mp3-файла
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//функция на поиск указанного символа в
указанной строке
function find_char(str : string) :
char;, number : integer;(str, number);i := 1 to number doi < 4 then;(str[i]
= '"') and (str[i-2] = '"') then:= str[i-1];;
end;;;
//Конец функции на поиск указанного символа в
указанной строке
//-------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//процедура
на
загрузку
csvTForm1.Loadcsv1Click(Sender: TObject);tag : tmp3tag;
OldMp3Tag : tmp3tag;, position :
integer;
rasdelitel : char;_str : string;:
textfile;.SimpleText:= 'Загружаем
csv-файл...';od1.Execute
then // если
OpenDialog - выполнен без
ошибок
begin
//Узнаем какой разделитель задействован
AssignFile
(f, od1.FileName);
{$i-}(f);
{$i+}(f, file_str);:=
find_char(file_str);
closefile(f);
//Конец узнавания какой разделитель задействован
read_db(od1.FileName, rasdelitel,
tabl);i := 1 to tabl.RowCount - 1 do // проход
по
всем
строкам
mp3tag := getmp3tag(tabl.Cells[1,
i]);
OldMp3Tag.filename :=
tabl.Cells[1,i];Tag.title := tabl.Cells[2,i];Tag.artist :=
tabl.Cells[3,i];Tag.album := tabl.Cells[4,i];Tag.year :=
tabl.Cells[5,i];Tag.comment := tabl.Cells[6,i];Tag(OldMp3Tag, tabl.Cells[1,
i]);.SimpleText:= 'Загружен
сsv-файла
с
адресом
'+od1.FileName+'.';.SimpleText:= 'Загрузка
csv-файла
отменена!';
end;
//конец процедура на завершения программы
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//процедура
на
завершения
программыTForm1.Exit1Click(Sender:
TObject);.Terminate; //закрыть
приложение;
//конец процедура на завершения программы
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//Процедура,
показывающая
о
программеTForm1.About1Click(Sender:
TObject);.showmodal;
end;
end.
//конец процедуры, показывающую о программе
//------------------------------------------------------------------------------
Подключаемые модули:
a) Aboutbox
(описание программы):
unit Unit4;Windows, SysUtils,
Classes, Graphics, Forms, Controls, StdCtrls,, ExtCtrls, jpeg;= class(TForm):
TPanel;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;: TImage;
{ Public declarations };: TAboutBox;
{$R *.dfm}.
б) TOKRightDlg (модуль
для
задания
директории
с
mp3-файлами):Unit1;Windows,
SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,, ExtCtrls, ComCtrls,
ShellCtrls, Grids, Outline, DirOutln;= class(TForm): TDirectoryOutline;:
TMemo;: TLabel;: TLabel;: TButton;Memo1KeyPress(Sender: TObject; var Key:
Char);Button1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };:
TOKRightDlg;
{$R
*.dfm}TOKRightDlg.Memo1KeyPress(Sender: TObject; var Key: Char);.drive :=
Key;;TOKRightDlg.Button1Click(Sender: TObject);.close;;.
в) AboutBox1 (заставка):Unit5;Windows,
SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,, ExtCtrls, jpeg;=
class(TForm): TPanel;: TButton;: TTimer;: TImage;: TLabel;Timer1Timer(Sender:
TObject);
{ Private declarations }
{ Public declarations };:
TAboutBox1;Unit4;
{$R
*.dfm}TAboutBox1.Timer1Timer(Sender: TObject);;;.
. Блок-схемы
1) Загрузка mp3:
.SimpleText:= 'Загружаем
mp3-файлы...';.Button1.Font.Color:=clWindowText;.ShowModal;:= 1;tabl.Cells
[0,nomer]<>''
do.cells[0,nomer]:= '';
tabl.cells[1,nomer]:=
'';.cells[2,nomer]:= '';.cells[3,nomer]:= '';.cells[4,nomer]:=
'';.cells[5,nomer]:= '';
tabl.cells[6,nomer]:= '';:= nomer +
1;.RowCount := 2;.Button1.Font.= clScrollBar(OKRightDlg.DirectoryOutline1.
statusbar1.SimpleText:= 'Загрузка
directory, mp3-файлов была
отменена!';
'*.mp3', tabl, true);
(OKRightDlg.Edit1.Text <>
'"')(length(OKRightDlg..Text) = 1)1.SimpleText:=’Выбран
неправильный
разделитель! Пожалуйста, выберите другой.';
sd1.execute
write_db(sd1.filename , tabl,
OKRightDlg.Edit1.Text);.SimpleText:= 'Были
загруженны
mp3-файлы
из
директории'+OKRightDlg.DirectoryOutline1.directory+'.';.
2) Загрузка csv:
Begin.
statusbar1.SimpleText:=
'Загружаем
csv-файл...';.Execute(f,
od1.FileName); statusbar1.SimpleText:= {$i-} Reset(f); 'Загрузка
csv-файла
отменена!';
{$i+} readln (f, file_str);:=
find_char(file_str);(f);_db(od1.FileName,, tabl);:= 1 to.RowCount - 1
doTag.filename := tabl.Cells[1,i];
OldMp3Tag.title := tabl.Cells[2,i];
OldMp3Tag.artist :=
tabl.Cells[3,i];Tag.album := tabl.Cells[4,i];Tag.year :=
tabl.Cells[5,i;]Tag.comment := tabl.Cells[6,i];Tag(OldMp3Tag, tabl.Cells[1,
i]).