add global meta image url fetcher, correctly duplicate metadata objects for subreqs
This commit is contained in:
parent
8f65bd1bca
commit
635a780747
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
res->cb(res->data, req, obj);
|
||||
if (res->force) continue;
|
||||
ireq->results = eina_list_remove_list(ireq->results, l);
|
||||
free(res);
|
||||
}
|
||||
}
|
||||
|
||||
Evas_Object *
|
||||
empc_metadata_entry_add(Evas_Object *parent)
|
||||
EINA_LIST_FOREACH_SAFE(ireq->results, ll, lll, res)
|
||||
{
|
||||
Evas_Object *o;
|
||||
|
||||
o = elm_entry_add(parent);
|
||||
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, ll);
|
||||
free(res);
|
||||
}
|
||||
eina_list_free(l);
|
||||
}
|
||||
|
||||
Eina_List *
|
||||
empc_metadata_entries_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_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 o;
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
l = empc_metadata_images_add(req);
|
||||
EINA_LIST_FOREACH_SAFE(l, ll, lll, o)
|
||||
{
|
||||
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);
|
||||
o = NULL;
|
||||
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);
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue