Меню
Категории
Работа с ID3TAG v1 на с++
5 декабря, 2007 Программинг

Возжелал я однажды написать программку, которая бы умела редактировать 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;
};

Всё.

"1" Comment
  1. Спасибо за интересную статью

Добавить комментарий




*