diff options
author | Jochen Keil <jochen.keil@gmail.com> | 2009-03-30 21:44:41 +0200 |
---|---|---|
committer | Jochen Keil <jochen.keil@gmail.com> | 2009-03-31 22:17:56 +0200 |
commit | d41e7f7cec3b4000ffc41d91ef1a612937a04625 (patch) | |
tree | d2de47b94cf42750425daf9118f053cced3b0a53 | |
parent | 62a72a5e4d17b802aacda9fd3e5b86492c816804 (diff) | |
download | mpd-d41e7f7cec3b4000ffc41d91ef1a612937a04625.tar.gz mpd-d41e7f7cec3b4000ffc41d91ef1a612937a04625.tar.xz mpd-d41e7f7cec3b4000ffc41d91ef1a612937a04625.zip |
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.
-rw-r--r-- | src/cue/cue_tag.c | 276 | ||||
-rw-r--r-- | src/cue/cue_tag.h | 20 |
2 files changed, 296 insertions, 0 deletions
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 <libcue/libcue.h> +#include "../tag.h" + +struct tag* +cue_tag_file( FILE*, + const unsigned int); + +struct tag* +cue_tag_string( char*, + const unsigned int); + +#endif /* libcue */ +#endif |