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