redo metadata fetch api, unify text+image fetchers, add album images to headers

This commit is contained in:
zmike 2014-02-08 14:49:12 -05:00
parent c46f14b7f6
commit a267849566
11 changed files with 258 additions and 170 deletions

View File

@ -646,6 +646,14 @@ collections {
}
}
}
group { name: "elm/layout/empc/dummy";
parts {
part { name: "empc.swallow.content"; type: SWALLOW;
description { state: "default";
}
}
}
}
#include "bgselector.edc"
#include "elm.edc"

View File

@ -3,6 +3,8 @@
typedef struct Bgselector
{
Evas_Object *layout;
Eina_Stringshare *artist;
Eina_Stringshare *album;
Eina_List *current;
Eina_List *images;
unsigned int current_num;
@ -29,6 +31,8 @@ _bgs_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev
Bgselector *bgs = data;
E_FREE_LIST(bgs->images, evas_object_del);
eina_stringshare_del(bgs->artist);
eina_stringshare_del(bgs->album);
free(bgs);
}
@ -212,3 +216,34 @@ bgselector_active_set(Evas_Object *obj, Eina_Bool active)
else
elm_object_signal_emit(obj, "empc,state,inactive", "empc");
}
void
bgselector_info_set(Evas_Object *obj, Eina_Stringshare *artist, Eina_Stringshare *album)
{
Bgselector *bgs;
bgs = evas_object_data_get(obj, "__bgselector");
EINA_SAFETY_ON_NULL_RETURN(bgs);
eina_stringshare_refplace(&bgs->artist, artist);
eina_stringshare_refplace(&bgs->album, album);
}
Eina_Stringshare *
bgselector_artist_get(Evas_Object *obj)
{
Bgselector *bgs;
bgs = evas_object_data_get(obj, "__bgselector");
EINA_SAFETY_ON_NULL_RETURN_VAL(bgs, NULL);
return bgs->artist;
}
Eina_Stringshare *
bgselector_album_get(Evas_Object *obj)
{
Bgselector *bgs;
bgs = evas_object_data_get(obj, "__bgselector");
EINA_SAFETY_ON_NULL_RETURN_VAL(bgs, NULL);
return bgs->album;
}

View File

