2006-08-16 Tim-Philipp Müller <tim at centricular dot net>
+ * configure.ac:
+ Require CVS of GStreamer core and -base (for
+ GST_TAG_EXTENDED_COMMENT and gst_tag_parse_extended_comment()).
+
+ * ext/taglib/gstid3v2mux.cc:
+ Write extended comment tags properly (#348762).
+
+ * gst/id3demux/id3v2frames.c: (id3demux_id3v2_parse_frame),
+ (parse_comment_frame):
+ Extract COMM frames into extended comments, which makes it
+ easier to properly retain the description bit of the tag
+ and maintain this information when re-tagging (#348762).
+
+2006-08-16 Tim-Philipp Müller <tim at centricular dot net>
+
* tests/check/Makefile.am:
Don't try to run annodex unit tests if the annodex
plugin has not been built (Fixes #351116).
AM_PROG_LIBTOOL
dnl *** required versions of GStreamer stuff ***
-GST_REQ=0.10.8
-GSTPB_REQ=0.10.5.1
+GST_REQ=0.10.9.1
+GSTPB_REQ=0.10.9.1
dnl *** autotools stuff ****
if (gst_tag_list_get_string_index (list, tag, n, &s) && s != NULL) {
ID3v2::CommentsFrame * f;
- gchar *desc;
+ gchar *desc = NULL, *val = NULL, *lang = NULL;
- GST_LOG ("%s[%u] = '%s'", tag, n, s);
f = new ID3v2::CommentsFrame (String::UTF8);
- /* FIXME: we should somehow try to preserve the original descriptions */
- desc = g_strdup_printf ("c%u", n);
+ if (strcmp (tag, GST_TAG_COMMENT) == 0 ||
+ !gst_tag_parse_extended_comment (s, &desc, &lang, &val, TRUE)) {
+ /* create dummy description to allow for multiple comment frames
+ * (taglib will drop comment frames if descriptions are not unique) */
+ desc = g_strdup_printf ("c%u", n);
+ val = g_strdup (s);
+ }
+
+ GST_LOG ("%s[%u] = '%s' (%s|%s|%s)", tag, n, s, GST_STR_NULL (desc),
+ GST_STR_NULL (lang), GST_STR_NULL (val));
+
f->setDescription (desc);
- g_free (desc);
+ f->setText (val);
+ if (lang) {
+ f->setLanguage (lang);
+ }
- f->setText (s);
- g_free (s);
+ g_free (lang);
+ g_free (desc);
+ g_free (val);
id3v2tag->addFrame (f);
}
+ g_free (s);
}
}
GST_TAG_COPYRIGHT, add_text_tag, "TCOP"}, {
GST_TAG_GENRE, add_text_tag, "TCON"}, {
GST_TAG_COMMENT, add_comment_tag, ""}, {
+ GST_TAG_EXTENDED_COMMENT, add_comment_tag, ""}, {
GST_TAG_DATE, add_date_tag, ""}, {
GST_TAG_IMAGE, add_image_tag, ""}, {
GST_TAG_PREVIEW_IMAGE, add_image_tag, ""}, {
GST_DEBUG_CATEGORY_EXTERN (id3demux_debug);
#define GST_CAT_DEFAULT (id3demux_debug)
-static gchar *parse_comment_frame (ID3TagsWorking * work);
+static gboolean parse_comment_frame (ID3TagsWorking * work);
static GArray *parse_text_identification_frame (ID3TagsWorking * work);
static gchar *parse_user_text_identification_frame (ID3TagsWorking * work,
const gchar ** tag_name);
}
} else if (!strcmp (work->frame_id, "COMM")) {
/* Comment */
- tag_str = parse_comment_frame (work);
+ result = parse_comment_frame (work);
} else if (!strcmp (work->frame_id, "APIC")) {
/* Attached picture */
result = parse_picture_frame (work);
return result;
}
-static gchar *
+static gboolean
parse_comment_frame (ID3TagsWorking * work)
{
+ guint dummy;
guint8 encoding;
gchar language[4];
GArray *fields = NULL;
- gchar *out_str = NULL;
gchar *description, *text;
if (work->parse_size < 6)
- return NULL;
+ return FALSE;
encoding = work->parse_data[0];
language[0] = work->parse_data[1];
if (!g_utf8_validate (text, -1, NULL)) {
GST_WARNING ("Converted string is not valid utf-8");
goto fail;
- } else {
- if (strlen (description) > 0 && g_utf8_validate (description, -1, NULL)) {
- out_str = g_strdup_printf ("Description: %s\nComment: %s",
- description, text);
+ }
+
+ /* skip our own dummy descriptions (from id3v2mux) */
+ if (strlen (description) > 0 && g_utf8_validate (description, -1, NULL) &&
+ sscanf (description, "c%u", &dummy) != 1) {
+ gchar *s;
+
+ if (language[0] != '\0') {
+ s = g_strdup_printf ("%s[%s]=%s", description, language, text);
} else {
- out_str = g_strdup (text);
+ s = g_strdup_printf ("%s=%s", description, text);
}
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_EXTENDED_COMMENT, s, NULL);
+ g_free (s);
+ } else if (text != NULL && *text != '\0') {
+ gst_tag_list_add (work->tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_COMMENT, text, NULL);
+ } else {
+ goto fail;
}
-fail:
free_tag_strings (fields);
+ return TRUE;
- return out_str;
+fail:
+ {
+ GST_WARNING ("failed to parse COMM frame");
+ free_tag_strings (fields);
+ return FALSE;
+ }
}
static GArray *