static void handle_id3v2_apic (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *key, gchar *buf, gsize len) { const gchar *enc, *typ, *desc, *data, *mime; gchar hash[33]; enc = binary_to_enc (buf[0]); buf++; len--; mime = buf; typ = find_nul (buf, &len); if (typ[0] != 0x00 && typ[0] != 0x03) { XMMS_DBG ("Picture type %02x not handled", typ[0]); return; } desc = typ + 1; len--; /* XXX desc might be UCS2 and find_nul will not do what we want */ data = find_nul (desc, &len); if (data && xmms_bindata_plugin_add ((const guchar *)data, len, hash)) { const gchar *metakey; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT; xmms_xform_metadata_set_str (xform, metakey, hash); metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_PICTURE_FRONT_MIME; xmms_xform_metadata_set_str (xform, metakey, mime); } }
static void handle_id3v2_txxx (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *_key, gchar *buf, gsize len) { const gchar *enc; gchar *cbuf; const gchar *key, *val; const gchar *metakey; gsize clen; enc = binary_to_enc (buf[0]); cbuf = convert_id3_text (enc, &buf[1], len - 1, &clen); if (!cbuf) return; key = cbuf; val = find_nul (cbuf, &clen); if (!val) { g_free (cbuf); return; } if (g_ascii_strcasecmp (key, "MusicBrainz Album Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "MusicBrainz Artist Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ARTIST_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if ((g_ascii_strcasecmp (key, "MusicBrainz Album Artist Id") == 0) && (g_ascii_strcasecmp (val, MUSICBRAINZ_VA_ID) == 0)) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_COMPILATION; xmms_xform_metadata_set_int (xform, metakey, 1); } else if (g_ascii_strcasecmp (key, "ASIN") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ASIN; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "QuodLibet::albumartist") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "ALBUMARTISTSORT") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST_SORT; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "BARCODE") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_BARCODE; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "CATALOGNUMBER") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_CATALOGNUMBER; xmms_xform_metadata_set_str (xform, metakey, val); } else { XMMS_DBG ("Unhandled tag 'TXXX:%s' = '%s'", key, val); } g_free (cbuf); }
static void handle_id3v2_txxx (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *_key, gchar *buf, gsize len) { const gchar *enc; gchar *cbuf; const gchar *key, *val; const gchar *metakey; gsize clen; enc = binary_to_enc (buf[0]); cbuf = convert_id3_text (enc, &buf[1], len - 1, &clen); if (!cbuf) return; key = cbuf; val = find_nul (cbuf, &clen); if (!val) { g_free (cbuf); return; } if (g_ascii_strcasecmp (key, "MusicBrainz Album Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "MusicBrainz Artist Id") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ARTIST_ID; xmms_xform_metadata_set_str (xform, metakey, val); } else if ((g_ascii_strcasecmp (key, "MusicBrainz Album Artist Id") == 0) && (g_ascii_strcasecmp (val, MUSICBRAINZ_VA_ID) == 0)) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_COMPILATION; xmms_xform_metadata_set_int (xform, metakey, 1); } else if (g_ascii_strcasecmp (key, "ASIN") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ASIN; xmms_xform_metadata_set_str (xform, metakey, val); } else if (g_ascii_strcasecmp (key, "QuodLibet::albumartist") == 0) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST; xmms_xform_metadata_set_str (xform, metakey, val); // ArtistAlbumSort as last resort } else if ((g_ascii_strcasecmp (key, "ALBUMARTISTSORT") == 0)) { const gchar *tmp; metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_ALBUM_ARTIST; if (xmms_xform_metadata_get_str (xform, metakey, &tmp) && !strlen (tmp)) { xmms_xform_metadata_set_str (xform, metakey, val); } } g_free (cbuf); }
static void handle_id3v2_comm (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *key, gchar *buf, gsize len) { /* COMM is weird but it's like this: * $xx enc * $xx xx xx lang * $text $0 desc according to enc * $text $0 comment according to enc */ const gchar *enc, *desc, *comm; gchar *cbuf; gsize clen; enc = binary_to_enc (buf[0]); buf++; len--; /* Language is always three _bytes_ - we currently don't care */ buf += 3; len -= 3; cbuf = convert_id3_text (enc, buf, len, &clen); if (!cbuf) return; desc = cbuf; comm = find_nul (cbuf, &clen); if (comm && comm[0]) { const gchar *metakey; gchar *tmp; if (desc && desc[0]) { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_COMMENT; tmp = g_strdup_printf ("%s_%s", metakey, desc); xmms_xform_metadata_set_str (xform, tmp, comm); g_free (tmp); } else { metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_COMMENT; xmms_xform_metadata_set_str (xform, metakey, comm); } } g_free (cbuf); }
static void handle_id3v2_ufid (xmms_xform_t *xform, xmms_id3v2_header_t *head, const gchar *key, gchar *buf, gsize len) { const gchar *val; val = find_nul (buf, &len); if (!val) return; if (g_ascii_strcasecmp (buf, "http://musicbrainz.org") == 0) { const gchar *metakey; gchar *val0; /* make sure it is NUL terminated */ val0 = g_strndup (val, len); metakey = XMMS_MEDIALIB_ENTRY_PROPERTY_TRACK_ID, xmms_xform_metadata_set_str (xform, metakey, val0); g_free (val0); } }