@ -1,7 +1,5 @@
#include "empc_private.h"
#define EMPC_METADATA_TYPE_COUNT 3
#define WEIGHT evas_object_size_hint_weight_set
#define ALIGN evas_object_size_hint_align_set
#define EXPAND(X) WEIGHT((X), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND)
@ -39,6 +37,7 @@ static Eldbus_Proxy *empd_proxy = NULL;
static Eina_List *handlers = NULL;
static Eina_Hash *empd_current_queue = NULL;
static Eina_Hash *empd_current_queue_headers = NULL;
static int empd_songid = -1;
static unsigned int empd_song_track = 0;
@ -52,14 +51,13 @@ static unsigned int empd_queue_length = 0;
static unsigned char background_num = 0;
Eina_Hash *empc_metadata_fetch_reqs[EMPC_METADATA_TYPE_COUNT];
Eina_Hash *empc_metadata_fetch_reqs[EMPC_METADATA_TYPE_LAST];
Eina_Inlist *empc_modules[EMPC_MODULE_TYPE_LAST];
static size_t empc_module_size[EMPC_MODULE_TYPE_LAST] =
{
[EMPC_MODULE_TYPE_METADATA_IMAGE] = sizeof(Empc_Module_Metadata_Fetch),
[EMPC_MODULE_TYPE_METADATA_TEXT] = sizeof(Empc_Module_Metadata_Fetch),
[EMPC_MODULE_TYPE_METADATA_FETCH] = sizeof(Empc_Module_Metadata_Fetch),
[EMPC_MODULE_TYPE_METADATA_SAVER] = sizeof(Empc_Module_Metadata_Save),
};
@ -80,6 +78,18 @@ fetch_req_free(Empc_Fetch_Request_Internal *ireq)
free(ireq);
}
void
lyrics_set(void *data EINA_UNUSED, Empc_Fetch_Request *req EINA_UNUSED, Evas_Object *obj)
{
elm_object_part_content_set(layout, EMPC_BASE_SWALLOW_LYRICS, obj);
}
void
bg_add(void *data EINA_UNUSED, Empc_Fetch_Request *req, Evas_Object *obj)
{
bgselector_image_add(req->obj, obj);
}
static void
bg_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
@ -191,7 +201,7 @@ songid_update(int songid)
elm_genlist_item_fields_update(it, EMPC_PLAYLIST_TEXT_TIME, ELM_GENLIST_ITEM_FIELD_TEXT);
elm_object_part_content_set(layout, EMPC_BASE_SWALLOW_LYRICS, NULL);
if (lyrics_visible)
metadata_lyrics_fetch(NULL, layout, empd_song_artist, empd_song_title, EINA_FALSE);
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, EINA_FALSE, lyrics_set, NULL);
so = elm_object_item_data_get(it);
if ((!itp) || (so->album != sop->album) || (so->artist != sop->artist))
{
@ -243,11 +253,12 @@ empc_current_song(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_CurrentSong_
Evas_Object *o;
o = bg[background_num];
if ((empd_song_artist != evas_object_data_get(o, "artist")) ||
(empd_song_album != evas_object_data_get(o, "album")))
if ((empd_song_artist != bgselector_artist_get(o)) ||
(empd_song_album != bgselector_album_get(o)))
{
bgselector_clear(o);
metadata_image_fetch(NULL, o, empd_song_artist, empd_song_album, EINA_FALSE);
bgselector_info_set(o, empd_song_artist, empd_song_album);
metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, o, empd_song_artist, empd_song_album, EINA_FALSE, bg_add, NULL);
}
}
elm_object_part_text_set(layout, EMPC_BASE_TEXT_ARTIST, empd_song_artist);
@ -285,10 +296,11 @@ empc_status(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_Status_Data *ev)
if ((so->artist != empd_song_artist) || (so->album != empd_song_album))
{
o = bg[bg_next_get()];
if ((so->artist != evas_object_data_get(o, "artist")) || (so->album != evas_object_data_get(o, "album")))
if ((so->artist != bgselector_artist_get(o)) || (so->album != bgselector_album_get(o)))
{
bgselector_clear(o);
metadata_image_fetch(NULL, o, so->artist, so->album, EINA_FALSE);
bgselector_info_set(o, so->artist, so->album);
metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, o, so->artist, so->album, EINA_FALSE, bg_add, NULL);
}
}
}
@ -427,21 +439,56 @@ queue_list_header_text_get(Empd_Empc_Song *so, Evas_Object *obj EINA_UNUSED, con
return strdup(buf);
}
static void
queue_list_header_content_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
metadata_fetch_cancel(data);
}
static void
queue_list_header_image(void *data, Empc_Fetch_Request *req, Evas_Object *obj)
{
evas_object_show(obj);
elm_object_part_content_set(data, "empc.swallow.content", obj);
evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL, queue_list_header_content_del, req);
}
static Evas_Object *
queue_list_header_content_get(Empd_Empc_Song *so, Evas_Object *obj, const char *part EINA_UNUSED)
{
Evas_Object *o, *cur;
const char *f, *g;
if ((so->album != empd_song_album) || (so->artist != empd_song_artist)) return NULL;
if ((so->album != empd_song_album) || (so->artist != empd_song_artist))
{
Empc_Fetch_Request *req;
cur = elm_layout_add(obj);
elm_layout_theme_set(cur, "layout", "empc", "dummy");
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, so->artist, so->album, EINA_FALSE, queue_list_header_image, cur);
evas_object_event_callback_add(cur, EVAS_CALLBACK_DEL, queue_list_header_content_del, req);
return cur;
}
cur = bgselector_get(elm_object_part_content_get(layout, EMPC_BASE_SWALLOW_BACKGROUND));
if (!cur) return NULL;
elm_image_file_get(cur, &f, &g);
o = elm_image_add(obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_file_set(o, f, g);
if ((!f) || (!f[0])) //memfile
{
Evas_Object *img;
void *data;
int w, h;
img = elm_image_object_get(cur);
elm_image_object_size_get(cur, &w, &h);
data = evas_object_image_data_get(img, EINA_FALSE);
elm_image_memfile_set(o, data, w * h * sizeof(int), NULL, NULL);
evas_object_image_data_set(img, data);
}
else
elm_image_file_set(o, f, g);
return o;
}
@ -494,7 +541,15 @@ queue_list_item_del(Empd_Empc_Song *so, Evas_Object *obj EINA_UNUSED)
elm_object_item_data_set(itg, Empd_Empc_Song_copy(elm_object_item_data_get(it)));
}
else if (!elm_genlist_item_subitems_count(itg))
elm_object_item_del(itg);
{
Eina_List *l;
char buf[1024];
snprintf(buf, sizeof(buf), "%s:::%s", so->artist, so->album);
l = eina_hash_find(empd_current_queue_headers, buf);
eina_hash_set(empd_current_queue_headers, buf, eina_list_remove(l, itg));
elm_object_item_del(itg);
}
}
Empd_Empc_Song_free(so);
}
@ -581,7 +636,10 @@ empc_queue_list(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_QueueList_Data
{
Empd_Empc_Song *ss = elm_object_item_data_get(it);
if (Empd_Empc_Song_eq(so, ss))
Empd_Empc_Song_free(so);
{
Empd_Empc_Song_free(so);
so = ss;
}
else
{
Empd_Empc_Song_free(ss);
@ -613,11 +671,17 @@ empc_queue_list(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_QueueList_Data
}
if (!use)
{
char buf[1024];
Eina_List *l;
//INF("NEW HEADER: %s", so->uri);
if (itp)
ith = elm_genlist_item_insert_after(queue_list, &header_itc, Empd_Empc_Song_copy(so), NULL, itp, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
else
ith = elm_genlist_item_append(queue_list, &header_itc, Empd_Empc_Song_copy(so), NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
snprintf(buf, sizeof(buf), "%s:::%s", so->artist, so->album);
l = eina_hash_find(empd_current_queue_headers, buf);
eina_hash_set(empd_current_queue_headers, buf, eina_list_append(l, ith));
elm_genlist_item_select_mode_set(ith, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
}
}
@ -770,8 +834,7 @@ module_check(Eina_Module *m, void *d EINA_UNUSED)
switch (type)
{
case EMPC_MODULE_TYPE_METADATA_IMAGE:
case EMPC_MODULE_TYPE_METADATA_TEXT:
case EMPC_MODULE_TYPE_METADATA_FETCH:
{
Empc_Module_Metadata_Fetch *em = (Empc_Module_Metadata_Fetch*)mod;
@ -797,18 +860,12 @@ error:
return EINA_FALSE;
}
void
lyrics_set(Evas_Object *obj)
{
elm_object_part_content_set(layout, EMPC_BASE_SWALLOW_LYRICS, obj);
}
static void
lyrics_show(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
lyrics_visible = EINA_TRUE;
if (!elm_object_part_content_get(layout, EMPC_BASE_SWALLOW_LYRICS))
metadata_lyrics_fetch(NULL, layout, empd_song_artist, empd_song_title, EINA_FALSE);
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, EINA_FALSE, lyrics_set, NULL);
}
static void
@ -849,7 +906,7 @@ bg_chooser_show(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char
bgchooser = EINA_TRUE;
bgs = elm_object_part_content_get(layout, EMPC_BASE_SWALLOW_BACKGROUND);
bgfetch = metadata_image_fetch(NULL, bgs, empd_song_artist, empd_song_album, EINA_TRUE);
bgfetch = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, bgs, empd_song_artist, empd_song_album, EINA_TRUE, bg_add, NULL);
bgselector_active_set(bgs, EINA_TRUE);
}
@ -859,13 +916,16 @@ bg_chooser_hide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char
Empc_Module *mod;
Evas_Object *bgs, *img;
Eina_Stringshare *artist, *album;
char buf[1024];
Eina_List *l, *ll;
Elm_Object_Item *it;
bgs = elm_object_part_content_get(layout, EMPC_BASE_SWALLOW_BACKGROUND);
bgselector_prune(bgs);
bgselector_active_set(bgs, EINA_FALSE);
img = bgselector_get(bgs);
artist = evas_object_data_get(bgs, "artist");
album = evas_object_data_get(bgs, "album");
artist = bgselector_artist_get(bgs);
album = bgselector_album_get(bgs);
metadata_fetch_cancel(bgfetch);
EINA_INLIST_FOREACH(empc_modules[EMPC_MODULE_TYPE_METADATA_SAVER], mod)
@ -875,6 +935,11 @@ bg_chooser_hide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char
es->save_image(img, artist, album);
}
bgchooser = EINA_FALSE;
snprintf(buf, sizeof(buf), "%s:::%s", artist, album);
l = eina_hash_find(empd_current_queue_headers, buf);
EINA_LIST_FOREACH(l, ll, it)
elm_genlist_item_fields_update(it, "empc.swallow.content", ELM_GENLIST_ITEM_FIELD_CONTENT);
}
static void
@ -910,8 +975,8 @@ main(int argc, char *argv[])
Eina_Array *mods;
Eina_Free_Cb free_cbs[] =
{
[EMPC_MODULE_TYPE_METADATA_IMAGE] = (Eina_Free_Cb)fetch_req_free,
[EMPC_MODULE_TYPE_METADATA_TEXT] = (Eina_Free_Cb)fetch_req_free,
[EMPC_METADATA_TYPE_IMAGE] = (Eina_Free_Cb)fetch_req_free,
[EMPC_METADATA_TYPE_TEXT] = (Eina_Free_Cb)fetch_req_free,
};
eldbus_init();
@ -930,7 +995,8 @@ main(int argc, char *argv[])
theme_load();
empd_current_queue = eina_hash_int32_new(NULL);
for (i = 0; i < EMPC_METADATA_TYPE_COUNT; i++)
empd_current_queue_headers = eina_hash_string_superfast_new(NULL);
for (i = 0; i < EMPC_METADATA_TYPE_LAST; i++)
empc_metadata_fetch_reqs[i] = eina_hash_string_superfast_new(free_cbs[i]);
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);

View File

@ -2,12 +2,18 @@
typedef enum
{
EMPC_MODULE_TYPE_METADATA_IMAGE,
EMPC_MODULE_TYPE_METADATA_TEXT,
EMPC_MODULE_TYPE_METADATA_FETCH,
EMPC_MODULE_TYPE_METADATA_SAVER,
EMPC_MODULE_TYPE_LAST,
} Empc_Module_Type;
typedef enum
{
EMPC_METADATA_TYPE_IMAGE,
EMPC_METADATA_TYPE_TEXT,
EMPC_METADATA_TYPE_LAST,
} Empc_Metadata_Type;
typedef struct Empc_Fetch_Request Empc_Fetch_Request;
typedef Empc_Module_Type (*Empc_Module_Type_Cb)(void);
@ -16,7 +22,7 @@ typedef void (*Empc_Module_Metadata_Save_Image_Cb)(Evas_Object *obj, const char
typedef void (*Empc_Module_Metadata_Save_Text_Cb)(const char *artist, const char *song, const char *text);
typedef Eina_Bool (*Empc_Module_Metadata_Fetch_Cb)(const Empc_Fetch_Request *);
typedef void (*Empc_Module_Metadata_Cancel_Cb)(const Empc_Fetch_Request *);
typedef void (*Empc_Module_Metadata_Fetch_Result_Cb)(Empc_Fetch_Request *, Evas_Object *img);
typedef void (*Empc_Module_Metadata_Fetch_Result_Cb)(void *, Empc_Fetch_Request *, Evas_Object *img);
struct Empc_Fetch_Request
{
@ -24,16 +30,7 @@ struct Empc_Fetch_Request
Eina_Stringshare *album;
Eina_Stringshare *song;
Evas_Object *obj;
Empc_Module_Metadata_Fetch_Result_Cb result;
Eina_Bool force : 1;
};
Evas_Object *bgselector_add(Evas_Object *parent);
void bgselector_image_add(Evas_Object *obj, Evas_Object *img);
void bgselector_next(Evas_Object *obj);
void bgselector_prev(Evas_Object *obj);
Evas_Object *bgselector_get(Evas_Object *obj);
void bgselector_clear(Evas_Object *obj);
void bgselector_prune(Evas_Object *obj);
void bgselector_stop(Evas_Object *obj);
void bgselector_active_set(Evas_Object *obj, Eina_Bool active);
void empc_metadata_fetch_done(Empc_Fetch_Request *req, Evas_Object *obj);

View File

@ -28,136 +28,61 @@ metadata_fetch_req_new(const char *artist, const char *album, const char *song)
return ireq;
}
static void
metadata_text_fetch_done(Empc_Fetch_Request *req, Evas_Object *lyric)
{
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
ireq->in_progress = 0;
INF("LYRIC RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!lyric);
if (!lyric)
{
if (req->force || (!ireq->count))
metadata_lyrics_fetch(ireq, NULL, NULL, NULL, req->force);
else
eina_hash_del_by_data(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_TEXT], req);
return;
}
//evas_object_smart_callback_add(lyric, "download,done", metadata_image_done, NULL);
if (ireq->count++) return;
lyrics_set(lyric);
eina_stringshare_del(evas_object_data_del(req->obj, "artist"));
evas_object_data_set(req->obj, "artist", eina_stringshare_ref(req->artist));
eina_stringshare_del(evas_object_data_del(req->obj, "title"));
evas_object_data_set(req->obj, "title", eina_stringshare_ref(req->song));
}
static void
metadata_image_fetch_done(Empc_Fetch_Request *req, Evas_Object *img)
{
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
ireq->in_progress = 0;
INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!img);
if (!img)
{
if (req->force || (!ireq->count))
metadata_image_fetch(ireq, NULL, NULL, NULL, req->force);
else
eina_hash_del_by_data(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], req);
return;
}
//evas_object_smart_callback_add(img, "download,done", metadata_image_done, NULL);
bgselector_image_add(req->obj, img);
if (ireq->count++) return;
eina_stringshare_del(evas_object_data_del(req->obj, "artist"));
evas_object_data_set(req->obj, "artist", eina_stringshare_ref(req->artist));
eina_stringshare_del(evas_object_data_del(req->obj, "album"));
evas_object_data_set(req->obj, "album", eina_stringshare_ref(req->album));
}
Empc_Fetch_Request *
metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album, Eina_Bool force)
static Empc_Fetch_Request *
metadata_fetch_continue(Empc_Fetch_Request_Internal *ireq, Empc_Metadata_Type type)
{
Empc_Module *mod;
char buf[2048];
Eina_Inlist *mods;
if (artist && (!artist[0]) && album && (!album[0])) return NULL; //fuck you
if (!ireq)
if (ireq->module)
{
snprintf(buf, sizeof(buf), "%s::%s", artist ?: "", album ?: "");
ireq = eina_hash_find(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], buf);
}
if (ireq)
{
if (ireq->in_progress) return NULL;
mods = EINA_INLIST_GET(ireq->module)->next;
ireq->module = NULL;
}
else
{
ireq = metadata_fetch_req_new(artist, album, NULL);
ireq->req.result = metadata_image_fetch_done;
ireq->req.obj = obj;
eina_hash_add(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], buf, ireq);
mods = empc_modules[EMPC_MODULE_TYPE_METADATA_IMAGE];
}
ireq->req.force = !!force;
mods = empc_modules[type];
EINA_INLIST_FOREACH(mods, mod)
{
Empc_Module_Metadata_Fetch *em = (Empc_Module_Metadata_Fetch*)mod;
if (!em->fetch((Empc_Fetch_Request*)ireq)) continue;
INF("COVER FETCH(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1);
INF("METADATA FETCH(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1);
ireq->module = mod;
ireq->in_progress = 1;
break;
}
if (ireq->module) return (void*)ireq;
eina_hash_del_by_key(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], buf);
return NULL;
return (ireq->module) ? (void*)ireq : NULL;
}
Empc_Fetch_Request *
metadata_lyrics_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *title, Eina_Bool force)
metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, Eina_Bool force, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data)
{
Empc_Module *mod;
Empc_Fetch_Request_Internal *ireq;
Empc_Fetch_Request *req;
char buf[2048];
Eina_Inlist *mods;
if (artist && (!artist[0]) && title && (!title[0])) return NULL; //fuck you
if (!ireq)
if (attr1 && (!attr1[0]) && attr2 && (!attr2[0])) return NULL; //fuck you
snprintf(buf, sizeof(buf), "%s::%s", attr1 ?: "", attr2 ?: "");
if (eina_hash_find(empc_metadata_fetch_reqs[type], buf)) return NULL;
switch (type)
{
snprintf(buf, sizeof(buf), "%s::%s", artist ?: "", title ?: "");
ireq = eina_hash_find(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_TEXT], buf);
}
if (ireq)
{
if (ireq->in_progress) return NULL;
mods = EINA_INLIST_GET(ireq->module)->next;
ireq->module = NULL;
}
else
{
ireq = metadata_fetch_req_new(artist, NULL, title);
ireq->req.result = metadata_text_fetch_done;
ireq->req.obj = obj;
eina_hash_add(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_TEXT], buf, ireq);
mods = empc_modules[EMPC_MODULE_TYPE_METADATA_TEXT];
}
ireq->req.force = !!force;
EINA_INLIST_FOREACH(mods, mod)
{
Empc_Module_Metadata_Fetch *em = (Empc_Module_Metadata_Fetch*)mod;
if (!em->fetch((Empc_Fetch_Request*)ireq)) continue;
INF("LYRIC FETCH(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1);
ireq->module = mod;
ireq->in_progress = 1;
case EMPC_METADATA_TYPE_IMAGE:
ireq = metadata_fetch_req_new(attr1, attr2, NULL);
break;
case EMPC_METADATA_TYPE_TEXT:
ireq = metadata_fetch_req_new(attr1, NULL, attr2);
break;
default: break;
}
if (ireq->module) return (void*)ireq;
eina_hash_del_by_key(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_TEXT], buf);
return NULL;
ireq->type = type;
ireq->req.obj = obj;
ireq->result = cb;
ireq->data = (void*)data;
ireq->req.force = !!force;
eina_hash_add(empc_metadata_fetch_reqs[type], buf, ireq);
req = metadata_fetch_continue(ireq, type);
if (!req) eina_hash_del_by_key(empc_metadata_fetch_reqs[type], buf);
return req;
}
void
@ -169,6 +94,46 @@ metadata_fetch_cancel(Empc_Fetch_Request *req)
if (!req) return;
if (!ireq->module) return;
em = (Empc_Module_Metadata_Fetch*)ireq->module;
if (em->cancel) em->cancel(req);
eina_hash_del_by_data(empc_metadata_fetch_reqs[ireq->module->type], req);
if (em->cancel)
{
em->cancel(req);
eina_hash_del_by_data(empc_metadata_fetch_reqs[ireq->module->type], req);
}
else
ireq->deleted = 1;
}
void
empc_metadata_fetch_done(Empc_Fetch_Request *req, Evas_Object *obj)
{
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
ireq->in_progress = 0;
switch (ireq->type)
{
case EMPC_METADATA_TYPE_IMAGE:
INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!obj);
break;
case EMPC_METADATA_TYPE_TEXT:
INF("LYRIC RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!obj);
break;
default: break;
}
if (obj && ireq->deleted)
{
evas_object_del(obj);
return;
}
if (!obj)
{
if ((!ireq->deleted) && (req->force || (!ireq->count)))
metadata_fetch_continue(ireq, ireq->type);
else
eina_hash_del_by_data(empc_metadata_fetch_reqs[ireq->module->type], req);
return;
}
//evas_object_smart_callback_add(img, "download,done", metadata_image_done, NULL);
ireq->count++;
ireq->result(ireq->data, req, obj);
}

