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.
This commit is contained in:
parent
62a72a5e4d
commit
d41e7f7cec
276
src/cue/cue_tag.c
Normal file
276
src/cue/cue_tag.c
Normal file
@ -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;
|
||||
}
|
20
src/cue/cue_tag.h
Normal file
20
src/cue/cue_tag.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user