Пример #1
0
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);
	}
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);

}
Пример #5
0
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);
	}
}