View File

@ -43,17 +43,31 @@ typedef struct Empc_Fetch_Request_Internal
{
Empc_Fetch_Request req;
Empc_Module *module;
Empc_Module_Metadata_Fetch_Result_Cb result;
Empc_Metadata_Type type;
void *data;
unsigned int count;
Eina_Bool in_progress : 1;
Eina_Bool deleted : 1;
} Empc_Fetch_Request_Internal;
extern int empc_log_dom;
extern Eina_Inlist *empc_modules[];
extern Eina_Hash *empc_metadata_fetch_reqs[];
Empc_Fetch_Request *metadata_lyrics_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *title, Eina_Bool force);
Empc_Fetch_Request *metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album, Eina_Bool force);
Empc_Fetch_Request *metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, Eina_Bool force, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
void metadata_fetch_cancel(Empc_Fetch_Request *req);
void lyrics_set(Evas_Object *obj);
Evas_Object *bgselector_add(Evas_Object *parent);
void bgselector_image_add(Evas_Object *obj, Evas_Object *img);
void bgselector_next(Evas_Object *obj);
void bgselector_prev(Evas_Object *obj);
Evas_Object *bgselector_get(Evas_Object *obj);
void bgselector_clear(Evas_Object *obj);
void bgselector_prune(Evas_Object *obj);
void bgselector_stop(Evas_Object *obj);
void bgselector_active_set(Evas_Object *obj, Eina_Bool active);
void bgselector_info_set(Evas_Object *obj, Eina_Stringshare *artist, Eina_Stringshare *album);
Eina_Stringshare *bgselector_artist_get(Evas_Object *obj);
Eina_Stringshare *bgselector_album_get(Evas_Object *obj);

