empc/empc_glyr_gmpc.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);
}