sound-juicer r2281 - in trunk: . libjuicer tests
- From: hadess svn gnome org
- To: svn-commits-list gnome org
- Subject: sound-juicer r2281 - in trunk: . libjuicer tests
- Date: Wed, 3 Sep 2008 23:19:08 +0000 (UTC)
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]