View File

@ -36,8 +36,9 @@ _loader_fetch(Empc_Fetch_Request *req)
o = elm_image_add(req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_file_set(o, eet_file_get(ef), buf);
empc_metadata_fetch_done(req, o);
}
req->result(req, o);
empc_metadata_fetch_done(req, NULL);
}
EAPI Eina_Bool
@ -49,7 +50,7 @@ empc_module_metadata_fetch(const Empc_Fetch_Request *req)
EAPI Empc_Module_Type
empc_module_type(void)
{
return EMPC_MODULE_TYPE_METADATA_IMAGE;
return EMPC_MODULE_TYPE_METADATA_FETCH;
}
EAPI int
@ -59,7 +60,7 @@ empc_module_priority(void)
}
static Eina_Bool
eet_saver_init(void)
eet_loader_init(void)
{
char buf[PATH_MAX];
@ -70,11 +71,11 @@ eet_saver_init(void)
}
static void
eet_saver_shutdown(void)
eet_loader_shutdown(void)
{
eet_close(ef);
eet_shutdown();
}
EINA_MODULE_INIT(eet_saver_init);
EINA_MODULE_SHUTDOWN(eet_saver_shutdown);
EINA_MODULE_INIT(eet_loader_init);
EINA_MODULE_SHUTDOWN(eet_loader_shutdown);

