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
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

View File

@ -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]);
}

View File

@ -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);

View File

@ -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

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);