return 0;
}
+inline static int
+_id3lib_get_string_if_need(const ID3_Frame *frame, struct lms_string_size *s)
+{
+ if (!s->str)
+ _id3lib_get_string(frame, ID3FN_TEXT, s);
+
+ return !!s->str;
+}
+
static int
_id3lib_get_data(const ID3_Tag &tag, struct lms_audio_info *info)
{
+ lms_string_size band = {NULL, 0}, lead_artist = {NULL, 0};
ID3_Tag::ConstIterator *itr;
const ID3_Frame *frame;
int todo;
- todo = 7; /* info fields left to parse: title, artist, album, genre,
- trackno, rating, playcnt */
+ todo = 8; /* info fields left to parse: title, lead artist, band,
+ album, genre, trackno, rating, playcnt */
itr = tag.CreateIterator();
switch (fid) {
case ID3FID_TITLE:
- if (!info->title.str) {
- _id3lib_get_string(frame, ID3FN_TEXT, &info->title);
- if (info->title.str)
+ if (_id3lib_get_string_if_need(frame, &info->title))
todo--;
- }
break;
case ID3FID_LEADARTIST:
- if (!info->artist.str) {
- _id3lib_get_string(frame, ID3FN_TEXT, &info->artist);
- if (info->artist.str)
+ if (_id3lib_get_string_if_need(frame, &lead_artist))
+ todo--;
+ break;
+
+ case ID3FID_BAND:
+ if (_id3lib_get_string_if_need(frame, &band))
todo--;
- }
break;
case ID3FID_ALBUM:
- if (!info->album.str) {
- _id3lib_get_string(frame, ID3FN_TEXT, &info->album);
- if (info->album.str)
+ if (_id3lib_get_string_if_need(frame, &info->album))
todo--;
- }
break;
case ID3FID_CONTENTTYPE:
- if (!info->genre.str) {
- _id3lib_get_string(frame, ID3FN_TEXT, &info->genre);
- if (info->genre.str)
+ if (_id3lib_get_string_if_need(frame, &info->genre))
todo--;
- }
break;
case ID3FID_TRACKNUM:
}
}
+ if (band.str && lead_artist.str) {
+ info->artist = band;
+ free(lead_artist.str);
+ } else if (band.str)
+ info->artist = band;
+ else if (lead_artist.str)
+ info->artist = lead_artist;
+
delete itr;
return 0;
}