From d41e7f7cec3b4000ffc41d91ef1a612937a04625 Mon Sep 17 00:00:00 2001 From: Jochen Keil Date: Mon, 30 Mar 2009 21:44:41 +0200 Subject: Build tags from information in cue sheets With these methods a tag struct can be created from the cdtext information in a cue sheet. The methods depend on a cue parsing library. Reading from strings (char*) as well as from a file (FILE*) is supported. --- src/cue/cue_tag.c | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cue/cue_tag.h | 20 ++++ 2 files changed, 296 insertions(+) create mode 100644 src/cue/cue_tag.c create mode 100644 src/cue/cue_tag.h diff --git a/src/cue/cue_tag.c b/src/cue/cue_tag.c new file mode 100644 index 000000000..ce8202a81 --- /dev/null +++ b/src/cue/cue_tag.c @@ -0,0 +1,276 @@ +#include "cue_tag.h" + +static struct tag* +cue_tag_cd(struct Cdtext* cdtext, struct Rem* rem) +{ + char* tmp = NULL; + struct tag* tag = NULL; + + //if (cdtext == NULL) + //return NULL; + + tag = tag_new(); + + tag_begin_add(tag); + + { /* TAG_ITEM_ALBUM_ARTIST */ + if ((tmp = cdtext_get(PTI_PERFORMER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ALBUM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_SONGWRITER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ALBUM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_COMPOSER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ALBUM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_ARRANGER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ALBUM_ARTIST, tmp); + /* TAG_ITEM_ALBUM_ARTIST */ } + + { /* TAG_ITEM_ARTIST */ + if ((tmp = cdtext_get(PTI_PERFORMER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_SONGWRITER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_COMPOSER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_ARRANGER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + /* TAG_ITEM_ARTIST */ } + + /* TAG_ITEM_PERFORMER */ + if ((tmp = cdtext_get(PTI_PERFORMER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_PERFORMER, tmp); + + /* TAG_ITEM_COMPOSER */ + if ((tmp = cdtext_get(PTI_COMPOSER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_COMPOSER, tmp); + + /* TAG_ITEM_ALBUM */ + if ((tmp = cdtext_get(PTI_TITLE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ALBUM, tmp); + + /* TAG_ITEM_GENRE */ + if ((tmp = cdtext_get(PTI_GENRE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_GENRE, tmp); + + /* TAG_ITEM_DATE */ + if ((tmp = rem_get(REM_DATE, rem)) != NULL) + tag_add_item(tag, TAG_ITEM_DATE, tmp); + + /* TAG_ITEM_COMMENT */ + if ((tmp = cdtext_get(PTI_MESSAGE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_COMMENT, tmp); + + /* TAG_ITEM_DISC */ + if ((tmp = cdtext_get(PTI_DISC_ID, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_DISC, tmp); + + /* stream name, usually empty + * tag_add_item(tag, TAG_ITEM_NAME,); + */ + + /* REM MUSICBRAINZ entry? + tag_add_item(tag, TAG_MUSICBRAINZ_ARTISTID,); + tag_add_item(tag, TAG_MUSICBRAINZ_ALBUMID,); + tag_add_item(tag, TAG_MUSICBRAINZ_ALBUMARTISTID,); + tag_add_item(tag, TAG_MUSICBRAINZ_TRACKID,); + */ + + tag_end_add(tag); + + if (tag != NULL) + { + if (tag_is_empty(tag)) + { + tag_free(tag); + return NULL; + } + else + return tag; + } + else + return NULL; +} + +static struct tag* +cue_tag_track(struct Cdtext* cdtext, struct Rem* rem) +{ + char* tmp = NULL; + struct tag* tag = NULL; + + //if (cdtext == NULL) + //return NULL; + + tag = tag_new(); + + tag_begin_add(tag); + + { /* TAG_ITEM_ARTIST */ + if ((tmp = cdtext_get(PTI_PERFORMER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_SONGWRITER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_COMPOSER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + + else if ((tmp = cdtext_get(PTI_ARRANGER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_ARTIST, tmp); + /* TAG_ITEM_ARTIST */ } + + /* TAG_ITEM_TITLE */ + if ((tmp = cdtext_get(PTI_TITLE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_TITLE, tmp); + + /* TAG_ITEM_GENRE */ + if ((tmp = cdtext_get(PTI_GENRE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_GENRE, tmp); + + /* TAG_ITEM_DATE */ + if ((tmp = rem_get(REM_DATE, rem)) != NULL) + tag_add_item(tag, TAG_ITEM_DATE, tmp); + + /* TAG_ITEM_COMPOSER */ + if ((tmp = cdtext_get(PTI_COMPOSER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_COMPOSER, tmp); + + /* TAG_ITEM_PERFORMER */ + if ((tmp = cdtext_get(PTI_PERFORMER, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_PERFORMER, tmp); + + /* TAG_ITEM_COMMENT */ + if ((tmp = cdtext_get(PTI_MESSAGE, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_COMMENT, tmp); + + /* TAG_ITEM_DISC */ + if ((tmp = cdtext_get(PTI_DISC_ID, cdtext)) != NULL) + tag_add_item(tag, TAG_ITEM_DISC, tmp); + + tag_end_add(tag); + + if (tag != NULL) + { + if (tag_is_empty(tag)) + { + tag_free(tag); + return NULL; + } + else + return tag; + } + else + return NULL; +} + +struct tag* +cue_tag_file( FILE* fp, + const unsigned int tnum) +{ + struct tag* cd_tag = NULL; + struct tag* track_tag = NULL; + struct tag* merge_tag = NULL; + struct Cd* cd = NULL; + + if (tnum > 256) + return NULL; + + if (fp == NULL) + return NULL; + else + cd = cue_parse_file(fp); + + if (cd == NULL) + return NULL; + else + { + /* tag from CDtext info */ + cd_tag = cue_tag_cd( cd_get_cdtext(cd), + cd_get_rem(cd)); + + /* tag from TRACKtext info */ + track_tag = cue_tag_track( track_get_cdtext( cd_get_track(cd, tnum)), + track_get_rem( cd_get_track(cd, tnum))); + + cd_delete(cd); + } + + if ((cd_tag != NULL) && (track_tag != NULL)) + { + merge_tag = tag_merge(cd_tag, track_tag); + tag_free(cd_tag); + tag_free(track_tag); + return merge_tag; + } + + else if (cd_tag != NULL) + { + return cd_tag; + } + + else if (track_tag != NULL) + { + return track_tag; + } + + else + return NULL; +} + +struct tag* +cue_tag_string( char* str, + const unsigned int tnum) +{ + struct tag* cd_tag = NULL; + struct tag* track_tag = NULL; + struct tag* merge_tag = NULL; + struct Cd* cd = NULL; + + if (tnum > 256) + return NULL; + + if (str == NULL) + return NULL; + else + cd = cue_parse_string(str); + + if (cd == NULL) + return NULL; + else + { + /* tag from CDtext info */ + cd_tag = cue_tag_cd( cd_get_cdtext(cd), + cd_get_rem(cd)); + + /* tag from TRACKtext info */ + track_tag = cue_tag_track( track_get_cdtext( cd_get_track(cd, tnum)), + track_get_rem( cd_get_track(cd, tnum))); + + cd_delete(cd); + } + + if ((cd_tag != NULL) && (track_tag != NULL)) + { + merge_tag = tag_merge(cd_tag, track_tag); + tag_free(cd_tag); + tag_free(track_tag); + return merge_tag; + } + + else if (cd_tag != NULL) + { + return cd_tag; + } + + else if (track_tag != NULL) + { + return track_tag; + } + + else + return NULL; +} diff --git a/src/cue/cue_tag.h b/src/cue/cue_tag.h new file mode 100644 index 000000000..adc4c466e --- /dev/null +++ b/src/cue/cue_tag.h @@ -0,0 +1,20 @@ +#ifndef MPD_CUE_TAG_H +#define MPD_CUE_TAG_H + +#include "config.h" + +#ifdef HAVE_CUE /* libcue */ + +#include +#include "../tag.h" + +struct tag* +cue_tag_file( FILE*, + const unsigned int); + +struct tag* +cue_tag_string( char*, + const unsigned int); + +#endif /* libcue */ +#endif -- cgit v1.2.3