View File

@ -36,6 +36,7 @@ empc_module_metadata_save_image(Evas_Object *obj, const char *artist, const char
img = evas_object_image_data_get(o, EINA_FALSE);
evas_object_image_size_get(o, &w, &h);
eet_data_image_write(ef_img, buf, img, w, h, 0, 1, 100, 0);
eet_sync(ef_img);
}
EAPI void
@ -56,6 +57,7 @@ empc_module_metadata_save_text(const char *artist, const char *song, const char
}
snprintf(buf, sizeof(buf), "%s:::%s", a ?: "", b ?: "");
eet_write(ef_lyr, buf, text, strlen(text) + 1, 1);
eet_sync(ef_lyr);
}
EAPI Empc_Module_Type

View File

@ -37,7 +37,7 @@ result_cb(Elyr_Req *eq, Excetra_Req *ereq, const char *lyric)
{
if (excetra_req_is_instrumental(ereq) || (!eq->ereqs))
{
eq->req->result(eq->req, NULL);
empc_metadata_fetch_done(eq->req, NULL);
reqs = eina_list_remove(reqs, eq);
elyr_req_free(eq);
}
@ -53,9 +53,9 @@ result_cb(Elyr_Req *eq, Excetra_Req *ereq, const char *lyric)
txt = elm_entry_utf8_to_markup(lyric);
elm_entry_entry_set(o, txt);
free(txt);
eq->req->result(eq->req, o);
empc_metadata_fetch_done(eq->req, o);
if (eq->ereqs && (!eq->req->force)) return;
eq->req->result(eq->req, NULL);
empc_metadata_fetch_done(eq->req, NULL);
reqs = eina_list_remove(reqs, eq);
elyr_req_free(eq);
}
@ -135,7 +135,7 @@ empc_module_metadata_fetch(const Empc_Fetch_Request *req)
EAPI Empc_Module_Type
empc_module_type(void)
{
return EMPC_MODULE_TYPE_METADATA_TEXT;
return EMPC_MODULE_TYPE_METADATA_FETCH;
}
EAPI int

