/* parse numeric genre from string, version 2.2 and 2.3 */ static int parsegenre( struct mp3entry* entry, char* tag, int bufferpos ) { /* Use bufferpos to hold current position in entry->id3v2buf. */ bufferpos = tag - entry->id3v2buf; if(entry->id3version >= ID3_VER_2_4) { /* In version 2.4 and up, there are no parentheses, and the genre frame is a list of strings, either numbers or text. */ /* Is it a number? */ if(isdigit(tag[0])) { entry->genre_string = id3_get_num_genre(atoi( tag )); return bufferpos; } else { entry->genre_string = tag; return bufferpos + strlen(tag) + 1; } } else { if( tag[0] == '(' && tag[1] != '(' ) { entry->genre_string = id3_get_num_genre(atoi( tag + 1 )); return bufferpos; } else { entry->genre_string = tag; return bufferpos + strlen(tag) + 1; } } }
bool get_asap_metadata(int fd, struct mp3entry* id3) { int filelength = filesize(fd); if(parse_sap_header(fd, id3, filelength) == false) { DEBUGF("parse sap header failed.\n"); return false; } id3->bitrate = 706; id3->frequency = 44100; id3->vbr = false; id3->filesize = filelength; id3->genre_string = id3_get_num_genre(36); return true; }
bool get_spc_metadata(int fd, struct mp3entry* id3) { /* Use the trackname part of the id3 structure as a temporary buffer */ unsigned char * buf = (unsigned char *)id3->path; char * p; unsigned long length; unsigned long fade; bool isbinary = true; int i; /* try to get the ID666 tag */ if ((lseek(fd, 0x2e, SEEK_SET) < 0) || (read(fd, buf, 0xD2) < 0xD2)) { DEBUGF("lseek or read failed\n"); return false; } p = id3->id3v2buf; id3->title = p; buf[31] = 0; p = iso_decode(buf, p, 0, 32); buf += 32; id3->album = p; buf[31] = 0; p = iso_decode(buf, p, 0, 32); buf += 48; id3->comment = p; buf[31] = 0; p = iso_decode(buf, p, 0, 32); buf += 32; /* Date check */ if(buf[2] == '/' && buf[5] == '/') isbinary = false; /* Reserved bytes check */ if(buf[0xD2 - 0x2E - 112] >= '0' && buf[0xD2 - 0x2E - 112] <= '9' && buf[0xD3 - 0x2E - 112] == 0x00) isbinary = false; /* is length & fade only digits? */ for (i=0;i<8 && ( (buf[0xA9 - 0x2E - 112+i]>='0'&&buf[0xA9 - 0x2E - 112+i]<='9') || buf[0xA9 - 0x2E - 112+i]=='\0'); i++); if (i==8) isbinary = false; if(isbinary) { id3->year = buf[0] | (buf[1]<<8); buf += 11; length = (buf[0] | (buf[1]<<8) | (buf[2]<<16)) * 1000; buf += 3; fade = (buf[0] | (buf[1]<<8) | (buf[2]<<16) | (buf[3]<<24)); buf += 4; } else { char tbuf[6]; buf += 6; buf[4] = 0; id3->year = atoi(buf); buf += 5; memcpy(tbuf, buf, 3); tbuf[3] = 0; length = atoi(tbuf) * 1000; buf += 3; memcpy(tbuf, buf, 5); tbuf[5] = 0; fade = atoi(tbuf); buf += 5; } id3->artist = p; buf[31] = 0; iso_decode(buf, p, 0, 32); if (length==0) { length=3*60*1000; /* 3 minutes */ fade=5*1000; /* 5 seconds */ } id3->length = length+fade; id3->filesize = filesize(fd); id3->genre_string = id3_get_num_genre(36); return true; }