new type of module: metadata saver

also basic eet saver
This commit is contained in:
zmike 2014-01-31 21:25:25 -05:00
parent 0059874954
commit f858957c8d
5 changed files with 155 additions and 16 deletions

View File

@ -103,6 +103,12 @@ if test -n "$want_glyr" ; then
fi fi
AM_CONDITIONAL([MOD_GLYR], [test "x$want_glyr" = "xyes"]) 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 case "$host_os" in
@ -159,6 +165,7 @@ cat << MODULES_EOF
Modules: Modules:
* glyr_gmpc...........: $want_glyr_gmpc * glyr_gmpc...........: $want_glyr_gmpc
* glyr................: $want_glyr * glyr................: $want_glyr
* eet_saver...........: $want_eet_saver
MODULES_EOF MODULES_EOF
echo echo

View File

@ -10,7 +10,7 @@
#include "empc.h" #include "empc.h"
#include "empc_parts.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 DBG(...) EINA_LOG_DOM_DBG(empc_log_dom, __VA_ARGS__)
#define INF(...) EINA_LOG_DOM_INFO(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; Eina_Module *module;
} Empc_Module; } Empc_Module;
typedef struct Empc_Module_Metadata typedef struct Empc_Module_Metadata_Fetch
{ {
Empc_Module module; Empc_Module module;
Empc_Module_Metadata_Fetch_Cb fetch; 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 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] = 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 static inline unsigned char
bg_next_get(void) bg_next_get(void)
@ -288,7 +297,7 @@ songid_update(int songid)
} }
static Empc_Fetch_Request_Internal * 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; 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; 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 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; 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); INF("COVER RETURN(%s) %d", strrchr(eina_module_file_get(ireq->module->module), '/') + 1, success);
if (!success) if (!success)
{ {
empc_metadata_image_fetch((void*)req, NULL, NULL, NULL); metadata_image_fetch((void*)req, NULL, NULL, NULL);
return; return;
} }
eina_stringshare_del(evas_object_data_del(req->obj, "artist")); 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 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; Empc_Module *mod;
char buf[2048]; char buf[2048];
@ -340,15 +362,15 @@ empc_metadata_image_fetch(Empc_Fetch_Request_Internal *ireq, Evas_Object *obj, c
} }
else else
{ {
ireq = empc_metadata_fetch_req_new(artist, album, NULL); ireq = metadata_fetch_req_new(artist, album, NULL);
ireq->req.result = empc_cover_done; ireq->req.result = metadata_image_fetch_done;
ireq->req.obj = obj; ireq->req.obj = obj;
eina_hash_add(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], buf, ireq); eina_hash_add(empc_metadata_fetch_reqs[EMPC_MODULE_TYPE_METADATA_IMAGE], buf, ireq);
mods = empc_modules[EMPC_MODULE_TYPE_METADATA_IMAGE]; mods = empc_modules[EMPC_MODULE_TYPE_METADATA_IMAGE];
} }
EINA_INLIST_FOREACH(mods, mod) 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; if (!em->fetch((Empc_Fetch_Request*)ireq)) continue;
INF("COVER FETCH(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1); INF("COVER FETCH(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1);
ireq->module = mod; ireq->module = mod;
@ -388,7 +410,7 @@ empc_current_song(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empc_CurrentSong_
title_update(); title_update();
/* always fetch on first run */ /* always fetch on first run */
if (!palbum) 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 */ /* check for update fails */
else if (artist || album) 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()]; o = bg[bg_next_get()];
if ((empd_song_artist != evas_object_data_get(o, "artist")) || if ((empd_song_artist != evas_object_data_get(o, "artist")) ||
(empd_song_album != evas_object_data_get(o, "album"))) (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); 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()]; 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 != 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) 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: 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"); em->fetch = eina_module_symbol_get(m, "empc_module_metadata_fetch");
break; 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; default: break;
} }
INF("MODULE LOAD(%s)", strrchr(eina_module_file_get(mod->module), '/') + 1); 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++) for (i = 0; i < 2; i++)
{ {
bg[i] = elm_image_add(win); 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); elm_image_fill_outside_set(bg[i], EINA_FALSE);
evas_object_show(bg[i]); evas_object_show(bg[i]);
} }

View File

@ -3,6 +3,8 @@
typedef enum typedef enum
{ {
EMPC_MODULE_TYPE_METADATA_IMAGE, EMPC_MODULE_TYPE_METADATA_IMAGE,
EMPC_MODULE_TYPE_METADATA_TEXT,
EMPC_MODULE_TYPE_METADATA_SAVER,
EMPC_MODULE_TYPE_LAST, EMPC_MODULE_TYPE_LAST,
} Empc_Module_Type; } 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 Empc_Module_Type (*Empc_Module_Type_Cb)(void);
typedef int (*Empc_Module_Priority_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 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); typedef void (*Empc_Module_Metadata_Fetch_Result_Cb)(Empc_Fetch_Request *, Eina_Bool success);

View File

@ -53,3 +53,27 @@ src_modules_glyr_la_LDFLAGS = -module -avoid-version
src_modules_glyr_la_LIBTOOLFLAGS = --tag=disable-static src_modules_glyr_la_LIBTOOLFLAGS = --tag=disable-static
endif 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

74
src/modules/eet_saver.c Normal file
View File

@ -0,0 +1,74 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "empdd.h"
#include "empc.h"
#include <Ecore.h>
#include <Efreet.h>
#include <Elementary.h>
#include <Eet.h>
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);