View File

@ -84,7 +84,7 @@ exe_data(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Exe_Event_Data *ev)
o = elm_image_add(req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_file_set(o, el->line, NULL);
req->result(req, o);
empc_metadata_fetch_done(req, o);
}
return ECORE_CALLBACK_DONE;
}
@ -103,7 +103,7 @@ exe_del(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Exe_Event_Del *ev)
exes = eina_list_remove_list(exes, l);
if ((!tag) || strcmp(tag, "glyr")) return ECORE_CALLBACK_DONE;
req = ecore_exe_data_get(ev->exe);
req->result(req, NULL);
empc_metadata_fetch_done(req, NULL);
return ECORE_CALLBACK_DONE;
}
@ -152,7 +152,7 @@ empc_module_metadata_fetch(const Empc_Fetch_Request *req)
EAPI Empc_Module_Type
empc_module_type(void)
{
return EMPC_MODULE_TYPE_METADATA_IMAGE;
return EMPC_MODULE_TYPE_METADATA_FETCH;
}
EAPI int

View File

@ -116,13 +116,13 @@ glyr_gmpc_result_cb(Esql_Res *res, Empc_Fetch_Request *req)
o = elm_image_add(req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_memfile_set(o, (void*)blob.memory, blob.size, NULL, NULL);
req->result(req, o);
req->result(req, NULL);
empc_metadata_fetch_done(req, o);
empc_metadata_fetch_done(req, NULL);
eina_value_flush(&tmp);
break;
}
}
req->result(req, NULL);
empc_metadata_fetch_done(req, NULL);
}
eina_iterator_free(it);
}
@ -163,7 +163,7 @@ empc_module_metadata_fetch(const Empc_Fetch_Request *req)
EAPI Empc_Module_Type
empc_module_type(void)
{
return EMPC_MODULE_TYPE_METADATA_IMAGE;
return EMPC_MODULE_TYPE_METADATA_FETCH;
}
EAPI int