Программа для работы с тегами файлов .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;
) Memo1: TMemo;
) 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-}(f);
{$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;
{ Private declarations }
{ 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]).
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Курсовая работа (т)
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