sound-juicer r2281 - in trunk: . libjuicer tests



Author: hadess
Date: Wed Sep  3 23:19:07 2008
New Revision: 2281
URL: http://svn.gnome.org/viewvc/sound-juicer?rev=2281&view=rev

Log:
2008-09-04  Bastien Nocera  <hadess hadess net>

	* libjuicer/sj-metadata-musicbrainz.c (mb_list_albums),
	(sj_metadata_musicbrainz_init), (sj_metadata_musicbrainz_finalize):
	* libjuicer/sj-metadata-musicbrainz3.c (make_album_from_release),
	(mb_list_albums):
	* libjuicer/sj-metadata.c (sj_metadata_helper_scan_disc_number):
	* libjuicer/sj-metadata.h:
	* libjuicer/sj-structures.h:
	* tests/mb-test.c (release_type_to_id), (metadata_cb), (main):
	- Move code to parse album titles into disc numbers to a common
	location for both musicbrainz backends, and fix valgrind errors
	(g_match_info_fetch() doesn't like having the string change from
	 underneath it)
	- Add a way to override the DiscID used, using the
	  MUSICBRAINZ_FORCE_DISC_ID envvar (MB3)
	- Fix leak of the disc ID (MB3)
	- Fix empty strings when we want them NULL (MB3)
	- Fix invalid memory access when getting the release date (MB3)
	- Add a few test DiscIDs to the metadata tester
	- Check whether a release is "Spoken Word" (Helps: #535181)



Modified:
   trunk/ChangeLog
   trunk/libjuicer/sj-metadata-musicbrainz.c
   trunk/libjuicer/sj-metadata-musicbrainz3.c
   trunk/libjuicer/sj-metadata.c
   trunk/libjuicer/sj-metadata.h
   trunk/libjuicer/sj-structures.h
   trunk/tests/mb-test.c

Modified: trunk/libjuicer/sj-metadata-musicbrainz.c
==============================================================================
--- trunk/libjuicer/sj-metadata-musicbrainz.c	(original)
+++ trunk/libjuicer/sj-metadata-musicbrainz.c	Wed Sep  3 23:19:07 2008
@@ -56,7 +56,6 @@
   int http_proxy_port;
   char *cdrom;
   GList *albums;
-  GRegex *disc_regex;
 };
 
 #define GET_PRIVATE(o)  \
@@ -281,7 +280,6 @@
   SjMetadataMusicbrainzPrivate *priv;
   GList *albums = NULL;
   GList *al, *tl;
-  GMatchInfo *info;
   char data[256];
   int num_albums, i, j;
   NautilusBurnMediaType type;
@@ -369,7 +367,12 @@
     }
 
     if (mb_GetResultData(priv->mb, MBE_AlbumGetAlbumName, data, sizeof (data))) {
-      album->title = g_strdup (data);
+      char *new_title;
+      new_title = sj_metadata_helper_scan_disc_number (data, &album->disc_number);
+      if (new_title)
+        album->title = new_title;
+      else
+        album->title = g_strdup (data);
     } else {
       album->title = g_strdup (_("Unknown Title"));
     }
@@ -378,23 +381,6 @@
       album->asin = g_strdup (data);
     }
 
-    if (g_regex_match (priv->disc_regex, album->title, 0, &info)) {
-      int pos = 0;
-      char *s;
- 
-      g_match_info_fetch_pos (info, 1, &pos, NULL);
-      if (pos) {
-        s = g_strndup (album->title, pos);
-        g_free (album->title);
-        album->title = s;
-      }
-      
-      s = g_match_info_fetch (info, 2);
-      album->disc_number = atoi (s);
-      g_free (s);
-    }
-    g_match_info_free (info);
-
     {
       int num_releases;
       num_releases = mb_GetResultInt (priv->mb, MBE_AlbumGetNumReleaseDates);
@@ -569,8 +555,6 @@
   if (g_getenv("MUSICBRAINZ_DEBUG")) {
     mb_SetDebug (self->priv->mb, TRUE);
   }
-
-  self->priv->disc_regex = g_regex_new (".+( \\(disc (\\d+).*)", 0, 0, NULL);
 }
 
 static void
@@ -636,7 +620,6 @@
 
   g_free (priv->http_proxy);
   g_free (priv->cdrom);
-  g_regex_unref (priv->disc_regex);
   mb_Delete (priv->mb);
 
   G_OBJECT_CLASS (sj_metadata_musicbrainz_parent_class)->finalize (object);

Modified: trunk/libjuicer/sj-metadata-musicbrainz3.c
==============================================================================
--- trunk/libjuicer/sj-metadata-musicbrainz3.c	(original)
+++ trunk/libjuicer/sj-metadata-musicbrainz3.c	Wed Sep  3 23:19:07 2008
@@ -37,7 +37,15 @@
 #include "sj-structures.h"
 #include "sj-error.h"
 
