diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | ext/taglib/gstid3v2mux.cc | 28 | ||||
-rw-r--r-- | gst/id3demux/id3v2frames.c | 42 |
4 files changed, 68 insertions, 21 deletions
@@ -1,5 +1,20 @@ 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). diff --git a/configure.ac b/configure.ac index 6ffb1e4b..b6f215ec 100644 --- a/configure.ac +++ b/configure.ac @@ -44,8 +44,8 @@ dnl AS_LIBTOOL_TAGS 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 **** diff --git a/ext/taglib/gstid3v2mux.cc b/ext/taglib/gstid3v2mux.cc index 00a4c3fa..a6dbd2b1 100644 --- a/ext/taglib/gstid3v2mux.cc +++ b/ext/taglib/gstid3v2mux.cc @@ -458,21 +458,34 @@ add_comment_tag (ID3v2::Tag * id3v2tag, const GstTagList * list, 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); } } @@ -520,6 +533,7 @@ static const struct 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, ""}, { diff --git a/gst/id3demux/id3v2frames.c b/gst/id3demux/id3v2frames.c index b2e3353b..4e98a5eb 100644 --- a/gst/id3demux/id3v2frames.c +++ b/gst/id3demux/id3v2frames.c @@ -37,7 +37,7 @@ 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); @@ -156,7 +156,7 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * work) } } 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); @@ -195,17 +195,17 @@ id3demux_id3v2_parse_frame (ID3TagsWorking * 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]; @@ -226,19 +226,37 @@ parse_comment_frame (ID3TagsWorking * work) 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 * |