add global meta image url fetcher, correctly duplicate metadata objects for subreqs

This commit is contained in:
zmike 2014-02-22 13:47:13 -05:00
parent 8f65bd1bca
commit 635a780747
9 changed files with 206 additions and 63 deletions

View File

@ -129,11 +129,14 @@ bg_downloaded(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
void
bg_add(void *data EINA_UNUSED, Empc_Fetch_Request *req, Evas_Object *obj)
{
Evas_Object *parent;
if (!obj) return;
bgselector_image_add(req->obj, obj);
parent = elm_object_parent_widget_get(obj);
bgselector_image_add(parent, obj);
if (!bgchooser)
{
evas_object_smart_callback_add(obj, "download,done", bg_downloaded, req->obj);
evas_object_smart_callback_add(obj, "download,done", bg_downloaded, parent);
save_image(obj, req->artist, req->album);
}
}

View File

@ -29,10 +29,11 @@ struct Empc_Fetch_Request
Eina_Stringshare *artist;
Eina_Stringshare *album;
Eina_Stringshare *song;
Evas_Object *obj;
Empc_Metadata_Type type;
Eina_Bool force : 1;
};
void empc_metadata_fetch_done(Empc_Fetch_Request *req, Evas_Object *obj);
Evas_Object *empc_metadata_entry_add(Evas_Object *parent);
void empc_metadata_fetch_done(Empc_Fetch_Request *req, Eina_List *l);
Eina_List *empc_metadata_entries_add(Empc_Fetch_Request *req);
Eina_List *empc_metadata_images_add(Empc_Fetch_Request *req);
void empc_metadata_image_download(Empc_Fetch_Request *req, const char *url);

View File