-#define GET(field, function, obj) function (obj, buffer, sizeof (buffer)); if (field) g_free (field); field = g_strdup (buffer);
+#define GET(field, function, obj) {						\
+	function (obj, buffer, sizeof (buffer));				\
+	if (field)								\
+		g_free (field);							\
+	if (*buffer == '\0')							\
+		field = NULL;							\
+	else									\
+		field = g_strdup (buffer);					\
+}
 
 #define GCONF_PROXY_USE_PROXY "/system/http_proxy/use_http_proxy"
 #define GCONF_PROXY_HOST "/system/http_proxy/host"
@@ -86,8 +94,7 @@
   AlbumDetails *album;
   char buffer[512];
   MbArtist artist;
-  GRegex *disc_regex;
-  GMatchInfo *info;
+  char *new_title;
   int i;
 
   g_assert (release);
@@ -104,38 +111,23 @@
   }
 
   GET (album->title, mb_release_get_title, release);
-  disc_regex = g_regex_new (".+( \\(disc (\\d+).*)", 0, 0, NULL);
-
-  if (g_regex_match (disc_regex, album->title, 0, &info)) {
-    int pos = 0;
-    char *s;
-
-    g_match_info_fetch_pos (info, 1, &pos, NULL);
-    if (pos) {
-	    s = g_strndup (album->title, pos);
-	    g_free (album->title);
-	    album->title = s;
-    }
-
-    s = g_match_info_fetch (info, 2);
-    album->disc_number = atoi (s);
-    g_free (s);
+  new_title = sj_metadata_helper_scan_disc_number (album->title, &album->disc_number);
+  if (new_title) {
+    g_free (album->title);
+    album->title = new_title;
   }
 
-  g_match_info_free (info);
-  g_regex_unref (disc_regex);
-
   artist = mb_release_get_artist (release);
   GET (album->artist_id, mb_artist_get_id, artist);
   GET (album->artist, mb_artist_get_name, artist);
   GET (album->artist_sortname, mb_artist_get_sortname, artist);
-  
+
   if (mb_release_get_num_release_events (release) >= 1) {
     MbReleaseEvent event;
     char *date = NULL;
     int matched, year=1, month=1, day=1;
 
-    event = mb_release_get_release_event (release, 1);
+    event = mb_release_get_release_event (release, 0);
     GET (date, mb_release_event_get_date, event);
     matched = sscanf(date, "%u-%u-%u", &year, &month, &day);
     if (matched >= 1)
@@ -161,6 +153,17 @@
     g_free (type);
   }
 
+  for (i = 0; i < mb_release_get_num_types (release); i++) {
+    mb_release_get_type (release, i, buffer, sizeof(buffer));
+
+    if (g_str_has_suffix (buffer, "#Spokenword")
+    	|| g_str_has_suffix (buffer, "#Interview")
+    	|| g_str_has_suffix (buffer, "#Audiobook")) {
+      album->is_spoken_word = TRUE;
+      break;
+    }
+  }
+
   for (i = 0; i < album->number; i++) {
     MbTrack mbt;
     TrackDetails *track;
@@ -266,13 +269,18 @@
     *url = g_strdup (buffer);
   }
 
-  GET(id, mb_disc_get_id, priv->disc);
+  if (g_getenv("MUSICBRAINZ_FORCE_DISC_ID")) {
+    id = g_strdup (g_getenv("MUSICBRAINZ_FORCE_DISC_ID"));
+  } else {
+    GET(id, mb_disc_get_id, priv->disc);
+  }
 
   query = mb_query_new (priv->mb, "sound-juicer");
   filter = mb_release_filter_new ();
   filter = mb_release_filter_disc_id (filter, id);
   results = mb_query_get_releases (query, filter);
   mb_release_filter_free (filter);
+  g_free (id);
 
   if (mb_result_list_get_size (results) == 0) {
     mb_result_list_free (results);

Modified: trunk/libjuicer/sj-metadata.c
==============================================================================
--- trunk/libjuicer/sj-metadata.c	(original)
+++ trunk/libjuicer/sj-metadata.c	Wed Sep  3 23:19:07 2008
@@ -19,6 +19,7 @@
  */
 
 #include <glib-object.h>
+#include <stdlib.h>
 #include "sj-metadata.h"
 #include "sj-metadata-marshal.h"
 
@@ -102,3 +103,36 @@
   return SJ_METADATA_GET_CLASS (metadata)->list_albums (metadata, url, error);
 }
 
+char *
+sj_metadata_helper_scan_disc_number (const char *album_title, int *disc_number)
+{
+  GRegex *disc_regex;
+  GMatchInfo *info;
+  char *new_title;
+  int num;
+
+  disc_regex = g_regex_new (".+( \\(disc (\\d+).*)", 0, 0, NULL);
+  new_title = NULL;
+  *disc_number = 0;
+
+  if (g_regex_match (disc_regex, album_title, 0, &info)) {
+    int pos = 0;
+    char *s;
+
+    g_match_info_fetch_pos (info, 1, &pos, NULL);
+    if (pos) {
+      new_title = g_strndup (album_title, pos);
+    }
+
+    s = g_match_info_fetch (info, 2);
+    num = atoi (s);
+    *disc_number = num;
+    g_free (s);
+  }
+
+  g_match_info_free (info);
+  g_regex_unref (disc_regex);
+
+  return new_title;
+}
+

Modified: trunk/libjuicer/sj-metadata.h
==============================================================================
--- trunk/libjuicer/sj-metadata.h	(original)
+++ trunk/libjuicer/sj-metadata.h	Wed Sep  3 23:19:07 2008
@@ -50,6 +50,8 @@
 void sj_metadata_set_proxy_port (SjMetadata *metadata, const int proxy_port);
 GList * sj_metadata_list_albums (SjMetadata *metadata, char **url, GError **error);
 
+char * sj_metadata_helper_scan_disc_number (const char *album_title, int *disc_number);
+
 G_END_DECLS
 
 #endif /* SJ_METADATA_H */

Modified: trunk/libjuicer/sj-structures.h
==============================================================================
--- trunk/libjuicer/sj-structures.h	(original)
+++ trunk/libjuicer/sj-structures.h	Wed Sep  3 23:19:07 2008
@@ -65,6 +65,7 @@
   char* discogs;
   char* wikipedia;
   MetadataSource metadata_source;
+  gboolean is_spoken_word;
 };
 
 void album_details_free(AlbumDetails *album);

