Get both lead artist and band, use in order: band, artist
[lms] / lightmediascanner / src / plugins / id3lib / id3lib.cpp
index fb2fc03..d71bd1d 100644 (file)
@@ -92,15 +92,25 @@ _id3lib_get_string_as_int(const ID3_Frame *frame, ID3_FieldID field_id)
   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();
 
@@ -111,35 +121,28 @@ _id3lib_get_data(const ID3_Tag &tag, struct lms_audio_info *info)
 
     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:
@@ -168,6 +171,14 @@ _id3lib_get_data(const ID3_Tag &tag, struct lms_audio_info *info)
     }
   }
 
+  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;
 }