From: <tp...@ke...> - 2007-10-11 17:55:42
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: tpm Date: Thu Oct 11 2007 17:55:43 UTC Log message: Based on patch by: Jason Kivlighn <jkivlighn gmail com> * gst/id3demux/id3v2frames.c: Extract license/copyright URIs from ID3v2 WCOP frames (Fixes #447000). * tests/check/elements/id3demux.c: * tests/files/Makefile.am: * tests/files/id3-447000-wcop.tag: Add simple unit test. Modified files: . : ChangeLog gst/id3demux : id3v2frames.c tests/check/elements: id3demux.c tests/files : Makefile.am Added files: tests/files : id3-447000-wcop.tag Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3137&r2=1.3138 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/id3demux/id3v2frames.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/tests/check/elements/id3demux.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/tests/files/Makefile.am.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/tests/files/id3-447000-wcop.tag?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3137 retrieving revision 1.3138 diff -u -d -r1.3137 -r1.3138 --- ChangeLog 11 Oct 2007 16:41:43 -0000 1.3137 +++ ChangeLog 11 Oct 2007 17:55:28 -0000 1.3138 @@ -1,5 +1,18 @@ 2007-10-11 Tim-Philipp Müller <tim at centricular dot net> + Based on patch by: Jason Kivlighn <jkivlighn gmail com> + + * gst/id3demux/id3v2frames.c: + Extract license/copyright URIs from ID3v2 WCOP frames + (Fixes #447000). + * tests/check/elements/id3demux.c: + * tests/files/Makefile.am: + * tests/files/id3-447000-wcop.tag: + Add simple unit test. +2007-10-11 Tim-Philipp Müller <tim at centricular dot net> * ext/taglib/gstid3v2mux.cc: Add support for license/copyright URI tags (ID3v2 WCOP frame). Prerequisite for #447000. Index: id3v2frames.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/id3demux/id3v2frames.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- id3v2frames.c 6 Oct 2007 16:13:14 -0000 1.30 +++ id3v2frames.c 11 Oct 2007 17:55:29 -0000 1.31 @@ -38,6 +38,8 @@ #define GST_CAT_DEFAULT (id3demux_debug) static gboolean parse_comment_frame (ID3TagsWorking * work); +static gchar *parse_url_link_frame (ID3TagsWorking * work, + const gchar ** tag_name); static GArray *parse_text_identification_frame (ID3TagsWorking * work); static gchar *parse_user_text_identification_frame (ID3TagsWorking * work, const gchar ** tag_name); @@ -162,6 +164,9 @@ /* Text identification frame */ tag_fields = parse_text_identification_frame (work); } + } else if (work->frame_id[0] == 'W' && strcmp (work->frame_id, "WXXX") != 0) { + /* URL link frame: ISO-8859-1 encoded, one frame per tag */ + tag_str = parse_url_link_frame (work, &tag_name); } else if (!strcmp (work->frame_id, "COMM")) { /* Comment */ result = parse_comment_frame (work); @@ -297,6 +302,58 @@ return fields; } +static gboolean +link_is_known_license (const gchar * url) +{ + return g_str_has_prefix (url, "http://creativecommons.org/licenses/"); +} +static gchar * +parse_url_link_frame (ID3TagsWorking * work, const gchar ** tag_name) + gsize len; + gchar *nul, *data, *link; + *tag_name = NULL; + if (work->parse_size == 0) + return NULL; + data = (gchar *) work->parse_data; + /* if there's more data then the string is long, we only want to parse the + * data up to the terminating zero to g_convert and ignore the rest, as + * per spec */ + nul = memchr (data, '\0', work->parse_size); + if (nul != NULL) { + len = (gsize) (nul - data); + } else { + len = work->parse_size; + } + link = g_convert (data, len, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); + if (link == NULL || !gst_uri_is_valid (link)) { + GST_DEBUG ("Invalid URI in %s frame: %s", work->frame_id, + GST_STR_NULL (link)); + g_free (link); + /* we don't know if it's a link to a page that explains the copyright + * situation, or a link that points to/represents a license, the ID3 spec + * does not separate those two things; for now only put known license URIs + * into GST_TAG_LICENSE_URI and everything else into GST_TAG_COPYRIGHT_URI */ + if (strcmp (work->frame_id, "WCOP") == 0) { + if (link_is_known_license (link)) + *tag_name = GST_TAG_LICENSE_URI; + else + *tag_name = GST_TAG_COPYRIGHT_URI; + return link; static gchar * parse_user_text_identification_frame (ID3TagsWorking * work, const gchar ** tag_name) Index: id3demux.c RCS file: /cvs/gstreamer/gst-plugins-good/tests/check/elements/id3demux.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- id3demux.c 22 Jun 2007 10:12:15 -0000 1.2 +++ id3demux.c 11 Oct 2007 17:55:29 -0000 1.3 @@ -175,6 +175,32 @@ GST_END_TEST; +static void +check_wcop (const GstTagList * tags, const gchar * file) + gchar *copyright = NULL; + gchar *uri = NULL; + fail_unless (gst_tag_list_get_string (tags, GST_TAG_LICENSE_URI, &uri)); + fail_unless (uri != NULL); + fail_unless_equals_string (uri, + "http://creativecommons.org/licenses/by/3.0/"); + g_free (uri); + fail_unless (gst_tag_list_get_string (tags, GST_TAG_COPYRIGHT, ©right)); + fail_unless (copyright != NULL); + fail_unless_equals_string (copyright, + " Steadman. Licensed to the public under http://creativecommons.org/licenses/by/3.0/ verify at http://test.com"); + g_free (copyright); +GST_START_TEST (test_wcop) + run_check_for_file ("id3-447000-wcop.tag", check_wcop); +GST_END_TEST; static Suite * id3demux_suite (void) { @@ -183,6 +209,7 @@ suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_tdat_tyer); + tcase_add_test (tc_chain, test_wcop); return s; Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/tests/files/Makefile.am,v retrieving revision 1.1 diff -u -d -r1.1 -r1.2 --- Makefile.am 6 Mar 2007 23:19:29 -0000 1.1 +++ Makefile.am 11 Oct 2007 17:55:29 -0000 1.2 @@ -1,5 +1,6 @@ EXTRA_DIST = \ id3-407349-1.tag \ - id3-407349-2.tag + id3-407349-2.tag \ + id3-447000-wcop.tag --- NEW FILE: id3-447000-wcop.tag --- ID3 |