Blame doc/examples/id3dump.c

Packit c32a2d
/*
Packit c32a2d
	id3dump: Print ID3 tags of files, scanned using libmpg123.
Packit c32a2d
Packit c32a2d
	copyright 2007 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Thomas Orgis
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mpg123.h"
Packit c32a2d
#include <string.h>
Packit c32a2d
#include "stdio.h"
Packit c32a2d
#include "sys/types.h"
Packit c32a2d
Packit c32a2d
/* Helper for v1 printing, get these strings their zero byte. */
Packit c32a2d
void safe_print(char* name, char *data, size_t size)
Packit c32a2d
{
Packit c32a2d
	char safe[31];
Packit c32a2d
	if(size>30) return;
Packit c32a2d
Packit c32a2d
	memcpy(safe, data, size);
Packit c32a2d
	safe[size] = 0;
Packit c32a2d
	printf("%s: %s\n", name, safe);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Print out ID3v1 info. */
Packit c32a2d
void print_v1(mpg123_id3v1 *v1)
Packit c32a2d
{
Packit c32a2d
	safe_print("Title",   v1->title,   sizeof(v1->title));
Packit c32a2d
	safe_print("Artist",  v1->artist,  sizeof(v1->artist));
Packit c32a2d
	safe_print("Album",   v1->album,   sizeof(v1->album));
Packit c32a2d
	safe_print("Year",    v1->year,    sizeof(v1->year));
Packit c32a2d
	safe_print("Comment", v1->comment, sizeof(v1->comment));
Packit c32a2d
	printf("Genre: %i", v1->genre);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Split up a number of lines separated by \n, \r, both or just zero byte
Packit c32a2d
   and print out each line with specified prefix. */
Packit c32a2d
void print_lines(const char* prefix, mpg123_string *inlines)
Packit c32a2d
{
Packit c32a2d
	size_t i;
Packit c32a2d
	int hadcr = 0, hadlf = 0;
Packit c32a2d
	char *lines = NULL;
Packit c32a2d
	char *line  = NULL;
Packit c32a2d
	size_t len = 0;
Packit c32a2d
Packit c32a2d
	if(inlines != NULL && inlines->fill)
Packit c32a2d
	{
Packit c32a2d
		lines = inlines->p;
Packit c32a2d
		len   = inlines->fill;
Packit c32a2d
	}
Packit c32a2d
	else return;
Packit c32a2d
Packit c32a2d
	line = lines;
Packit c32a2d
	for(i=0; i
Packit c32a2d
	{
Packit c32a2d
		if(lines[i] == '\n' || lines[i] == '\r' || lines[i] == 0)
Packit c32a2d
		{
Packit c32a2d
			char save = lines[i]; /* saving, changing, restoring a byte in the data */
Packit c32a2d
			if(save == '\n') ++hadlf;
Packit c32a2d
			if(save == '\r') ++hadcr;
Packit c32a2d
			if((hadcr || hadlf) && hadlf % 2 == 0 && hadcr % 2 == 0) line = "";
Packit c32a2d
Packit c32a2d
			if(line)
Packit c32a2d
			{
Packit c32a2d
				lines[i] = 0;
Packit c32a2d
				printf("%s%s\n", prefix, line);
Packit c32a2d
				line = NULL;
Packit c32a2d
				lines[i] = save;
Packit c32a2d
			}
Packit c32a2d
		}
Packit c32a2d
		else
Packit c32a2d
		{
Packit c32a2d
			hadlf = hadcr = 0;
Packit c32a2d
			if(line == NULL) line = lines+i;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Print out the named ID3v2  fields. */
Packit c32a2d
void print_v2(mpg123_id3v2 *v2)
Packit c32a2d
{
Packit c32a2d
	print_lines("Title: ",   v2->title);
Packit c32a2d
	print_lines("Artist: ",  v2->artist);
Packit c32a2d
	print_lines("Album: ",   v2->album);
Packit c32a2d
	print_lines("Year: ",    v2->year);
Packit c32a2d
	print_lines("Comment: ", v2->comment);
Packit c32a2d
	print_lines("Genre: ",   v2->genre);
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
/* Print out all stored ID3v2 fields with their 4-character IDs. */
Packit c32a2d
void print_raw_v2(mpg123_id3v2 *v2)
Packit c32a2d
{
Packit c32a2d
	size_t i;
Packit c32a2d
	for(i=0; i<v2->texts; ++i)
Packit c32a2d
	{
Packit c32a2d
		char id[5];
Packit c32a2d
		char lang[4];
Packit c32a2d
		memcpy(id, v2->text[i].id, 4);
Packit c32a2d
		id[4] = 0;
Packit c32a2d
		memcpy(lang, v2->text[i].lang, 3);
Packit c32a2d
		lang[3] = 0;
Packit c32a2d
		if(v2->text[i].description.fill)
Packit c32a2d
		printf("%s language(%s) description(%s)\n", id, lang, v2->text[i].description.p);
Packit c32a2d
		else printf("%s language(%s)\n", id, lang);
Packit c32a2d
Packit c32a2d
		print_lines(" ", &v2->text[i].text);
Packit c32a2d
	}
Packit c32a2d
	for(i=0; i<v2->extras; ++i)
Packit c32a2d
	{
Packit c32a2d
		char id[5];
Packit c32a2d
		memcpy(id, v2->extra[i].id, 4);
Packit c32a2d
		id[4] = 0;
Packit c32a2d
		printf( "%s description(%s)\n",
Packit c32a2d
		        id,
Packit c32a2d
		        v2->extra[i].description.fill ? v2->extra[i].description.p : "" );
Packit c32a2d
		print_lines(" ", &v2->extra[i].text);
Packit c32a2d
	}
Packit c32a2d
	for(i=0; i<v2->comments; ++i)
Packit c32a2d
	{
Packit c32a2d
		char id[5];
Packit c32a2d
		char lang[4];
Packit c32a2d
		memcpy(id, v2->comment_list[i].id, 4);
Packit c32a2d
		id[4] = 0;
Packit c32a2d
		memcpy(lang, v2->comment_list[i].lang, 3);
Packit c32a2d
		lang[3] = 0;
Packit c32a2d
		printf( "%s description(%s) language(%s): \n",
Packit c32a2d
		        id,
Packit c32a2d
		        v2->comment_list[i].description.fill ? v2->comment_list[i].description.p : "",
Packit c32a2d
		        lang );
Packit c32a2d
		print_lines(" ", &v2->comment_list[i].text);
Packit c32a2d
	}
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int main(int argc, char **argv)
Packit c32a2d
{
Packit c32a2d
	int i;
Packit c32a2d
	mpg123_handle* m;
Packit c32a2d
	if(argc < 2)
Packit c32a2d
	{
Packit c32a2d
		fprintf(stderr, "\nI will print some ID3 tag fields of MPEG audio files.\n");
Packit c32a2d
		fprintf(stderr, "\nUsage: %s <mpeg audio file list>\n\n", argv[0]);
Packit c32a2d
		return -1;
Packit c32a2d
	}
Packit c32a2d
	mpg123_init();
Packit c32a2d
	m = mpg123_new(NULL, NULL);
Packit c32a2d
Packit c32a2d
	for(i=1; i < argc; ++i)
Packit c32a2d
	{
Packit c32a2d
		mpg123_id3v1 *v1;
Packit c32a2d
		mpg123_id3v2 *v2;
Packit c32a2d
		int meta;
Packit c32a2d
		if(mpg123_open(m, argv[i]) != MPG123_OK)
Packit c32a2d
		{
Packit c32a2d
			fprintf(stderr, "Cannot open %s: %s\n", argv[i], mpg123_strerror(m));
Packit c32a2d
			continue;
Packit c32a2d
		}
Packit c32a2d
		mpg123_scan(m);
Packit c32a2d
		meta = mpg123_meta_check(m);
Packit c32a2d
		if(meta & MPG123_ID3 && mpg123_id3(m, &v1, &v2) == MPG123_OK)
Packit c32a2d
		{
Packit c32a2d
			printf("Tag data on %s:\n", argv[i]);
Packit c32a2d
			printf("\n====      ID3v1       ====\n");
Packit c32a2d
			if(v1 != NULL) print_v1(v1);
Packit c32a2d
Packit c32a2d
			printf("\n====      ID3v2       ====\n");
Packit c32a2d
			if(v2 != NULL) print_v2(v2);
Packit c32a2d
Packit c32a2d
			printf("\n==== ID3v2 Raw frames ====\n");
Packit c32a2d
			if(v2 != NULL) print_raw_v2(v2);
Packit c32a2d
		}
Packit c32a2d
		else printf("Nothing found for %s.\n", argv[i]);
Packit c32a2d
Packit c32a2d
		mpg123_close(m);
Packit c32a2d
	}
Packit c32a2d
	mpg123_delete(m);
Packit c32a2d
	mpg123_exit();
Packit c32a2d
	return 0;
Packit c32a2d
}