@ -1,5 +1,86 @@
#include "empc_private.h"
typedef struct Metadata_Image
{
EINA_INLIST;
Ecore_Con_Url *url;
Eina_Binbuf *buf;
Empc_Fetch_Request_Internal *ireq;
} Metadata_Image;
static Eina_List *handlers = NULL;
static Eina_List *image_reqs = NULL;
static void
metadata_image_done(Metadata_Image *m)
{
Eina_File *f;
Eina_List *l, *ll, *lll;
Evas_Object *o;
m->ireq->urls = eina_inlist_remove(m->ireq->urls, EINA_INLIST_GET(m));
f = eina_file_virtualize(ecore_con_url_url_get(m->url),
eina_binbuf_string_steal(m->buf), eina_binbuf_length_get(m->buf),
EINA_FALSE);
l = empc_metadata_images_add((void*)m->ireq);
EINA_LIST_FOREACH_SAFE(l, ll, lll, o)
{
if (!elm_image_mmap_set(o, f, NULL))
{
evas_object_del(o);
l = eina_list_remove_list(l, ll);
}
}
if (l)
empc_metadata_fetch_done((void*)m->ireq, l);
eina_file_close(f);
eina_binbuf_free(m->buf);
if (!m->ireq->urls)
empc_metadata_fetch_done((void*)m->ireq, NULL);
free(m);
}
static Metadata_Image *
metadata_image_new(Empc_Fetch_Request_Internal *ireq, const char *url)
{
Metadata_Image *m;
m = calloc(1, sizeof(Metadata_Image));
m->ireq = ireq;
ireq->urls = eina_inlist_append(ireq->urls, EINA_INLIST_GET(m));
m->url = ecore_con_url_new(url);
m->buf = eina_binbuf_new();
image_reqs = eina_list_append(image_reqs, m->url);
ecore_con_url_data_set(m->url, m);
ecore_con_url_get(m->url);
return m;
}
static Eina_Bool
metadata_data_cb(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Con_Event_Url_Data *ev)
{
Metadata_Image *m;
if ((!image_reqs) || (!eina_list_data_find(image_reqs, ev->url_con))) return ECORE_CALLBACK_RENEW;
m = ecore_con_url_data_get(ev->url_con);
eina_binbuf_append_length(m->buf, ev->data, ev->size);
return ECORE_CALLBACK_DONE;
}
static Eina_Bool
metadata_done_cb(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Con_Event_Url_Complete *ev)
{
Metadata_Image *m;
if ((!image_reqs) || (!eina_list_data_find(image_reqs, ev->url_con))) return ECORE_CALLBACK_RENEW;
m = ecore_con_url_data_get(ev->url_con);
image_reqs = eina_list_remove(image_reqs, ev->url_con);
ecore_con_url_free(ev->url_con);
metadata_image_done(m);
return ECORE_CALLBACK_DONE;
}
static Empc_Fetch_Request_Internal *
metadata_fetch_req_new(const char *artist, const char *album, const char *song)
{
@ -78,11 +159,11 @@ metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr
default: break;
}
ireq->req.type = type;
ireq->req.obj = obj;
res = malloc(sizeof(Empc_Metadata_Result_Cb));
res->cb = cb;
res->data = (void*)data;
res->force = force;
res->obj = obj;
ireq->results = eina_list_append(ireq->results, res);
ireq->req.force = !!force;
eina_hash_add(empc_metadata_fetch_reqs[type], buf, ireq);
@ -119,32 +200,34 @@ metadata_fetch_cancel(Empc_Fetch_Request *req, Empc_Module_Metadata_Fetch_Result
void
empc_metadata_fetch_done(Empc_Fetch_Request *req, Evas_Object *obj)
empc_metadata_fetch_done(Empc_Fetch_Request *req, Eina_List *l)
{
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
Empc_Metadata_Result_Cb *res;
Eina_List *l, *ll;
Eina_List *ll, *lll;
ireq->in_progress = 0;
ireq->in_progress = (!!l) || (!!ireq->urls);
switch (ireq->req.type)
{
case EMPC_METADATA_TYPE_IMAGE:
INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!obj);
INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, eina_list_count(l));
break;
case EMPC_METADATA_TYPE_TEXT:
INF("LYRIC RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, !!obj);
INF("LYRIC RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, eina_list_count(l));
break;
default: break;
}
if (obj && ireq->deleted)
if (l && ireq->deleted)
{
evas_object_del(obj);
E_FREE_LIST(l, evas_object_del);
return;
}
if (!obj)
if (!l)
{
Eina_Bool del = EINA_TRUE;
if (ireq->urls) return;
if ((!ireq->deleted) && (req->force || (!ireq->count)))
del = !metadata_fetch_continue(ireq);
if (del)
@ -163,26 +246,70 @@ empc_metadata_fetch_done(Empc_Fetch_Request *req, Evas_Object *obj)
}
//evas_object_smart_callback_add(img, "download,done", metadata_image_done, NULL);
ireq->count++;
EINA_LIST_FOREACH_SAFE(ireq->results, l, ll, res)
EINA_LIST_FOREACH_SAFE(ireq->results, ll, lll, res)
{
res->cb(res->data, req, obj);
Evas_Object *o;
o = eina_list_data_get(l);
if (elm_object_parent_widget_get(o) != res->obj) continue;
res->cb(res->data, req, o);
l = eina_list_remove_list(l, l);
if (res->force) continue;
ireq->results = eina_list_remove_list(ireq->results, l);
ireq->results = eina_list_remove_list(ireq->results, ll);
free(res);
}
eina_list_free(l);
}
Evas_Object *
empc_metadata_entry_add(Evas_Object *parent)
Eina_List *
empc_metadata_entries_add(Empc_Fetch_Request *req)
{
Evas_Object *o;
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
Empc_Metadata_Result_Cb *res;
Eina_List *l, *ret = NULL;
o = elm_entry_add(parent);
elm_scroller_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
elm_entry_editable_set(o, 0);
elm_entry_single_line_set(o, 0);
elm_entry_scrollable_set(o, 1);
elm_object_focus_allow_set(o, 0);
elm_entry_line_wrap_set(o, ELM_WRAP_MIXED);
return o;
if (ireq->deleted) return NULL;
EINA_LIST_FOREACH(ireq->results, l, res)
{
Evas_Object *o;
o = elm_entry_add(res->obj);
elm_scroller_policy_set(o, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
elm_entry_editable_set(o, 0);
elm_entry_single_line_set(o, 0);
elm_entry_scrollable_set(o, 1);
elm_object_focus_allow_set(o, 0);
elm_entry_line_wrap_set(o, ELM_WRAP_MIXED);
}
return ret;
}
Eina_List *
empc_metadata_images_add(Empc_Fetch_Request *req)
{
Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req;
Empc_Metadata_Result_Cb *res;
Eina_List *l, *ret = NULL;
if (ireq->deleted) return NULL;
EINA_LIST_FOREACH(ireq->results, l, res)
{
Evas_Object *o;
o = elm_image_add(res->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
ret = eina_list_append(ret, o);
}
return ret;
}
void
empc_metadata_image_download(Empc_Fetch_Request *req, const char *url)
{
if (!handlers)
{
E_LIST_HANDLER_APPEND(handlers, ECORE_CON_EVENT_URL_DATA, metadata_data_cb, NULL);
E_LIST_HANDLER_APPEND(handlers, ECORE_CON_EVENT_URL_COMPLETE, metadata_done_cb, NULL);
}
metadata_image_new((void*)req, url);
}

View File

@ -43,6 +43,7 @@ typedef struct Empc_Metadata_Result_Cb
{
Empc_Module_Metadata_Fetch_Result_Cb cb;
void *data;
Evas_Object *obj;
Eina_Bool force : 1;
} Empc_Metadata_Result_Cb;
@ -51,6 +52,7 @@ typedef struct Empc_Fetch_Request_Internal
Empc_Fetch_Request req;
Empc_Module *module;
Eina_List *results; //Empc_Metadata_Result_Cb
Eina_Inlist *urls; // Metadata_Image
unsigned int count;
Eina_Bool in_progress : 1;
Eina_Bool deleted : 1;

View File

@ -76,14 +76,19 @@ _loader_fetch(Empc_Fetch_Request *req)
free(eet_list(ef, buf, &num));
if (num)
{
Eina_List *l, *ll, *lll;
if (req->type == EMPC_METADATA_TYPE_IMAGE)
{
o = elm_image_add(req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
if (!elm_image_file_set(o, eet_file_get(ef_img), buf))
l = empc_metadata_images_add(req);
EINA_LIST_FOREACH_SAFE(l, ll, lll, o)
{
evas_object_del(o);
o = NULL;
evas_object_data_set(o, "__empc_nosave", (void*)1);
if (!elm_image_file_set(o, eet_file_get(ef_img), buf))
{
evas_object_del(o);
l = eina_list_remove_list(l, ll);
}
}
eet_close(ef_img);
ef_img = NULL;
@ -93,18 +98,19 @@ _loader_fetch(Empc_Fetch_Request *req)
void *txt;
txt = eet_read(ef_lyr, buf, &num);
o = empc_metadata_entry_add(req->obj);
elm_entry_entry_set(o, txt);
l = empc_metadata_entries_add(req);
EINA_LIST_FOREACH_SAFE(l, ll, lll, o)
{
evas_object_data_set(o, "__empc_nosave", (void*)1);
elm_entry_entry_set(o, txt);
}
free(txt);
eet_close(ef_lyr);
ef_lyr = NULL;
}
if (o)
{
evas_object_data_set(o, "__empc_nosave", (void*)1);
empc_metadata_fetch_done(req, o);
}
if (l)
empc_metadata_fetch_done(req, l);
}
end:
empc_metadata_fetch_done(req, NULL);

View File

@ -30,6 +30,7 @@ static void
result_cb(Elyr_Req *eq, Excetra_Req *ereq, const char *lyric)
{
Evas_Object *o;
Eina_List *l, *ll;
char *txt;
eq->ereqs = eina_list_remove(eq->ereqs, ereq);
@ -43,11 +44,12 @@ result_cb(Elyr_Req *eq, Excetra_Req *ereq, const char *lyric)
}
return;
}
o = empc_metadata_entry_add(eq->req->obj);
l = empc_metadata_entries_add(eq->req);
txt = elm_entry_utf8_to_markup(lyric);
elm_entry_entry_set(o, txt);
EINA_LIST_FOREACH(l, ll, o)
elm_entry_entry_set(o, txt);
free(txt);
empc_metadata_fetch_done(eq->req, o);
empc_metadata_fetch_done(eq->req, l);
if (eq->ereqs && (!eq->req->force)) return;
empc_metadata_fetch_done(eq->req, NULL);
reqs = eina_list_remove(reqs, eq);

View File

@ -77,14 +77,9 @@ exe_data(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Exe_Event_Data *ev)
req = ecore_exe_data_get(ev->exe);
for (el = ev->lines; el && el->line ; el++)
{
Evas_Object *o;
if (el->line[0] != 'h') continue;
if (strncmp(el->line, "http", 4)) continue;
o = elm_image_add(req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_file_set(o, el->line, NULL);
empc_metadata_fetch_done(req, o);
empc_metadata_image_download(req, el->line);
}
return ECORE_CALLBACK_DONE;
}

View File

@ -112,12 +112,25 @@ glyr_gmpc_result_cb(Esql_Res *res, Empc_Fetch_Request *req)
if (eina_value_pget(&tmp, &blob))
{
Evas_Object *o;
Eina_List *l, *ll, *lll;
Eina_File *f;
char buf[1024];
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);
empc_metadata_fetch_done(req, o);
snprintf(buf, sizeof(buf), "%s::%s", req->artist, req->album);
f = eina_file_virtualize(buf, blob.memory, blob.size, EINA_FALSE);
l = empc_metadata_images_add(req);
EINA_LIST_FOREACH_SAFE(l, ll, lll, o)
{
if (!elm_image_mmap_set(o, f, NULL))
{
evas_object_del(o);
l = eina_list_remove_list(l, ll);
}
}
if (l)
empc_metadata_fetch_done(req, l);
empc_metadata_fetch_done(req, NULL);
eina_file_close(f);
eina_value_flush(&tmp);
break;
}

View File

@ -21,24 +21,18 @@ typedef struct GImage_Data
size_t size;
} GImage_Data;
static void
gnotify(GImage_Data *gi, Ecore_Thread *eth EINA_UNUSED, char *url)
{
Evas_Object *o;
o = elm_image_add(gi->req->obj);
elm_image_fill_outside_set(o, EINA_FALSE);
elm_image_file_set(o, url, NULL);
empc_metadata_fetch_done(gi->req, o);
empc_metadata_image_download(gi->req, url);
free(url);
}
static void
gend(GImage_Data *gi, Ecore_Thread *eth EINA_UNUSED)
{
empc_metadata_fetch_done(gi->req, NULL);
eina_strbuf_free(gi->data);
empc_metadata_fetch_done(gi->req, NULL);
free(gi);
}
@ -89,7 +83,7 @@ gdata(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Con_Event_Url_Data *ev)
//fprintf(stderr, "%*s\n", ev->size, ev->data);
gi = ecore_con_url_data_get(ev->url_con);
gi->size += ev->size;
if (gi->size < SEARCH_OFFSET) return ECORE_CALLBACK_RENEW;
if (gi->size < SEARCH_OFFSET) return ECORE_CALLBACK_DONE;
eina_strbuf_append_length(gi->data, (char*)&ev->data[0], ev->size);
return ECORE_CALLBACK_DONE;
@ -125,7 +119,7 @@ empc_module_metadata_fetch(const Empc_Fetch_Request *req)
url = ecore_con_url_new(buf);
ecore_con_url_additional_header_add(url, "user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0");
ecore_con_url_get(url);
gi = malloc(sizeof(GImage_Data));
gi = calloc(1, sizeof(GImage_Data));
gi->req = (void*)req;
gi->data = eina_strbuf_new();
ecore_con_url_data_set(url, gi);