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