diff --git a/core/Sconscript b/core/Sconscript index 7d4d12bb..7327472d 100644 --- a/core/Sconscript +++ b/core/Sconscript @@ -6,4 +6,5 @@ res += SConscript("tags/Sconscript") res += SConscript("containers/Sconscript") env.UsePackage("gstreamer-1.0") +env.UsePackage("libmusicbrainz5"); Return("res") diff --git a/core/tags/album.c b/core/tags/album.c index 457e5109..877f40ba 100644 --- a/core/tags/album.c +++ b/core/tags/album.c @@ -1,11 +1,15 @@ /* * Copyright 2014 (c) Anna Schumaker. */ +#include #include +#include #include +#include static struct database album_db; + static inline void __album_init_file(struct album *al, struct cache_file *f) { cache_file_init(f, g_strdup_printf("%d", al->al_year), @@ -18,6 +22,56 @@ static inline void __album_deinit_file(struct cache_file *f) g_free(f->cf_name); } +static Mb5Metadata __album_query_releaseid(struct album *album, + Mb5Query *mb5) +{ + gchar *param, *query = "query"; + Mb5Metadata metadata = NULL; + tQueryResult result; + gchar error[256]; + + if (album->al_artist != NULL) + param = g_strdup_printf("release:\"%s\" AND artist:%s", + album->al_lower, album->al_artist->ar_lower); + else if (album->al_year != 0) + param = g_strdup_printf("release:\"%s\" AND date:%d", + album->al_lower, album->al_year); + else + param = g_strdup_printf("release:\"%s\"", album->al_lower); + + metadata = mb5_query_query(mb5, "release", "", "", 1, &query, ¶m); + result = mb5_query_get_lastresult(mb5); + if (result != 0) { + mb5_query_get_lasterrormessage(mb5, error, sizeof(error)); + g_printf("MusicBrainz: %s\n", error); + } + + g_free(param); + return metadata; +} + +static bool __album_fetch_artwork(struct album *album) +{ + Mb5Metadata metadata; + Mb5Query *mb5; + bool ret; + + if (album_artwork_exists(album)) + return true; + + mb5 = mb5_query_new(OCARINA_NAME, NULL, 0); + if (!mb5) + return true; + + metadata = __album_query_releaseid(album, mb5); + if (metadata) + mb5_metadata_delete(metadata); + + ret = mb5_query_get_lasthttpcode(mb5) != 503; + mb5_query_delete(mb5); + return ret; +} + static gchar *__album_key(const gchar *name, unsigned int year) { return g_strdup_printf("%u/%s", year, name); @@ -33,6 +87,8 @@ static struct album *__album_alloc(gchar *name, unsigned int year) album->al_lower = string_lowercase(album->al_name); album->al_artist = NULL; + if (!album_artwork_exists(album)) + idle_schedule(IDLE_ASYNC, IDLE_FUNC(__album_fetch_artwork), album); return album; } diff --git a/tests/core/collection.c b/tests/core/collection.c index 6c29146a..3aa42fff 100644 --- a/tests/core/collection.c +++ b/tests/core/collection.c @@ -14,6 +14,7 @@ static void test_init() struct queue *q = collection_get_queue(); GSList *list; + idle_init(); filter_init(); tags_init(); playlist_init(NULL); diff --git a/tests/core/tags/album.c b/tests/core/tags/album.c index 07e88264..5bfe3d53 100644 --- a/tests/core/tags/album.c +++ b/tests/core/tags/album.c @@ -29,6 +29,8 @@ static void test_album() struct album *album; struct file f; + idle_init(); + album = ALBUM(album_ops->dbe_alloc("1998/Hyrule Symphony")); test_verify_hyrule(album); @@ -99,15 +101,31 @@ static void test_album_db() static void test_album_artwork() { - struct album *album; + struct album *ocarina, *majora, *wind; + struct artist *koji; + artist_db_init(); idle_deinit(); idle_init(); - album = album_find("Hyrule Symphony", 1998); - test_equal(album_artwork_exists(album), (bool)false); + ocarina = album_find("Ocarina of Time", 1998); + majora = album_find("Majora's Mask", 2000); + wind = album_find("Wind Waker", 0); + koji = artist_find("Koji Kondo"); + ocarina->al_artist = koji; + + test_equal(album_artwork_exists(ocarina), (bool)false); + test_equal(album_artwork_exists(majora), (bool)false); + test_equal(album_artwork_exists(wind), (bool)false); + + while (idle_run_task()) {} + + test_equal(album_artwork_exists(ocarina), (bool)false); + test_equal(album_artwork_exists(majora), (bool)false); + test_equal(album_artwork_exists(wind), (bool)false); album_db_deinit(); + artist_db_deinit(); idle_deinit(); } diff --git a/tests/core/tags/track.c b/tests/core/tags/track.c index e071ecbf..656db479 100644 --- a/tests/core/tags/track.c +++ b/tests/core/tags/track.c @@ -72,6 +72,7 @@ static void test_track() gchar *date; setlocale(LC_TIME, "C"); + idle_init(); filter_init(); tags_init(); file_init(&f, "track_tag", 0, 0); diff --git a/tests/gui/collection.c b/tests/gui/collection.c index 4d297c9f..aa9ac16f 100644 --- a/tests/gui/collection.c +++ b/tests/gui/collection.c @@ -77,6 +77,7 @@ static void test_collection_sidebar() test_equal(gtk_widget_is_visible(GTK_WIDGET(progress)), true); g_main_loop_run(main_loop); test_equal((float)gtk_progress_bar_get_fraction(progress), (float)0.5); + while (idle_run_task()) {} g_main_loop_run(main_loop); test_equal(gtk_widget_is_visible(GTK_WIDGET(progress)), false);