diff --git a/configure.ac b/configure.ac index 0f909bf..91bbb38 100644 --- a/configure.ac +++ b/configure.ac @@ -103,6 +103,12 @@ if test -n "$want_glyr" ; then fi AM_CONDITIONAL([MOD_GLYR], [test "x$want_glyr" = "xyes"]) +want_eet_saver=yes +AC_ARG_ENABLE([module-eet-saver], + [AC_HELP_STRING([--disable-module-eet-saver], [disable eet-saver module. @<:@default=detect@:>@])], + [want_eet_saver=$enableval], []) +AM_CONDITIONAL([MOD_EET_SAVER], [test "x$want_eet_saver" = "xyes"]) + ######################################## case "$host_os" in @@ -159,6 +165,7 @@ cat << MODULES_EOF Modules: * glyr_gmpc...........: $want_glyr_gmpc * glyr................: $want_glyr + * eet_saver...........: $want_eet_saver MODULES_EOF echo diff --git a/src/bin/empc.c b/src/bin/empc.c index 65c47b4..57e8131 100644 --- a/src/bin/empc.c +++ b/src/bin/empc.c @@ -10,7 +10,7 @@ #include "empc.h" #include "empc_parts.h" -#define EMPC_METADATA_TYPE_COUNT 1 +#define EMPC_METADATA_TYPE_COUNT 3 #define DBG(...) EINA_LOG_DOM_DBG(empc_log_dom, __VA_ARGS__) #define INF(...) EINA_LOG_DOM_INFO(empc_log_dom, __VA_ARGS__) @@ -42,11 +42,18 @@ typedef struct Empc_Module Eina_Module *module; } Empc_Module; -typedef struct Empc_Module_Metadata +typedef struct Empc_Module_Metadata_Fetch { Empc_Module module; Empc_Module_Metadata_Fetch_Cb fetch; -} Empc_Module_Metadata; +} Empc_Module_Metadata_Fetch; + +typedef struct Empc_Module_Metadata_Save +{ + Empc_Module module; + Empc_Module_Metadata_Save_Image_Cb save_image; + Empc_Module_Metadata_Save_Image_Cb save_text; +} Empc_Module_Metadata_Save; typedef struct Empc_Fetch_Request_Internal { @@ -95,10 +102,12 @@ static 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), + [EMPC_MODULE_TYPE_METADATA_IMAGE] = sizeof(Empc_Module_Metadata_Fetch), + [EMPC_MODULE_TYPE_METADATA_TEXT] = sizeof(Empc_Module_Metadata_Fetch), + [EMPC_MODULE_TYPE_METADATA_SAVER] = sizeof(Empc_Module_Metadata_Save), }; -static Eina_Bool empc_metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album); +static Eina_Bool metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album); static inline unsigned char bg_next_get(void) @@ -288,7 +297,7 @@ songid_update(int songid) } static Empc_Fetch_Request_Internal * -empc_metadata_fetch_req_new(const char *artist, const char *album, const char *song) +metadata_fetch_req_new(const char *artist, const char *album, const char *song) { Empc_Fetch_Request_Internal *ireq; @@ -299,8 +308,21 @@ empc_metadata_fetch_req_new(const char *artist, const char *album, const char *s return ireq; } +static void +metadata_image_done(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Empc_Module *mod; + + EINA_INLIST_FOREACH(empc_modules[EMPC_MODULE_TYPE_METADATA_SAVER], mod) + { + Empc_Module_Metadata_Save *es = (Empc_Module_Metadata_Save *)mod; + INF("IMAGE SAVE(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1); + es->save_image(obj); + } +} + void -empc_cover_done(Empc_Fetch_Request *req, Eina_Bool success) +metadata_image_fetch_done(Empc_Fetch_Request *req, Eina_Bool success) { Empc_Fetch_Request_Internal *ireq = (Empc_Fetch_Request_Internal*)req; @@ -308,7 +330,7 @@ empc_cover_done(Empc_Fetch_Request *req, Eina_Bool success) INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, success); if (!success) { - empc_metadata_image_fetch((void*)req, NULL, NULL, NULL); + metadata_image_fetch((void*)req, NULL, NULL, NULL); return; } eina_stringshare_del(evas_object_data_del(req->obj, "artist")); @@ -320,7 +342,7 @@ empc_cover_done(Empc_Fetch_Request *req, Eina_Bool success) } static Eina_Bool -empc_metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album) +metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, const char *artist, const char *album) { Empc_Module *mod; char buf[2048]; @@ -340,15 +362,15 @@ empc_metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, c } else { - ireq = empc_metadata_fetch_req_new(artist, album, NULL); - ireq->req.result = empc_cover_done; + 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]; } EINA_INLIST_FOREACH(mods, mod) { - Empc_Module_Metadata *em = (Empc_Module_Metadata*)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); ireq->module = mod; @@ -388,7 +410,7 @@ empc_current_song(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_CurrentSong_ title_update(); /* always fetch on first run */ if (!palbum) - empc_metadata_image_fetch(NULL, bg[background_num], empd_song_artist, empd_song_album); + metadata_image_fetch(NULL, bg[background_num], empd_song_artist, empd_song_album); /* check for update fails */ else if (artist || album) { @@ -397,7 +419,7 @@ empc_current_song(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_CurrentSong_ o = bg[bg_next_get()]; if ((empd_song_artist != evas_object_data_get(o, "artist")) || (empd_song_album != evas_object_data_get(o, "album"))) - empc_metadata_image_fetch(NULL, o, empd_song_artist, empd_song_album); + metadata_image_fetch(NULL, o, empd_song_artist, empd_song_album); } elm_object_part_text_set(layout, EMPC_BASE_TEXT_ARTIST, empd_song_artist); @@ -432,7 +454,7 @@ empc_status(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_Status_Data *ev) { o = bg[bg_next_get()]; if ((so->artist != evas_object_data_get(o, "artist")) || (so->album != evas_object_data_get(o, "album"))) - empc_metadata_image_fetch(NULL, o, so->artist, so->album); + metadata_image_fetch(NULL, o, so->artist, so->album); } } if (empd_song_item && queue_list_state) @@ -785,11 +807,19 @@ module_check(Eina_Module *m, void *d EINA_UNUSED) { case EMPC_MODULE_TYPE_METADATA_IMAGE: { - Empc_Module_Metadata *em = (Empc_Module_Metadata*)mod; + Empc_Module_Metadata_Fetch *em = (Empc_Module_Metadata_Fetch*)mod; em->fetch = eina_module_symbol_get(m, "empc_module_metadata_fetch"); break; } + case EMPC_MODULE_TYPE_METADATA_SAVER: + { + Empc_Module_Metadata_Save *es = (Empc_Module_Metadata_Save*)mod; + + es->save_image = eina_module_symbol_get(m, "empc_module_metadata_save_image"); + es->save_text = eina_module_symbol_get(m, "empc_module_metadata_save_text"); + break; + } default: break; } INF("MODULE LOAD(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1); @@ -896,6 +926,7 @@ main(int argc, char *argv[]) for (i = 0; i < 2; i++) { bg[i] = elm_image_add(win); + evas_object_smart_callback_add(bg[i], "download,done", metadata_image_done, NULL); elm_image_fill_outside_set(bg[i], EINA_FALSE); evas_object_show(bg[i]); } diff --git a/src/bin/empc.h b/src/bin/empc.h index 0719bf4..21533bf 100644 --- a/src/bin/empc.h +++ b/src/bin/empc.h @@ -3,6 +3,8 @@ typedef enum { EMPC_MODULE_TYPE_METADATA_IMAGE, + EMPC_MODULE_TYPE_METADATA_TEXT, + EMPC_MODULE_TYPE_METADATA_SAVER, EMPC_MODULE_TYPE_LAST, } Empc_Module_Type; @@ -10,6 +12,7 @@ typedef struct Empc_Fetch_Request Empc_Fetch_Request; typedef Empc_Module_Type (*Empc_Module_Type_Cb)(void); typedef int (*Empc_Module_Priority_Cb)(void); +typedef void (*Empc_Module_Metadata_Save_Image_Cb)(Evas_Object *obj); typedef Eina_Bool (*Empc_Module_Metadata_Fetch_Cb)(const Empc_Fetch_Request *); typedef void (*Empc_Module_Metadata_Fetch_Result_Cb)(Empc_Fetch_Request *, Eina_Bool success); diff --git a/src/modules/Makefile.mk b/src/modules/Makefile.mk index 21b8f62..ecef522 100644 --- a/src/modules/Makefile.mk +++ b/src/modules/Makefile.mk @@ -53,3 +53,27 @@ src_modules_glyr_la_LDFLAGS = -module -avoid-version src_modules_glyr_la_LIBTOOLFLAGS = --tag=disable-static endif + + +if MOD_EET_SAVER +mod_LTLIBRARIES += src/modules/eet_saver.la + +src_modules_eet_saver_la_SOURCES = \ +src/modules/eet_saver.c + +src_modules_eet_saver_la_CPPFLAGS = \ +$(AM_CFLAGS) \ +$(mod_cppflags) \ +@EFL_CFLAGS@ \ +@ELM_CFLAGS@ \ +-I$(top_srcdir)/src/bin \ +-I$(top_builddir) + +src_modules_eet_saver_la_LIBADD = \ +@EFL_LIBS@ \ +@ELM_LIBS@ + +src_modules_eet_saver_la_LDFLAGS = -module -avoid-version + +src_modules_eet_saver_la_LIBTOOLFLAGS = --tag=disable-static +endif diff --git a/src/modules/eet_saver.c b/src/modules/eet_saver.c new file mode 100644 index 0000000..dce7339 --- /dev/null +++ b/src/modules/eet_saver.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "empdd.h" +#include "empc.h" +#include +#include +#include +#include + +static Eet_File *ef = NULL; + +EAPI void +empc_module_metadata_save_image(Evas_Object *obj) +{ + Evas_Object *o; + void *img; + int w, h; + char buf[4096]; + Eina_Stringshare *artist, *album; + char *a, *b; + + artist = evas_object_data_get(obj, "artist"); + if (artist) + { + a = strdupa(artist); + eina_str_tolower(&a); + } + album = evas_object_data_get(obj, "album"); + if (album) + { + b = strdupa(album); + eina_str_tolower(&b); + } + snprintf(buf, sizeof(buf), "%s:::%s", a ?: "", b ?: ""); + o = elm_image_object_get(obj); + img = evas_object_image_data_get(o, EINA_FALSE); + evas_object_image_size_get(o, &w, &h); + eet_data_image_write(ef, buf, img, w, h, 0, 1, 100, 0); +} + +EAPI Empc_Module_Type +empc_module_type(void) +{ + return EMPC_MODULE_TYPE_METADATA_SAVER; +} + +EAPI int +empc_module_priority(void) +{ + return 50; +} + +static Eina_Bool +eet_saver_init(void) +{ + char buf[PATH_MAX]; + + eet_init(); + snprintf(buf, sizeof(buf), "%s/empc/metadata/images.eet", efreet_cache_home_get()); + ef = eet_open(buf, EET_FILE_MODE_WRITE); + return EINA_TRUE; +} + +static void +eet_saver_shutdown(void) +{ + eet_close(ef); + eet_shutdown(); +} + +EINA_MODULE_INIT(eet_saver_init); +EINA_MODULE_SHUTDOWN(eet_saver_shutdown);