Познавательный блог  

Поиск по сайту

Гугль

Архивы

Работа с ID3TAG v1 на с++

Возжелал я однажды написать программку, которая бы умела редактировать ID3 теги моих mp3 песен. Вот и нарыл в сети документацию по этим гарным тегам. В любом mp3 файле последние 128 байт это и есть тег. Вот его структура:

struct ID3TAG
{
char head[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[29];
char track;
char genre[1];
};


Это очень просто пишется на с++. По крайне мере я на 1 курсе достаточно быстро сообразил что к чему.

#include <windows.h>
#include <iostream.h>
#include <conio.h>

struct ID3TAG
{
char head[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[29];
char track;
char genre[1];
};

ID3TAG GetTag(char *filename)
{
FILE *in;
int i;
ID3TAG tag;
if((in=fopen(filename,"rb"))==NULL) cout << "File " << filename << " Not found" << endl
if(fseek(in, -128L, SEEK_END))
{
fclose(in);
cout << "Error: Can't seek ID3TAG label\n" << endl;
}
if(!fread((char *)&tag,sizeof(tag),1,in))
{
fclose(in);
cout << "Error: Can't Read ID3TAG header\n" << endl;
}
if( (strncmp("TAG",tag.head,3))!=NULL) cout << "Error: Incorect Tag header or not Mp3 file\n" << endl;

fclose(in);
return tag;
}

main(int argc, char* argv[])
{
ID3TAG tag1;

tag1 = GetTag("C:\\1.mp3");

cout<<"Head - "<<tag1.head<<endl;
cout<<"Title - "<<tag1.title<<endl;
cout<<"Artist - "<<tag1.artist<<endl;
cout<<"Album - "<<tag1.album<<endl;
cout<<"Year - "<<tag1.year<<endl;
cout<<"Comment - "<<tag1.comment<<endl;
cout<<"Track - "<<tag1.track<<endl;
cout<<"Genre - "<<tag1.genre<<endl;
getchar();
return 0;
};

Это добро достаточно скомпилировать в консоли, скормить ему mp3 файл. И Получите содержимое тегов. Запись и редактирование производится аналогичным методом.

Эх, школьные годы :)

Кстати, кусок кода ниже переименует все файлы в текущей директории по их ID3 артисту и названию песни.

#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <dir.h>

struct ID3TAG
{
char head[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[29];
char track;
char genre[1];
};

ID3TAG GetTag(char *filename)
{
clrscr();
FILE *in;
int i;
ID3TAG tag;

if((in=fopen(filename,"rb"))==NULL)
{
cout << "File Not found" << endl;
exit;
}
if(fseek(in, -128L, SEEK_END))
{
fclose(in);
cout << "Error: Can't seek ID3TAG label\n" << endl;
}
if(!fread((char *)&tag,sizeof(tag),1,in))
{
fclose(in);
cout << "Error: Can't Read ID3TAG header\n" << endl;
}
if( (strncmp("TAG",tag.head,3))!=NULL)
cout << "Error: Incorect Tag header or not Mp3 file\n" << endl;
fclose(in);

return tag;
}

main(int argc, char* argv[])
{
ID3TAG tag1;
struct ffblk ffblk;
int done;
char name[100];
mkdir("Ready");
done = findfirst("*.mp3",&ffblk,0);
tag1 = GetTag(ffblk.ff_name);

strcat(name,"c:\\TMP\\");
strcat(name,tag1.artist);
strcat(name," - ");
strcat(name,tag1.title);
strcat(name,".mp3");
MoveFile(ffblk.ff_name,name);

while (!done)
{
char name1[100];
tag1 = GetTag(ffblk.ff_name);
strcat(name1,"c:\\TMP\\");
strcat(name1,tag1.artist);
strcat(name1," - ");
strcat(name1,tag1.title);
strcat(name1,".mp3");
done = findnext(&ffblk);
MoveFile(ffblk.ff_name,name1);
delete name1;
}
cout<<tag1.head<<" - "<<tag1.title<<".mp3"<<endl;
getchar();
return 0;
};

Всё.

Комментарии

Комментарий от Lilya [ Ноябрь 4, 2008, 14:26 ]

Спасибо за интересную статью

Написать комментарий








Страницы

Свежие записи

Гугль

Мета

Счетчики


Rambler's Top100

Рубрики

  Разработка и дизайн — StvPromo.ru