/*
	readtag.c
	(cl) copyleft 2000 Eric Shalov <eric@blacksun.net>
	Portions shamelessly stolen from Christopher Collins's id3tool.
*/

#include <stdio.h>

struct id3tag_t {
        char            magic[3];
        char            songname[30];
        char            artist[30];
        char            album[30];
        char            year[4];
        char            note[30];
        unsigned char   style;
} __attribute__ ((packed));

struct tag_info {
	char songname[30+1];
	char artist[30+1];
	char album[30+1];
	char year[4+1];
	char note[30+1];
	unsigned char style;
};

/* prototypes */
int id3_readtag(FILE *fin, struct tag_info *t);

int wide = 0;

int main(int argc, char *argv[]) {
	FILE *f;
	struct tag_info tag;
	int i;
	
	for(i=1;i<argc;i++) {
		if(strcmp(argv[i],"-w")==0) wide = 1; else
		
		if ( f=fopen(argv[i],"r") ) {
			if( id3_readtag(f,&tag) == 0 ) {
				if(wide) {
					printf("%-40.40s%-19.19s%-20.20s\n",
						tag.songname?tag.songname:"",
						tag.artist?tag.artist:"",
						tag.album?tag.album:"");
				} else {
					if(*tag.songname) printf("Song Name:  %s\n", tag.songname);
					if(*tag.artist)   printf("Artist:     %s\n", tag.artist);
					if(*tag.album)    printf("Album:      %s\n", tag.album);
				}
			} else printf("Unable to read ID3 tag from \"%s\".\n",argv[i]);
			fclose(f);
		}
	}
	
}

int id3_readtag(FILE *fin, struct tag_info *tag) {
	struct id3tag_t id3tag;
        int     n;

        if (!fin || !tag) return 1;

	fseek (fin, 0, SEEK_END);
	fseek (fin, ftell(fin) - 128, SEEK_SET);
	fread (&id3tag, 128, 1, fin);

	if ( strncmp(id3tag.magic, "TAG", 3) ) {
		return 1;
	}

	memset(tag->songname, 0, 30+1); strncpy(tag->songname, id3tag.songname, 30);
	memset(tag->artist,   0, 30+1); strncpy(tag->artist,   id3tag.artist, 30);
	memset(tag->album,    0, 30+1); strncpy(tag->album,    id3tag.album, 30);
	memset(tag->year,     0,  4+1); strncpy(tag->year,     id3tag.year, 4);
	memset(tag->note,     0, 30+1); strncpy(tag->note,     id3tag.note, 30);
	
	
	return 0;
}


