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