diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2012-05-20 20:35:20 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2012-06-16 11:41:55 +0200 |
commit | 53d38b4831f610d7e1a2d6b6c905beba021d8a95 (patch) | |
tree | eeecb3c74302a6d502246991b25c1ad4624687fe /libjuicer | |
parent | 7bfb07e2c80b71ead9bd2ab0736b6b61f872bfbc (diff) |
Use relationlist_list_foreach_relation in fill_relations
Now that we have a helper to iterate over all relations, better
to use it as much as possible. It would probably be more efficient
to have a relationlist_list_foreach helper iterating over RelationList
items contained in a RelationListList, and a relationlist_foreach helper
iterating over Relation items contained in a RelationList.
This would allow fill_relations to avoid iterating over and over
on the RelationListList while it's always only interested in the
'url' RelationLists.
https://bugzilla.gnome.org/show_bug.cgi?id=661646
Diffstat (limited to 'libjuicer')
-rw-r--r-- | libjuicer/sj-metadata-musicbrainz4.c | 106 |
1 files changed, 52 insertions, 54 deletions
diff --git a/libjuicer/sj-metadata-musicbrainz4.c b/libjuicer/sj-metadata-musicbrainz4.c index 5f6b71a..aed0b47 100644 --- a/libjuicer/sj-metadata-musicbrainz4.c +++ b/libjuicer/sj-metadata-musicbrainz4.c @@ -183,51 +183,6 @@ get_artist_info (GList *artists, char **name, char **sortname, char **id) g_string_free (artist_name, FALSE); } - -static void -fill_relations (Mb4RelationList relations, AlbumDetails *album) -{ - unsigned int i; - - for (i = 0; i < mb4_relation_list_size (relations); i++) { - Mb4Relation relation; - char buffer[512]; /* for the GET() macro */ - char *type = NULL; - - relation = mb4_relation_list_item (relations, i); - if (relation == NULL) - continue; - - GET (type, mb4_relation_get_type, relation); - if (type == NULL) { - continue; - } - if (g_str_equal (type, "wikipedia")) { - char *wikipedia = NULL; - GET (wikipedia, mb4_relation_get_target, relation); - if (wikipedia != NULL) { - g_free (album->wikipedia); - album->wikipedia = wikipedia; - } - } else if (g_str_equal (type, "discogs")) { - char *discogs = NULL; - GET (discogs, mb4_relation_get_target, relation); - if (discogs != NULL) { - g_free (album->discogs); - album->discogs = discogs; - } - } else if (g_str_equal (type, "lyrics")) { - char *lyrics = NULL; - GET (lyrics, mb4_relation_get_target, relation); - if (lyrics != NULL) { - g_free (album->lyrics_url); - album->lyrics_url = lyrics; - } - } - g_free (type); - } -} - static void fill_album_composer (AlbumDetails *album) { @@ -414,6 +369,56 @@ fill_tracks_from_medium (Mb4Medium medium, AlbumDetails *album) album->tracks = g_list_reverse (tracks); } +static void wikipedia_cb (Mb4Relation relation, gpointer user_data) +{ + AlbumDetails *album = (AlbumDetails *)user_data; + char buffer[512]; /* for the GET() macro */ + char *wikipedia = NULL; + + GET (wikipedia, mb4_relation_get_target, relation); + if (wikipedia != NULL) { + g_free (album->wikipedia); + album->wikipedia = wikipedia; + } +} + +static void discogs_cb (Mb4Relation relation, gpointer user_data) +{ + AlbumDetails *album = (AlbumDetails *)user_data; + char buffer[512]; /* for the GET() macro */ + char *discogs = NULL; + + GET (discogs, mb4_relation_get_target, relation); + if (discogs != NULL) { + g_free (album->discogs); + album->discogs = discogs; + } +} + +static void lyrics_cb (Mb4Relation relation, gpointer user_data) +{ + AlbumDetails *album = (AlbumDetails *)user_data; + char buffer[512]; /* for the GET() macro */ + char *lyrics = NULL; + + GET (lyrics, mb4_relation_get_target, relation); + if (lyrics != NULL) { + g_free (album->lyrics_url); + album->lyrics_url = lyrics; + } +} + +static void +fill_relations (Mb4RelationListList relation_lists, AlbumDetails *album) +{ + relationlist_list_foreach_relation (relation_lists, "url", "wikipedia", + wikipedia_cb, album); + relationlist_list_foreach_relation (relation_lists, "url", "discogs", + discogs_cb, album); + relationlist_list_foreach_relation (relation_lists, "url", "lyrics", + lyrics_cb, album); +} + static AlbumDetails * make_album_from_release (Mb4ReleaseGroup group, Mb4Release release, @@ -425,7 +430,6 @@ make_album_from_release (Mb4ReleaseGroup group, GList *artists; char *date = NULL; char buffer[512]; /* for the GET macro */ - unsigned int i; g_assert (release); g_return_val_if_fail (medium != NULL, NULL); @@ -461,20 +465,14 @@ make_album_from_release (Mb4ReleaseGroup group, album->is_spoken_word = TRUE; } relationlists = mb4_releasegroup_get_relationlistlist (group); - for (i = 0; - relationlists && i < mb4_relationlist_list_size (relationlists); - i++) - fill_relations (mb4_relationlist_list_item(relationlists, i), album); + fill_relations (relationlists, album); } album->disc_number = mb4_medium_get_position (medium); fill_tracks_from_medium (medium, album); fill_album_composer (album); relationlists = mb4_release_get_relationlistlist (release); - for (i = 0; - relationlists && i < mb4_relationlist_list_size (relationlists); - i++) - fill_relations (mb4_relationlist_list_item (relationlists, i), album); + fill_relations (relationlists, album); sj_mb4_album_details_dump (album); return album; |