Modified: trunk/tests/mb-test.c
==============================================================================
--- trunk/tests/mb-test.c	(original)
+++ trunk/tests/mb-test.c	Wed Sep  3 23:19:07 2008
@@ -17,6 +17,27 @@
 	return strs[source];
 }
 
+static const char *
+release_type_to_id (const char *type)
+{
+	/* CD 2 of a multi-CD set
+	 * Beastie Boys - Anthology: The Sounds of Science (disc 2)
+	 * http://musicbrainz.org/release/0f15fc15-9538-44b6-aa19-4074934fc5ba.html */
+	if (g_str_equal (type, "commercial"))
+	  return "rg4F4Od5EgOwfDaI0niQ2TnCaxk-";
+	/* Non-existant CD
+	 * http://musicbrainz.org/bare/cdlookup.html?discid=aaaaaaaaaaaaaaaaaaaaaaaaaaaa */
+	if (g_str_equal (type, "fake"))
+	  return "aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+	/* Audio book
+	 * Harry Potter and the Sorcerer's Stone (feat. narrator: Jim Dale) (disc 1)
+	 * http://musicbrainz.org/release/947c6cdd-1188-4e3e-a53b-21bb3a49b79e.html */
+	if (g_str_equal (type, "audiobook"))
+	  return "VJ0lpdqHGE7r8wr.N8D6Q0G.pCs-";
+
+	return NULL;
+}
+
 static void
 metadata_cb (SjMetadataGetter *metadata, GList *albums, GError *error)
 {
@@ -45,6 +66,8 @@
       g_print ("Discogs: %s\n", album->discogs);
     if (album->wikipedia != NULL)
       g_print ("Wikipedia: %s\n", album->wikipedia);
+    if (album->is_spoken_word)
+      g_print ("Is spoken word\n");
     disc_number = g_strdup_printf (" (Disc %d)", album->disc_number);
     g_print ("'%s', by %s%s\n", album->title, album->artist, album->disc_number ? disc_number : "");
     g_free (disc_number);
@@ -73,8 +96,18 @@
 
   if (argc == 2) {
     sj_metadata_getter_set_cdrom (metadata, argv[1]);
+  } else if (argc == 3) {
+    const char *id;
+    sj_metadata_getter_set_cdrom (metadata, argv[1]);
+    id = release_type_to_id (argv[2]);
+    g_message ("argv %s id %s", argv[2], id);
+    if (id == NULL) {
+      g_print ("The faked type of disc must be one of: commercial, fake, audiobook\n");
+      exit(1);
+    }
+    g_setenv ("MUSICBRAINZ_FORCE_DISC_ID", id, TRUE);
   } else {
-    g_print ("Usage: %s [CD device]\n", argv[0]);
+    g_print ("Usage: %s [CD device] [commercial|fake|audiobook]\n", argv[0]);
     exit (1);
   }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]