164 lines
4.5 KiB
C
164 lines
4.5 KiB
C
#define _GNU_SOURCE
|
|
|
|
#include "empd.h"
|
|
#include "empc.h"
|
|
#include <Esskyuehl.h>
|
|
#include <Ecore.h>
|
|
#include <Efreet.h>
|
|
|
|
typedef enum
|
|
{
|
|
GLYR_TYPE_UNKNOWN,
|
|
GLYR_TYPE_LYRICS,
|
|
GLYR_TYPE_ALBUM_REVIEW,
|
|
GLYR_TYPE_ARTIST_PHOTO,
|
|
GLYR_TYPE_COVERART,
|
|
GLYR_TYPE_ARTIST_BIO,
|
|
GLYR_TYPE_SIMILAR_ARTIST,
|
|
GLYR_TYPE_SIMILAR_SONG,
|
|
GLYR_TYPE_ALBUMLIST,
|
|
GLYR_TYPE_TAG,
|
|
GLYR_TYPE_TAG_ARTIST,
|
|
GLYR_TYPE_TAG_ALBUM,
|
|
GLYR_TYPE_TAG_TITLE,
|
|
GLYR_TYPE_RELATION,
|
|
GLYR_TYPE_IMG_URL,
|
|
GLYR_TYPE_TXT_URL,
|
|
GLYR_TYPE_TRACK,
|
|
GLYR_TYPE_GUITARTABS,
|
|
GLYR_TYPE_BACKDROPS
|
|
} GLYR_DATA_TYPE;
|
|
|
|
typedef enum
|
|
{
|
|
GLYR_GET_UNKNOWN,
|
|
GLYR_GET_COVERART,
|
|
GLYR_GET_LYRICS,
|
|
GLYR_GET_ARTIST_PHOTOS,
|
|
GLYR_GET_ARTIST_BIO,
|
|
GLYR_GET_SIMILAR_ARTISTS,
|
|
GLYR_GET_SIMILAR_SONGS,
|
|
GLYR_GET_ALBUM_REVIEW,
|
|
GLYR_GET_TRACKLIST,
|
|
GLYR_GET_TAGS,
|
|
GLYR_GET_RELATIONS,
|
|
GLYR_GET_ALBUMLIST,
|
|
GLYR_GET_GUITARTABS,
|
|
GLYR_GET_BACKDROPS,
|
|
GLYR_GET_ANY
|
|
} GLYR_GET_TYPE;
|
|
|
|
static Eina_List *handlers = NULL;
|
|
static Esql *e = NULL;
|
|
static Eina_Bool connected = EINA_FALSE;
|
|
|
|
/* Jesus H.R. Puffnstuf Christ */
|
|
static const char glyr_query[] =
|
|
{
|
|
"SELECT artist_name, "
|
|
" album_name, "
|
|
" title_name, "
|
|
" source_url, "
|
|
" data_type, "
|
|
" data_size, "
|
|
" data_is_image, "
|
|
" data "
|
|
"FROM metadata as m "
|
|
"LEFT JOIN artists AS a ON m.artist_id = a.rowid "
|
|
"LEFT JOIN albums AS b ON m.album_id = b.rowid "
|
|
"LEFT JOIN titles AS t ON m.title_id = t.rowid "
|
|
"LEFT JOIN image_types as i on m.image_type_id = i.rowid "
|
|
"WHERE m.get_type = %d "
|
|
" %s "
|
|
" %s "
|
|
" %s "
|
|
" %s "
|
|
"LIMIT %d; "
|
|
};
|
|
|
|
static Eina_Bool
|
|
_connect(void *d EINA_UNUSED, int t EINA_UNUSED, Esql *ev EINA_UNUSED)
|
|
{
|
|
connected = EINA_TRUE;
|
|
return ECORE_CALLBACK_CANCEL;
|
|
}
|
|
|
|
static void
|
|
empc_glyr_gmpc_fetch_image_cb(Esql_Res *res, void *artist_only)
|
|
{
|
|
Eina_Iterator *it;
|
|
Esql_Row *row;
|
|
|
|
it = esql_res_row_iterator_new(res);
|
|
EINA_ITERATOR_FOREACH(it, row)
|
|
{
|
|
const char *artist = NULL;
|
|
const char *album = NULL;
|
|
const char *source_url = NULL;
|
|
Eina_Value tmp;
|
|
const Eina_Value *val;
|
|
Eina_Value_Blob blob = { .size = 0, .memory = NULL };
|
|
|
|
val = esql_row_value_struct_get(row);
|
|
eina_value_struct_get(val, "artist_name", &artist);
|
|
eina_value_struct_get(val, "source_url", &source_url);
|
|
if (!artist_only)
|
|
eina_value_struct_get(val, "album_name", &album);
|
|
if (eina_value_struct_value_get(val, "data", &tmp))
|
|
{
|
|
if (eina_value_pget(&tmp, &blob))
|
|
eina_value_flush(&tmp);
|
|
}
|
|
|
|
empc_cover_done(artist, album, source_url, (void*)blob.memory, blob.size);
|
|
}
|
|
eina_iterator_free(it);
|
|
}
|
|
|
|
void
|
|
empc_glyr_gmpc_fetch_image(const char *artist_fetch, const char *album_fetch)
|
|
{
|
|
Esql_Query_Id id;
|
|
char artist[128] = {0}, album[128] = {0};
|
|
char buf[2048];
|
|
char *a, *al;
|
|
long artist_only = !album_fetch;
|
|
|
|
|
|
if (!connected) return;
|
|
a = strdupa(artist_fetch);
|
|
eina_str_tolower(&a);
|
|
snprintf(artist, sizeof(artist), "AND artist_name = '%s'", a);
|
|
if (album_fetch)
|
|
{
|
|
al = strdupa(album_fetch);
|
|
eina_str_tolower(&al);
|
|
snprintf(album, sizeof(album), "AND album_name = '%s'", al);
|
|
}
|
|
snprintf(buf, sizeof(buf), glyr_query,
|
|
album_fetch ? GLYR_GET_COVERART : GLYR_GET_ARTIST_PHOTOS,
|
|
"",
|
|
album,
|
|
artist,
|
|
"AND NOT data_type = 14",
|
|
1);
|
|
|
|
id = esql_query(e, (void*)artist_only, buf);
|
|
esql_query_callback_set(id, empc_glyr_gmpc_fetch_image_cb);
|
|
}
|
|
|
|
void
|
|
empc_glyr_gmpc_init(void)
|
|
{
|
|
char buf[PATH_MAX];
|
|
|
|
efreet_init();
|
|
snprintf(buf, sizeof(buf), "%s/gmpc/metadata/metadata.db", efreet_cache_home_get());
|
|
esql_init();
|
|
|
|
E_LIST_HANDLER_APPEND(handlers, ESQL_EVENT_CONNECT, _connect, NULL);
|
|
|
|
e = esql_pool_new(5, ESQL_TYPE_SQLITE);
|
|
esql_connect(e, buf, NULL, NULL);
|
|
}
|