I would like to read mp3 tags from mp3 file :D and save it to txt file. But my code doesnt work :( I mean I have some problems with setting the proper position in my mp3 file, take a look: (why doesnt it want to work?). I have to do it by myself, with no extra libs.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int getFileSize(const char *filename)
{
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
int main(int argc, char **argv)
{
char *infile = "in.mp3", *outfile = "out.txt";
int infd, bytes_read = 0, buffsize = 255;
char buffer[255];
infd = open(infile, O_RDONLY);
if (infd == -1)
return -1;
int outfd = open(outfile, O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if (outfd == -1)
return -1;
if(lseek(infd, -128, SEEK_END) < 0)
return -1;
for(;;)
{
bytes_read = read(infd, buffer, buffsize);
if (bytes_read > 0)
{
write(outfd, buffer, bytes_read);
}
else
{
if (bytes_read == 0)
{
if (close(infd) < 0)
return -1;
break;
}
else if (bytes_read == -1)
{
break;
return -1;
}
}
}
return 0;
}
One approach to solve this problem:
You'll need to scan through the file depending on the Version of ID3 you're using (question has no specific version specified as noted by Steven), find either the whole tag or the tag header and decode from there.
For ID3v2 the header sequence is 10 Bytes and as follows (from the ID3v2 spec):
ID3v2/file identifier "ID3"
ID3v2 version $04 00
ID3v2 flags %abcd0000
ID3v2 size 4 * %0xxxxxxx
My suggestion is, take a look at the spec of ID3v2 here. Check Chapter 3.1 since part of the work is doing the background research.
For ID3v1 check that overview spec here. Decoding that information is quite easy and works exactly as noted in the comments to your question. Looking at your code this is probably what you want to do (jumping to 128 bytes at the end of the file and starting to read from there).
Make sure you have a properly tagged file and are sure about the tag version you're using before throwing your decoder at it.