Помощь в написании студенческих работ
Антистрессовый сервис

Программа для работы с тегами файлов. 
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.

Показать весь текст
Заполнить форму текущей работой