diff --git a/data/themes/empc.edc b/data/themes/empc.edc index 5aecd67..9e48d0d 100644 --- a/data/themes/empc.edc +++ b/data/themes/empc.edc @@ -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" diff --git a/src/bin/bgselector.c b/src/bin/bgselector.c index 9f0ccb0..dbe2fbf 100644 --- a/src/bin/bgselector.c +++ b/src/bin/bgselector.c @@ -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; +} diff --git a/src/bin/empc.c b/src/bin/empc.c index 123bf89..5dc388a 100644 --- a/src/bin/empc.c +++ b/src/bin/empc.c @@ -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); diff --git a/src/bin/empc.h b/src/bin/empc.h index 32ae2b2..8891e8b 100644 --- a/src/bin/empc.h +++ b/src/bin/empc.h @@ -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); diff --git a/src/bin/empc_metadata.c b/src/bin/empc_metadata.c index 2b6bfb8..5a440c4 100644 --- a/src/bin/empc_metadata.c +++ b/src/bin/empc_metadata.c @@ -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); } diff --git a/src/bin/empc_private.h b/src/bin/empc_private.h index ba9c9ec..573b432 100644 --- a/src/bin/empc_private.h +++ b/src/bin/empc_private.h @@ -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); diff --git a/src/modules/eet_loader.c b/src/modules/eet_loader.c index 3c021d8..c9ca0df 100644 --- a/src/modules/eet_loader.c +++ b/src/modules/eet_loader.c @@ -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); diff --git a/src/modules/eet_saver.c b/src/modules/eet_saver.c index 77e51c4..08f6a5b 100644 --- a/src/modules/eet_saver.c +++ b/src/modules/eet_saver.c @@ -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 diff --git a/src/modules/elyr.c b/src/modules/elyr.c index 4a1e3e2..fda05cc 100644 --- a/src/modules/elyr.c +++ b/src/modules/elyr.c @@ -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 diff --git a/src/modules/glyr.c b/src/modules/glyr.c index c71465a..1cf1710 100644 --- a/src/modules/glyr.c +++ b/src/modules/glyr.c @@ -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 diff --git a/src/modules/glyr_gmpc.c b/src/modules/glyr_gmpc.c index 32d9cf9..6e2d831 100644 --- a/src/modules/glyr_gmpc.c +++ b/src/modules/glyr_gmpc.c @@ -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