/* MPEG-Audio ID3 Reporter Spiros Ioannou 1997*/ #include #include #include #include typedef struct { char songname[31]; char artist [31]; char album [31]; char year [5]; char comment [31]; char type; }ID3; static removespace(char *str,int max) { int i; str[max]=0; for(i=max-1;i>=0;i--) if(((unsigned char)str[i])<26 || str[i]==' ')str[i]=0; else break; } static fillspace(char *str,int max) { int i; for(i=0;isongname, data->artist, data->album, data->year, data->comment, data->type); } else { p=q=r=0; m=0; printf("guessing from filename...\n\n"); sl=strrchr(fn,'/'); if (sl) sl++; else sl=fn; strcpy(buff,sl); p=strtok(sl,"-"); /*Artist*/ while(p && *p==' '){p++;m++;} if (t=strstr(p,".mp3")) {*t=0;m+=4;}; if (p) { q=strtok(0,"-"); /*Songname*/ while(q && *q==' '){q++;m++;} if (q) { if (t=strstr(q,".mp3")) {*t=0;m+=4;} r=buff+strlen(q)+strlen(p)+m+1; /*the rest*/ while(r && *r && !isalnum(*r))r++; if (t=strstr(r,".mp3")) *t=0; } } /*Cut off the trailling spaces*/ i=j=k=0; if (p) for (i=strlen(p)-1;i>=0 && p[i]==' ';i--) p[i]=0; if (q) for (j=strlen(q)-1;j>=0 && q[j]==' ';j--) q[j]=0; else q=""; if (r) for (k=strlen(r)-1;k>=0 && r[k]==' ';i--) r[k]=0; else r=""; printf("\tArtist:%s\n\tSong:%s\n\tOther:%s\n\n",p,q,r); } } static readID3(FILE *fp,ID3 *data) { fread(data->songname,30,1,fp);removespace(data->songname,30); fread(data->artist ,30,1,fp);removespace(data->artist ,30); fread(data->album ,30,1,fp);removespace(data->album ,30); fread(data->year , 4,1,fp);removespace(data->year , 4); fread(data->comment ,30,1,fp);removespace(data->comment ,30); fread(&(data->type) , 1,1,fp); } parseID3(char *filename) { FILE *fp; int offset,c,flag=0; ID3 data; bzero(&data,sizeof(ID3)); if (!(fp=fopen(filename,"r"))) { perror(filename); return -1; } fseek(fp,-128,SEEK_END); offset=flag=0; if(getc(fp)==0x54) /*T*/ if(getc(fp)==0x41) /*A*/ if(getc(fp)==0x47) /*G*/ { offset=ftell(fp)-3; readID3(fp,&data); flag=1; } if(!flag) { fseek(fp,-125,SEEK_END); offset=flag=0; if(getc(fp)==0x54) if(getc(fp)==0x41) if(getc(fp)==0x47) { offset=ftell(fp)-3; readID3(fp,&data); flag=1; } } printID3(filename,&data,flag); fclose(fp); } int main(int argc,char *argv[]) { int i; if(argc<2) { printf("MP3 ID3Reporter\nUses filename guessing if ID3 Tag doesn't exist\n" "\r\tUsage: id3rep ...\n\n"); return 0; } for(i=1;i