core/tags/album: Query the Cover Art Archive for album art

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-05-03 08:21:34 -04:00
parent 570efda299
commit 940d2d1dc2
3 changed files with 58 additions and 4 deletions

View File

@ -7,4 +7,5 @@ res += SConscript("containers/Sconscript")
env.UsePackage("gstreamer-1.0")
env.UsePackage("libmusicbrainz5");
env.UsePackage("libcoverart");
Return("res")

View File

@ -5,6 +5,7 @@
#include <core/string.h>
#include <core/version.h>
#include <core/tags/album.h>
#include <coverart/caa_c.h>
#include <musicbrainz5/mb5_c.h>
static struct database album_db;
@ -50,6 +51,56 @@ static Mb5Metadata __album_query_releaseid(struct album *album,
return metadata;
}
static bool __album_fetch_cover(struct album *album, gchar *releaseid,
CaaCoverArt *caa)
{
struct cache_file file;
CaaImageData image;
gchar error[256];
image = caa_coverart_fetch_front(caa, releaseid);
if (!image) {
caa_coverart_get_lasterrormessage(caa, error, sizeof(error));
g_printf("Cover Art Archive: %s\n", error);
return false;
}
__album_init_file(album, &file);
if (cache_file_open(&file, OPEN_WRITE)) {
cache_file_write(&file, caa_imagedata_data(image),
caa_imagedata_size(image));
cache_file_close(&file);
}
__album_deinit_file(&file);
caa_imagedata_delete(image);
return album_artwork_exists(album);
}
static void __album_foreach_fetch(struct album *album, Mb5Metadata metadata)
{
Mb5ReleaseList list = mb5_metadata_get_releaselist(metadata);
gchar releaseid[40];
Mb5Release release;
CaaCoverArt *caa;
unsigned int i;
caa = caa_coverart_new(OCARINA_NAME);
if (!caa)
return;
for (i = 0; i < mb5_release_list_size(list); i++) {
release = mb5_release_list_item(list, i);
if (!release)
break;
mb5_release_get_id(release, releaseid, sizeof(releaseid));
if (__album_fetch_cover(album, releaseid, caa))
break;
}
caa_coverart_delete(caa);
}
static bool __album_fetch_artwork(struct album *album)
{
Mb5Metadata metadata;
@ -64,8 +115,10 @@ static bool __album_fetch_artwork(struct album *album)
return true;
metadata = __album_query_releaseid(album, mb5);
if (metadata)
if (metadata) {
__album_foreach_fetch(album, metadata);
mb5_metadata_delete(metadata);
}
ret = mb5_query_get_lasthttpcode(mb5) != 503;
mb5_query_delete(mb5);

View File

@ -120,9 +120,9 @@ static void test_album_artwork()
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);
test_equal(album_artwork_exists(ocarina), (bool)true);
test_equal(album_artwork_exists(majora), (bool)true);
test_equal(album_artwork_exists(wind), (bool)true);
album_db_deinit();
artist_db_deinit();