Программа для работы с тегами файлов.
mp3
Procedure write_db (adress_file_local: string; tabl: TStringGrid; str: string) — процедура записи в csv-файл. Procedure About1Click (Sender: TObject) — процедура вызова формы, описывающего программу. Procedure read_db (FileName: String; separator: char; tabl: TStringGrid) — процедура чтения сsv-файла. Procedure FormActivate (Sender: TObject) — процедура, выполняющая начальные действия. AssignFile… Читать ещё >
Программа для работы с тегами файлов. 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-файлы в этом случае являются выходной информацией.
2. Список процедуры и функций Ядро программы:
1) procedure findfiles (startfolder, mask: string; tabl: TStringGrid; scansubfolders: boolean = true) — процедура ищет файлы в указанной директории.
2) procedure FormActivate (Sender: TObject) — процедура, выполняющая начальные действия.
3) procedure Loadmp31Click (Sender: TObject) — процедура загрузки mp3-файлов.
4) procedure Exit1Click (Sender: TObject) — процедура выхода из программы.
5) procedure Loadcsv1Click (Sender: TObject) — процедура загрузки csv-файлов.
6) procedure About1Click (Sender: TObject) — процедура вызова формы, описывающего программу.
7) procedure delspace (var s: string) — процедура удаления пробелов их строк.
8) function getmp3tag (fn: string): tmp3tag функция получения mp3-тегов.
9) function write_probel (Count: integer; rasmer: integer): string — функция написания недостающих пробелов.
10) function SetMp3Tag (MP3Tag: TMP3Tag; FileName: string): Boolean — функция записи тегов.
11) procedure del_kavychki (var s: string) — процедура удаления кавычек
12) procedure write_db (adress_file_local: string; tabl: TStringGrid; str: string) — процедура записи в csv-файл.
13) procedure read_db (FileName: String; separator: char; tabl: TStringGrid) — процедура чтения сsv-файла.
14) function find_char (str: string): charфункция нахождения разделителя.
3. Вид окон программы Ядро программы:
Подключаемые модули:
Модуль 1 (Заставка):
Модуль 2 (Выбор директории для сканирования):
Сохранение csv-файла:
Модуль 3 (Описание программы):
4. Описание программы Используемые элементы.
Ядро программы:
1) MainMenu1: TMainMenu;
2) File1: TMenuItem;
3) Loadmp31: TMenuItem;
4) Exit1: TMenuItem;
5) od1: TOpenDialog;
6) tabl: TStringGrid;
7) Loadcsv1: TMenuItem;
8) About1: TMenuItem;
9) sd1: TSaveDialog;
10) StatusBar1: TStatusBar;
Подключаемые модули:
Модуль 1 (Заставка):
1) Panel1: TPanel;
2) OKButton: TButton;
3) Timer1: TTimer;
4) Image1: TImage;
5) Label1: TLabel;
Модуль 2 (Выбор директории для сканирования):
1) DirectoryOutline1: TDirectoryOutline;
2) Memo1: TMemo;
3) Label1: TLabel;
4) Label2: TLabel;
5) Button1: TButton;
6) Edit1: TEdit;
7) Label3: TLabel;
8) Label4: TLabel;
Модуль 3 (Описание программы):
1) Panel1: TPanel;
2) ProductName: TLabel;
3) Version: TLabel;
4) Copyright: TLabel;
5) Comments: TLabel;
6) OKButton: TButton;
7) Image1: TImage;
5. Код программы Ядро программы:
unit Unit2;
interface
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, Grids, Outline, DirOutln, ComCtrls, ShellCtrls, Masks,
ExtCtrls;
type
tmp3tag = packed record
filename, title, artist, album, year, comment: string;
end;
TForm1 = class (TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Loadmp31: TMenuItem;
Exit1: TMenuItem;
od1: TOpenDialog;
tabl: TStringGrid;
Loadcsv1: TMenuItem;
About1: TMenuItem;
sd1: TSaveDialog;
procedure findfiles (startfolder, mask: string; tabl: TStringGrid;
scansubfolders: boolean = true);
procedure FormActivate (Sender: TObject);
procedure Loadmp31Click (Sender: TObject);
procedure Exit1Click (Sender: TObject);
procedure Loadcsv1Click (Sender: TObject);
procedure About1Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
nomer: integer;
adress_db: string;
implementation
uses Unit1, Unit4, Unit5;
{$R *.dfm}
//——————————————————————————————————————-;
//Функция для получения тегов
function getmp3tag (fn: string): tmp3tag;
var
tag: array[0.127] of char;
f: file;
i: byte;
s: string;
procedure delspace (var s: string);
begin // Удаляет пробелы и символы
// #0 в конце строки.
if length (s) = 0 then exit;
while s[length (s)] in [' ', #0] do
begin
delete (s, length (s), 1);
if s = '' then break;
end;
end;
begin
result.filename := fn;
result.title := '';
result.artist := '';
result.album := '';
result.year := '';
result.comment := '';
assignfile (f, fn); // Открываем файл
{$i-} // с проверкой его существования :)
reset (f, 1);
seek (f, filesize (f)-128); // Читаем тэг — последние 128 байт
blockread (f, tag, 128);
closefile (f);
{$i+}
if ioresult<>0 then
begin
exit;
end;
s := '';
for i := 0 to 127 do
s := s + tag[i];
result.title := copy (s, 4,30);
delspace (result.title);
result.artist := copy (s, 34,30);
delspace (result.artist);
result.album := copy (s, 64,30);
delspace (result.album);
result.year := copy (s, 94,4);
delspace (result.year);
result.comment := copy (s, 98,30);
delspace (result.comment);
end;
//конец функция для получения тегов
//——————————————————————————————————————-;
//——————————————————————————————————————-;
// Функция для написания пробелов
function write_probel (Count: integer; rasmer: integer): string;
var
i: integer;
begin
result := '';
if (rasmer — count) = 1 then
result := ' '
else
if count < rasmer then
begin
result := ' ';
for i := 1 to 120 do
result := result + ' ';
end;
end;
// Функция для написания пробелов
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//Функция для записи тегов в mp3-файл
function SetMp3Tag (MP3Tag: TMP3Tag; FileName: string): boolean;
var
f_write: file of byte;
str: string[30];
str_probel: string;
size_str: integer;
begin
Result := false;
try
assignfile (f_write, FileName);
{$i-}
reset (f_write);
{$i+}
seek (f_write, filesize (f_write)-125);
//Заносим название
size_str := length (MP3Tag.Title);
str_probel := write_probel (size_str, 30);
str := MP3Tag. Title + str_probel;
blockwrite (f_write, str, 30);
//Заносим артиста
size_str := length (MP3Tag.Artist);
str_probel := write_probel (size_str, 30);
str := MP3Tag. Artist + str_probel;
blockwrite (f_write, str, 30);
//Заносим альбом
size_str := length (MP3Tag.Album);
str_probel := write_probel (size_str, 30);
str := MP3Tag. Album + str_probel;
blockwrite (f_write, str, 30);
//Заносим год
size_str := length (MP3Tag.Year);
str_probel := write_probel (size_str, 4);
str := MP3Tag. Year + str_probel;
blockwrite (f_write, str, 4);
//Заносим комменты
size_str := length (MP3Tag.Comment);
str_probel := write_probel (size_str, 30);
str := MP3Tag. Comment + str_probel;
blockwrite (f_write, str, 30);
// str := write_probel (1,128);
// write (f, str);
closefile (f_write);
Result := true;
except
Result := false;
end;
end;
//конец функциb для записи тегов
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//Функция для удаления «из строк
procedure del_kavychki (var s: string);
var
i: integer;
begin .
if length (s) = 0 then exit;
{$I-}
delete (s, 1,1);
delete (s, length (s), 1);
{$I+}
end;
//конец функции для удаления «из строк
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//функция для записи строк в csv-файл
procedure write_db (adress_file_local: string; tabl: TStringGrid; str: string);
var
fw: textfile;
i: integer;
begin
str := '" '+str+'" ';
assignfile (fw, adress_file_local);
ReWrite (fw);
for i := 1 to tabl. RowCount — 1 do // проход по всем строкам
begin
if tabl. Cells[0,i]<> '' then begin
WriteLn (fw,
'" '+tabl.Cells[0, i], str,
tabl.Cells[1, i], str,
tabl.Cells[2, i], str,
tabl.Cells[3, i], str,
tabl.Cells[4, i], str,
tabl.Cells[5, i], str,
tabl.Cells[6, i]);
end;
end;
closefile (fw);
end; //конец функции для записи строк в csv-файл
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//функция чтения строк из csv-файл
procedure read_db (FileName: String; separator: char; tabl: TStringGrid);
var f: TextFile;
s1, s2: string;
i, j: integer;
begin
i := 1;
tabl.RowCount := 2;
tabl.Cells[0, 1] := '';
tabl.Cells[1, 1] := '';
tabl.Cells[2, 1] := '';
tabl.Cells[3, 1] := '';
tabl.Cells[4, 1] := '';
tabl.Cells[5, 1] := '';
tabl.Cells[6, 1] := '';
AssignFile (f, FileName);
{$i-}
Reset (f);
{$i+}
while not eof (f) do
begin
readln (f, s1);
i := i + 1;
j := 0;
while pos (separator, s1)<>0 do
begin
s2 := copy (s1,1,pos (separator, s1)-1);
j := j + 1;
delete (s1, 1, pos (separator, S1));
del_kavychki (s2);
tabl.Cells[j-1, i-1] := s2;
end;
if pos (separator, s1)=0 then
begin
j := j + 1;
tabl.Cells[j-1, i-1] := s1;
end;
tabl.RowCount := i+1;
end;
CloseFile (f);
end;
//функция чтения строк из csv-файл
//—————————————————————————————————————-;
//—————————————————————————————————————-;
//функция нахождения файлов и вложенных кодкаталогов в указанной директории
procedure TForm1. findfiles (startfolder, mask: string; tabl: TStringGrid;
scansubfolders: boolean = true);
var
searchrec: tsearchrec;
findresult: integer;
nomer: integer;
mp3tag: tmp3tag;
begin
try
startfolder:=includetrailingbackslash (startfolder);
findresult:=findfirst (startfolder+'*.*', faanyfile, searchrec);
try
while findresult = 0 do with searchrec do begin
if (attr and fadirectory)<>0 then begin
if scansubfolders and (name<>'.') and (name<>'.') then
findfiles (startfolder+name, mask, tabl, scansubfolders);
end else begin
if MatchesMask (name, mask) then
begin
mp3tag := getmp3tag (startfolder+name);
tabl.RowCount:=tabl.RowCount+1;
nomer := 1;
while tabl. Cells[0,nomer]<>'' do // ищем пустую строку для добавления записи
nomer :=nomer+1;
tabl.Cells[0,nomer]: = inttostr (nomer); // поле номер задания
tabl.Cells[1,nomer]: = mp3tag. filename; //поле имя файла получаем из OpenDialog
tabl.cells[2,nomer]: = mp3tag. title;
tabl.Cells[3,nomer]: = mp3tag. artist;
tabl.Cells[4,nomer]: = mp3tag. album;
tabl.Cells[5,nomer]: = mp3tag. year;
tabl.Cells[6,nomer]: = mp3tag. comment;
end;
end;
findresult:=findnext (searchrec);
end;
finally
findclose (searchrec);
end;
finally
nomer := 1;
end;
end;
//конец функции нахождения файлов и вложенных кодкаталогов в указанной директории
//—————————————————————————————————————-;
//—————————————————————————————————————-;
//при создании формы создаем начало таблицу
procedure TForm1. FormActivate (Sender: TObject);
begin
//заполняем шапку
tabl.cells[0,0]: = 'Номер';
tabl.cells[1,0]: = 'Адрес файла';
tabl.cells[2,0]: = 'Название';
tabl.cells[3,0]: = 'Артист';
tabl.cells[4,0]: = 'Альбом';
tabl.cells[5,0]: = 'Год выпуска';
tabl.cells[6,0]: = 'Комментарии';
AboutBox1.ShowModal;
aboutbox1.free;
end;
//Конец создание начало таблицы
//——————————————————————————————————————-;
//———————————————————————————————————————;
//Процедура на загрузку тегов в csv-файл из указанного mp3-файла
procedure TForm1. Loadmp31Click (Sender: TObject);
var
nomer: integer;
begin
statusbar1.SimpleText:= 'Загружаем mp3-файлы…';
OKRightDlg.Button1.Font.Color:=clWindowText;
OKRightDlg.ShowModal;
if OKRightDlg. Button1.Font.Color = clScrollBar then
begin
nomer := 1;
while tabl. Cells[0,nomer]<>'' do
begin
tabl.cells[0,nomer]: = '';
tabl.cells[1,nomer]: = '';
tabl.cells[2,nomer]: = '';
tabl.cells[3,nomer]: = '';
tabl.cells[4,nomer]: = '';
tabl.cells[5,nomer]: = '';
tabl.cells[6,nomer]: = '';
nomer := nomer + 1;
end;
tabl.RowCount := 2;
findfiles (OKRightDlg.DirectoryOutline1.directory, '*.mp3', tabl, true);
if (OKRightDlg.Edit1.Text <> '" ') and (length (OKRightDlg.Edit1.Text) = 1) then
begin
if sd1. execute then
write_db (sd1.filename, tabl, OKRightDlg. Edit1.Text);
statusbar1.SimpleText:= 'Были загруженны mp3-файлы из директории'+OKRightDlg.DirectoryOutline1.directory+'.';
end
else
statusbar1.SimpleText:= 'Выбран неправильный разделитель! Пожалуйста, выберите другой.';
end
else
statusbar1.SimpleText:= 'Загрузка mp3-файлов была отменена!';
end;
//Конец процедуры на загрузку тегов в csv-файл из указанного mp3-файла
//———————————————————————————————————————;
//———————————————————————————————————————;
//функция на поиск указанного символа в указанной строке
function find_char (str: string): char;
var
i, number: integer;
begin
SetLength (str, number);
for i := 1 to number do
begin
if i < 4 then
continue;
if (str[i] = '" ') and (str[i-2] = '" ') then
begin
result := str[i-1];
exit;
end;
end;
end;
//Конец функции на поиск указанного символа в указанной строке
//———————————————————————————————————————;
//——————————————————————————————————————-;
//процедура на загрузку csv
procedure TForm1. Loadcsv1Click (Sender: TObject);
var
mp3tag: tmp3tag;
OldMp3Tag: tmp3tag;
i, position: integer;
rasdelitel: char;
file_str: string;
f: textfile;
begin
statusbar1.SimpleText:= 'Загружаем csv-файл…';
if od1. Execute then // если OpenDialog — выполнен без ошибок
begin
//Узнаем какой разделитель задействован
AssignFile (f, od1. FileName);
{$i-}
Reset (f);
{$i+}
readln (f, file_str);
rasdelitel := find_char (file_str);
closefile (f);
//Конец узнавания какой разделитель задействован
read_db (od1.FileName, rasdelitel, tabl);
for i := 1 to tabl. RowCount — 1 do // проход по всем строкам
begin
mp3tag := getmp3tag (tabl.Cells[1, i]);
OldMp3Tag.filename := tabl. Cells[1,i];
OldMp3Tag.title := tabl. Cells[2,i];
OldMp3Tag.artist := tabl. Cells[3,i];
OldMp3Tag.album := tabl. Cells[4,i];
OldMp3Tag.year := tabl. Cells[5,i];
OldMp3Tag.comment := tabl. Cells[6,i];
SetMp3Tag (OldMp3Tag, tabl. Cells[1, i])
end;
statusbar1.SimpleText:= 'Загружен сsv-файла с адресом '+od1.FileName+'.';
end
else
statusbar1.SimpleText:= 'Загрузка csv-файла отменена!';
end;
//конец процедура на завершения программы
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//процедура на завершения программы
procedure TForm1. Exit1Click (Sender: TObject);
begin
Application.Terminate; //закрыть приложение
end;
//конец процедура на завершения программы
//——————————————————————————————————————-;
//——————————————————————————————————————-;
//Процедура, показывающая о программе
procedure TForm1. About1Click (Sender: TObject);
begin
aboutbox.showmodal;
end;
end.
//конец процедуры, показывающую о программе
//——————————————————————————————————————-;
Подключаемые модули:
a) Aboutbox (описание программы):
unit Unit4;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, jpeg;
type
TAboutBox = class (TForm)
Panel1: TPanel;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox: TAboutBox;
implementation
{$R *.dfm}
end.
б) TOKRightDlg (модуль для задания директории с mp3-файлами):
unit Unit1;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, ComCtrls, ShellCtrls, Grids, Outline, DirOutln;
type
TOKRightDlg = class (TForm)
DirectoryOutline1: TDirectoryOutline;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Memo1KeyPress (Sender: TObject; var Key: Char);
procedure Button1Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
OKRightDlg: TOKRightDlg;
implementation
{$R *.dfm}
procedure TOKRightDlg. Memo1KeyPress (Sender: TObject; var Key: Char);
begin
DirectoryOutline1.drive := Key;
end;
procedure TOKRightDlg. Button1Click (Sender: TObject);
begin
OKRightDlg.close;
end;
end.
в) AboutBox1 (заставка):
unit Unit5;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, jpeg;
type
TAboutBox1 = class (TForm)
Panel1: TPanel;
OKButton: TButton;
Timer1: TTimer;
Image1: TImage;
Label1: TLabel;
procedure Timer1Timer (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox1: TAboutBox1;
implementation
uses Unit4;
{$R *.dfm}
procedure TAboutBox1. Timer1Timer (Sender: TObject);
begin
Close;
end;
end.
6. Блок-схемы
1) Загрузка mp3:
Begin
statusbar1.SimpleText:= 'Загружаем mp3-файлы…';
OKRightDlg.Button1.Font.Color:=clWindowText;
OKRightDlg.ShowModal;
nomer := 1;
while tabl. Cells
[0,nomer]<>'' do
tabl.cells[0,nomer]: = '';
tabl.cells[1,nomer]: = '';
tabl.cells[2,nomer]: = '';
tabl.cells[3,nomer]: = '';
tabl.cells[4,nomer]: = '';
tabl.cells[5,nomer]: = '';
tabl.cells[6,nomer]: = '';
nomer := nomer + 1;
tabl.RowCount := 2;
OKRightDlg.Button1.Font.
Color = clScrollBar
findfiles (OKRightDlg.DirectoryOutline1. statusbar1. SimpleText:= 'Загрузка directory, mp3-файлов была отменена!';
'*.mp3', tabl, true);
(OKRightDlg.Edit1.Text <> '" ')
and (length (OKRightDlg.
Edit1.Text) = 1)
statusbar1.SimpleText:='Выбран неправильный разделитель! Пожалуйста, выберите другой.';
sd1.execute
write_db (sd1.filename, tabl, OKRightDlg. Edit1.Text);
statusbar1.SimpleText:= 'Были загруженны mp3-файлы из директории'+OKRightDlg.DirectoryOutline1.directory+'.';
end.
2) Загрузка csv:
Begin.
statusbar1.SimpleText:=
'Загружаем csv-файл…';
od1.Execute
AssignFile (f, od1. FileName); statusbar1. SimpleText:= {$i-} Reset (f); 'Загрузка csv-файла отменена!';
{$i+} readln (f, file_str);
rasdelitel := find_char (file_str);
closefile (f);
read_db (od1.FileName,
rasdelitel, tabl);
i := 1 to
tabl.RowCount — 1 do
OldMp3Tag.filename := tabl. Cells[1,i];
OldMp3Tag.title := tabl. Cells[2,i];
OldMp3Tag.artist := tabl. Cells[3,i];
OldMp3Tag.album := tabl. Cells[4,i];
OldMp3Tag.year := tabl. Cells[5,i;]
OldMp3Tag.comment := tabl. Cells[6,i];
SetMp3Tag (OldMp3Tag, tabl. Cells[1, i])
end.