redo metadata fetch api, unify text+image fetchers, add album images to headers
This commit is contained in:
parent
c46f14b7f6
commit
a267849566
|
@ -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"
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
128
src/bin/empc.c
128
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue