Compare commits

...

5 Commits

Author SHA1 Message Date
Mike Blumenkrantz 889f8f0042 info++ 2016-10-10 16:04:39 -04:00
Mike Blumenkrantz 497ff6f8ff logging 2016-10-10 16:03:38 -04:00
Mike Blumenkrantz 321c9cfbc6 add meta image loader+infra for loading from X-AlbumImage metadata tag 2016-10-10 16:03:38 -04:00
Mike Blumenkrantz 762ba11d4d fix copy/paste typo when configuring e module 2016-10-10 16:03:38 -04:00
Mike Blumenkrantz 399976045b add empdd support for song xtags 2016-10-10 16:03:38 -04:00
13 changed files with 218 additions and 49 deletions

View File

@ -183,6 +183,12 @@ AC_ARG_ENABLE([module-google-image],
[want_google_image=$enableval], [])
AM_CONDITIONAL([MOD_GOOGLE_IMAGE], [test "x$want_google_image" = "xyes"])
want_meta=yes
AC_ARG_ENABLE([module-meta],
[AC_HELP_STRING([--disable-module-meta], [disable meta image module. @<:@default=detect@:>@])],
[want_meta=$enableval], [])
AM_CONDITIONAL([MOD_META], [test "x$want_meta" = "xyes"])
########################################
want_auto_playlist_manager=yes
@ -196,7 +202,7 @@ AM_CONDITIONAL([MOD_APL], [test "x$want_auto_playlist_manager" = "xyes"])
want_mpdule=maybe
AC_ARG_ENABLE([mpdule],
[AC_HELP_STRING([--disable-mpdule], [disable mpdule enlightenment module. @<:@default=detect@:>@])],
[want_google_image=$enableval], [])
[want_mpdule=$enableval], [])
if test "x$want_mpdule" != "xno" ; then
PKG_CHECK_MODULES([E], [enlightenment >= 0.19], [want_mpdule=yes],
[
@ -277,6 +283,7 @@ Modules:
* glyr_gmpc............: $want_glyr_gmpc
* glyr.................: $want_glyr
* google_image.........: $want_google_image
* meta.................: $want_meta
* elyr.................: $want_elyr
* eet_saver............: $want_eet_saver
* eet_loader...........: $want_eet_loader

View File

@ -68,6 +68,7 @@ void Empd_Empdd_Song_free(Empd_Empdd_Song * val)
eina_stringshare_del(val->name);
eina_stringshare_del(val->date);
eina_stringshare_del(val->disc);
eina_stringshare_del(val->albumimage);
free(val);
}
@ -91,6 +92,7 @@ Empd_Empdd_Song * Empd_Empdd_Song_copy(Empd_Empdd_Song * orig)
copy->disc = eina_stringshare_ref(orig->disc);
copy->song_pos = orig->song_pos;
copy->songid = orig->songid;
copy->albumimage = eina_stringshare_ref(orig->albumimage);
return copy;
}
@ -125,6 +127,8 @@ Eina_Bool Empd_Empdd_Song_eq(Empd_Empdd_Song * a, Empd_Empdd_Song * b)
return EINA_FALSE;
if (a->songid != b->songid)
return EINA_FALSE;
if (a->albumimage != b->albumimage)
return EINA_FALSE;
return EINA_TRUE;
}
@ -171,6 +175,9 @@ void Empd_Empdd_Song_print(const char *pre, int indent, const Empd_Empdd_Song *a
for (i = 0; i < indent; i++)
printf("%s", pre);
printf("songid: %i\n", a->songid);
for (i = 0; i < indent; i++)
printf("%s", pre);
printf("albumimage: %s\n", a->albumimage);
}
Eina_Bool Empd_Empdd_Song_isnull(Empd_Empdd_Song * a)
@ -201,6 +208,8 @@ Eina_Bool Empd_Empdd_Song_isnull(Empd_Empdd_Song * a)
return EINA_FALSE;
if (a->songid != 0)
return EINA_FALSE;
if (a->albumimage != NULL)
return EINA_FALSE;
return EINA_TRUE;
}

View File

@ -30,6 +30,7 @@ struct Empd_Empdd_Song
Eina_Stringshare * disc; /* */
int song_pos; /* */
int songid; /* */
Eina_Stringshare * albumimage; /* */
};
static inline Empd_Empdd_Song *Empd_Empdd_Song_new(void)

View File

@ -11,9 +11,9 @@ Eina_Value *Empd_Empdd_Song_to_azy_value(const Empd_Empdd_Song * azy_user_type)
if (!azy_user_type) return NULL;
st_desc = eina_value_util_struct_desc_new();
members = malloc(12 * sizeof(Eina_Value_Struct_Member));
members = malloc(13 * sizeof(Eina_Value_Struct_Member));
st_desc->members = members;
st_desc->member_count = 12;
st_desc->member_count = 13;
members[0].name = eina_stringshare_add("uri");
offset = eina_value_util_type_offset(EINA_VALUE_TYPE_STRINGSHARE, offset);
members[0].offset = offset;
@ -74,6 +74,11 @@ Eina_Value *Empd_Empdd_Song_to_azy_value(const Empd_Empdd_Song * azy_user_type)
members[11].offset = offset;
offset += eina_value_util_type_size(EINA_VALUE_TYPE_INT);
members[11].type = EINA_VALUE_TYPE_INT;
members[12].name = eina_stringshare_add("albumimage");
offset = eina_value_util_type_offset(EINA_VALUE_TYPE_STRINGSHARE, offset);
members[12].offset = offset;
offset += eina_value_util_type_size(EINA_VALUE_TYPE_STRINGSHARE);
members[12].type = EINA_VALUE_TYPE_STRINGSHARE;
st_desc->size = offset;
value_struct = eina_value_struct_new(st_desc);
@ -113,6 +118,9 @@ Eina_Value *Empd_Empdd_Song_to_azy_value(const Empd_Empdd_Song * azy_user_type)
val = eina_value_util_int_new(azy_user_type->songid);
eina_value_struct_value_set(value_struct, "songid", val);
eina_value_free(val);
val = eina_value_util_stringshare_new(azy_user_type->albumimage);
eina_value_struct_value_set(value_struct, "albumimage", val);
eina_value_free(val);
return value_struct;
}
@ -365,6 +373,29 @@ Eina_Bool azy_value_to_Empd_Empdd_Song(const Eina_Value *value_struct, Empd_Empd
eina_value_flush(&val);
}
found = EINA_FALSE;
if ((!arg) && eina_value_struct_value_get(value_struct, "albumimage", &val))
found = EINA_TRUE;
else
{
char buf[128];
snprintf(buf, sizeof(buf), "arg%d", arg++);
if (eina_value_struct_value_get(value_struct, buf, &val))
found = EINA_TRUE;
}
if (found)
{
if (arg)
{
char *str = NULL;
if (eina_value_get(&val, &str))
azy_user_type_tmp->albumimage = eina_stringshare_add(str);
}
else
eina_value_util_stringshare_copy(&val, &azy_user_type_tmp->albumimage);
eina_value_flush(&val);
}
found = EINA_FALSE;
*azy_user_type = azy_user_type_tmp;
return EINA_TRUE;

View File

@ -92,6 +92,7 @@ static int empd_song_track = -1;
static Eina_Stringshare *empd_song_title = NULL;
static Eina_Stringshare *empd_song_artist = NULL;
static Eina_Stringshare *empd_song_album = NULL;
static Eina_Stringshare *empd_song_albumimage = NULL;
static Elm_Object_Item *empd_song_item = NULL;
static unsigned int empd_song_length = 0;
static unsigned int empd_song_elapsed = 0;
@ -720,6 +721,7 @@ fetch_req_free(Empc_Fetch_Request_Internal *ireq)
eina_stringshare_del(ireq->req.album);
eina_stringshare_del(ireq->req.song);
eina_stringshare_del(ireq->req.uri);
eina_stringshare_del(ireq->req.albumimage);
ecore_job_del(ireq->fail_job);
E_FREE_LIST(ireq->results, free);
E_FREE_LIST(ireq->urls_pending, eina_stringshare_del);
@ -810,7 +812,7 @@ bg_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *sig
}
static Empc_Fetch_Request *
bg_update(int num, Eina_Stringshare *artist, Eina_Stringshare *album, Eina_Stringshare *uri)
bg_update(int num, Eina_Stringshare *artist, Eina_Stringshare *album, Eina_Stringshare *uri, Eina_Stringshare *albumimage)
{
Evas_Object *o;
@ -819,7 +821,7 @@ bg_update(int num, Eina_Stringshare *artist, Eina_Stringshare *album, Eina_Strin
{
bgselector_clear(o);
bgselector_info_set(o, artist, album);
return metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, o, artist, album, uri, EINA_FALSE, EINA_FALSE, bg_add, NULL);
return metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, o, artist, album, uri, albumimage, EINA_FALSE, EINA_FALSE, bg_add, NULL);
}
return NULL;
}
@ -1046,7 +1048,7 @@ status_update(int state)
static int
songid_update(int songid)
{
Eina_Bool artist, album, first = (empd_songid == -1);
Eina_Bool artist, album, albumimage, first = (empd_songid == -1);
Elm_Object_Item *it, *itp = NULL;
Empd_Empdd_Song *so, *sop = NULL;
int ret, uid = background_num;
@ -1069,10 +1071,11 @@ songid_update(int songid)
eina_stringshare_refplace(&empd_song_title, so->title);
artist = eina_stringshare_refplace(&empd_song_artist, so->artist);
album = eina_stringshare_refplace(&empd_song_album, so->album);
if (artist || album)
albumimage = eina_stringshare_refplace(&empd_song_albumimage, so->albumimage);
if (artist || album || albumimage)
{
uid = first ? background_num : bg_next_get();
bg_update(uid, empd_song_artist, empd_song_album, so->uri);
bg_update(uid, empd_song_artist, empd_song_album, so->uri, so->albumimage);
}
ret = songid - empd_songid;
empd_songid = songid;
@ -1100,7 +1103,7 @@ songid_update(int songid)
elm_genlist_item_fields_update(it, EMPC_TEXT_TIME, ELM_GENLIST_ITEM_FIELD_TEXT);
elm_object_part_content_set(layout, EMPC_SWALLOW_LYRICS, NULL);
if (lyrics_visible)
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, so->uri, EINA_FALSE, EINA_FALSE, lyrics_set, NULL);
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, so->uri, NULL, EINA_FALSE, EINA_FALSE, lyrics_set, NULL);
so = elm_object_item_data_get(it);
if ((!itp) || (so->album != sop->album) || (so->artist != sop->artist))
{
@ -1653,14 +1656,14 @@ filesystem_item_content_get(Empc_Entity *ent, Evas_Object *obj, const char *part
if (img || uri)
save_image(EINA_TRUE, uri ? NULL : img, uri, artist, album, uri ? filesystem_item_content_get_post_save : NULL);
else
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, album, dir->uri, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, album, dir->uri, NULL, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
}
else
{
if (img || uri)
save_image(EINA_TRUE, uri ? NULL : img, uri, artist, p, uri ? filesystem_item_content_get_post_save : NULL);
else
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, p, dir->uri, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, artist, p, dir->uri, NULL, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
}
}
else
@ -1668,7 +1671,7 @@ filesystem_item_content_get(Empc_Entity *ent, Evas_Object *obj, const char *part
if (img || uri)
save_image(EINA_TRUE, uri ? NULL : img, uri, dir->uri, NULL, uri ? filesystem_item_content_get_post_save : NULL);
else
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, dir->uri, NULL, dir->uri, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, dir->uri, NULL, dir->uri, NULL, EINA_FALSE, EINA_FALSE, filesystem_item_image, cur);
}
if (img)
evas_object_unref(img);
@ -1909,7 +1912,7 @@ empc_bg_changed()
}
background_num = bg_next_get();
bgselector_clear(bg[background_num]);
req = bg_update(background_num, empd_song_artist, empd_song_album, uri);
req = bg_update(background_num, empd_song_artist, empd_song_album, uri, empd_song_albumimage);
metadata_fetch_cb_add(req, bg_changed_post, NULL);
elm_object_signal_emit(layout, "empc,bg,next", "empc");
return ECORE_CALLBACK_RENEW;
@ -2103,8 +2106,8 @@ empc_status(void *d EINA_UNUSED, int t EINA_UNUSED, Empd_Empdd_Status_Data *ev)
if (!it)
it = elm_genlist_first_item_get(queue_list);
so = elm_object_item_data_get(it);
if ((so->artist != empd_song_artist) || (so->album != empd_song_album))
bg_update(bg_next_get(), so->artist, so->album, so->uri);
if ((so->artist != empd_song_artist) || (so->album != empd_song_album) || (so->albumimage != empd_song_albumimage))
bg_update(bg_next_get(), so->artist, so->album, so->uri, so->albumimage);
}
//if (empd_song_item && queue_list_state)
//elm_genlist_item_fields_update(empd_song_item, EMPC_TEXT_TIME, ELM_GENLIST_ITEM_FIELD_TEXT);
@ -2564,7 +2567,7 @@ queue_list_header_content_get(Empd_Empdd_Song *so, Evas_Object *obj, const char
cur = evas_object_box_add(evas_object_evas_get(obj));
EXPAND(cur);
FILL(cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, so->artist, so->album, so->uri, EINA_FALSE, EINA_FALSE, queue_list_header_image, cur);
req = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, obj, so->artist, so->album, so->uri, so->albumimage, EINA_FALSE, EINA_FALSE, queue_list_header_image, cur);
evas_object_event_callback_add(cur, EVAS_CALLBACK_DEL, queue_list_header_content_del, req);
return cur;
}
@ -3001,8 +3004,8 @@ queue_list_handler(Eina_Value *value, Eina_Bool update)
empd_song_item = it;
/* force updates in case song info has changed */
if ((so->artist != empd_song_artist) || (so->album != empd_song_album))
bg_update(bg_next_get(), so->artist, so->album, so->uri);
if ((so->artist != empd_song_artist) || (so->album != empd_song_album) || (so->albumimage != empd_song_albumimage))
bg_update(bg_next_get(), so->artist, so->album, so->uri, so->albumimage);
eina_stringshare_refplace(&empd_song_album, so->album);
title = eina_stringshare_refplace(&empd_song_title, so->title);
if (title || (empd_song_track != so->track))
@ -3519,7 +3522,7 @@ lyrics_request()
so = elm_object_item_data_get(empd_song_item);
uri = so->uri;
}
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, uri, EINA_FALSE, EINA_FALSE, lyrics_set, NULL);
metadata_fetch_begin(EMPC_METADATA_TYPE_TEXT, layout, empd_song_artist, empd_song_title, uri, NULL, EINA_FALSE, EINA_FALSE, lyrics_set, NULL);
}
}
@ -3574,7 +3577,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_SWALLOW_BACKGROUND);
bgfetch = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, bgs, empd_song_artist, empd_song_album, uri, EINA_TRUE, EINA_FALSE, bg_add, NULL);
bgfetch = metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, bgs, empd_song_artist, empd_song_album, uri, empd_song_albumimage, EINA_TRUE, EINA_FALSE, bg_add, NULL);
bgselector_active_set(bgs, EINA_TRUE);
elm_object_tooltip_hide(bgs);
}
@ -3733,7 +3736,7 @@ dbus_getbg(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Messa
return ret;
}
so = elm_object_item_data_get(empd_song_item);
metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, win, empd_song_artist, empd_song_title, so->uri, EINA_FALSE, EINA_TRUE, dbus_getbg_fetch_cb, ret);
metadata_fetch_begin(EMPC_METADATA_TYPE_IMAGE, win, empd_song_artist, empd_song_title, so->uri, so->albumimage, EINA_FALSE, EINA_TRUE, dbus_getbg_fetch_cb, ret);
return NULL;
}

View File

@ -63,6 +63,7 @@ struct Empc_Fetch_Request
Eina_Stringshare *album;
Eina_Stringshare *song;
Eina_Stringshare *uri;
Eina_Stringshare *albumimage;
Empc_Metadata_Type type;
Eina_Bool local : 1; //only local fetches
Eina_Bool force : 1;

View File

@ -62,7 +62,7 @@ metadata_image_new(Empc_Fetch_Request_Internal *ireq, const char *url)
m = calloc(1, sizeof(Metadata_Image));
m->ireq = ireq;
//INF("REMOTE COVER START(%s:%s)", m->ireq->req.artist, m->ireq->req.album);
INF("REMOTE COVER START(%s:%s) '%s'", m->ireq->req.artist, m->ireq->req.album, url);
ireq->urls = eina_inlist_append(ireq->urls, EINA_INLIST_GET(m));
m->url = ecore_con_url_new(url);
m->buf = eina_binbuf_new();
@ -158,7 +158,7 @@ metadata_fail_cb(Empc_Fetch_Request_Internal *ireq)
}
Empc_Fetch_Request *
metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, const char *uri, Eina_Bool force, Eina_Bool local, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data)
metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, const char *uri, const char *albumimage, Eina_Bool force, Eina_Bool local, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data)
{
Empc_Fetch_Request_Internal *ireq;
Empc_Fetch_Request *req;
@ -191,6 +191,7 @@ metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr
switch (type)
{
case EMPC_METADATA_TYPE_IMAGE:
INF("FETCH: %s %s %s %s", attr1, attr2, uri, albumimage);
ireq = metadata_fetch_req_new(attr1, attr2, NULL);
break;
case EMPC_METADATA_TYPE_TEXT:
@ -202,6 +203,7 @@ metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr
ireq->req.local = !!local;
ireq->req.type = type;
ireq->req.uri = eina_stringshare_add(uri);
ireq->req.albumimage = eina_stringshare_add(albumimage);
res = malloc(sizeof(Empc_Metadata_Result_Cb));
res->cb = cb;
res->data = (void*)data;

View File

@ -75,7 +75,7 @@ extern int empc_log_dom;
extern Eina_Inlist *empc_modules[];
extern Eina_Hash *empc_metadata_fetch_reqs[];
Empc_Fetch_Request *metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, const char *uri, Eina_Bool force, Eina_Bool local, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
Empc_Fetch_Request *metadata_fetch_begin(Empc_Metadata_Type type, Evas_Object *obj, const char *attr1, const char *attr2, const char *uri, const char *albumimage, Eina_Bool force, Eina_Bool local, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
void metadata_fetch_cancel(Empc_Fetch_Request *req, Evas_Object *obj, Empc_Module_Metadata_Fetch_Result_Cb cb, const void *data);
void metadata_fetch_cb_add(Empc_Fetch_Request *req, Ecore_End_Cb cb, const void *data);
void metadata_shutdown(void);

View File

@ -14,6 +14,7 @@ struct Empdd_Song
string disc;
int song_pos;
int songid;
string albumimage;
};
struct Array_Songs

View File

@ -36,8 +36,11 @@ typedef struct EMPD
Eina_List *pending;
Eina_List *pending_xtags;
Eina_List *current_queue;
Eina_List *current_queue_xtags;
void *cur;
Eina_Hash *cur_xtags;
E_Slist *cmds, *last;
unsigned int reconnect_fail;
@ -145,7 +148,7 @@ static const Eldbus_Signal empd_signals[] =
{"u", "update_id"}), 0},
[EMPD_SIGNAL_CURRENT_SONG] = {"CurrentSong", ELDBUS_ARGS({"s", "uri"}, {"t", "last_modified"}, {"u", "duration"},
{"s", "artist"}, {"s", "composer"}, {"s", "title"}, {"s", "album"}, {"i", "track"},
{"s", "name"}, {"s", "date"}, {"s", "disc"}, {"s", "genre"}, {"i", "song_pos"}, {"i", "songid"}), 0},
{"s", "name"}, {"s", "date"}, {"s", "disc"}, {"s", "genre"}, {"i", "song_pos"}, {"i", "songid"}, {"s", "albumimage"}), 0},
[EMPD_SIGNAL_QUEUE_LIST] = {"QueueList", ELDBUS_ARGS({"a(stusssisssii)", "array_of_songs"}), 0},
[EMPD_SIGNAL_QUEUE_CHANGES_META] = {"QueueChangesMeta", ELDBUS_ARGS({"a(stusssisssii)", "array_of_songs"}), 0},
[EMPD_SIGNAL_DATABASE_UPDATE_BEGIN] = {"DatabaseUpdateBegin", NULL, 0},
@ -346,29 +349,38 @@ pinger_cb(void *d EINA_UNUSED)
}
static void
queue_list_info_send(Eldbus_Message *msg, Eina_List *queue_list, unsigned int start, long num, Eina_Bool sig)
queue_list_info_send(Eldbus_Message *msg, Eina_List *queue_list, Eina_List *queue_list_xtags, unsigned int start, long num, Eina_Bool sig)
{
Eldbus_Message_Iter *iter, *array, *struc;
Eina_List *l;
Eina_List *l, *ll = queue_list_xtags;
struct mpd_song *so;
unsigned int cur = 0;
iter = eldbus_message_iter_get(msg);
array = eldbus_message_iter_container_new(iter, 'a', "(stusssisssii)");
array = eldbus_message_iter_container_new(iter, 'a', "(stusssisssiis)");
EINA_LIST_FOREACH(queue_list, l, so)
{
/* holy shit. */
const char *track = mpd_song_get_tag(so, MPD_TAG_TRACK, 0);
const char *albumimage;
Eina_Hash *h = eina_list_data_get(ll);
if (cur++ < start) continue;
eldbus_message_iter_arguments_append(array, "(stusssisssii)", &struc);
eldbus_message_iter_arguments_append(struc, "stusssisssii",
if (cur++ < start)
{
ll = ll->next;
continue;
}
albumimage = eina_hash_find(h, "X-AlbumImage");
fprintf(stderr, "ALBUMIMAGE: %s\n", albumimage);
eldbus_message_iter_arguments_append(array, "(stusssisssiis)", &struc);
eldbus_message_iter_arguments_append(struc, "stusssisssiis",
STRING_SAFETY(mpd_song_get_uri(so)), mpd_song_get_last_modified(so), mpd_song_get_duration(so),
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_ARTIST, 0)), STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_TITLE, 0)),
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_ALBUM, 0)),
track ? atoi(track) : 0, STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_NAME, 0)), STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_DATE, 0)),
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_DISC, 0)), mpd_song_get_pos(so), mpd_song_get_id(so));
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_DISC, 0)), mpd_song_get_pos(so), mpd_song_get_id(so), STRING_SAFETY(albumimage));
eldbus_message_iter_container_close(array, struc);
ll = ll->next;
if (mpd_song_get_pos(so) == num) break;
}
eldbus_message_iter_container_close(iter, array);
@ -383,7 +395,7 @@ queue_list_send(Eldbus_Message *msg, unsigned int start, long num)
if (!msg)
msg = eldbus_service_signal_new(empd_iface, EMPD_SIGNAL_QUEUE_LIST);
queue_list_info_send(msg, empd->current_queue, start, num, sig);
queue_list_info_send(msg, empd->current_queue, empd->current_queue_xtags, start, num, sig);
}
static Eina_Bool
@ -619,31 +631,43 @@ fdh_func(void *d EINA_UNUSED, Ecore_Fd_Handler *fdh EINA_UNUSED)
if (res == MPD_PARSER_PAIR)
{
if (!empd->cur)
int i;
for (i = 0; i < 2; i++)
{
empd->cur = mpd_song_begin(&(struct mpd_pair){name, value});
break;
}
mpd_song_feed(so, &(struct mpd_pair){name, value});
//fprintf(stderr, "[%s]|FEED\n", cmd_txt[cmd_get()]);
if (cmd_get() != EMPD_COMMAND_CURRENT_SONG)
{
if (!strcmp(name, "Id"))
if (!empd->cur)
{
empd->cur = mpd_song_begin(&(struct mpd_pair){name, value});
empd->cur_xtags = eina_hash_string_superfast_new(free);
break;
}
if (mpd_song_feed(so, &(struct mpd_pair){name, value}))
{
if (mpd_tag_name_parse(name) == MPD_TAG_UNKNOWN)
eina_hash_add(empd->cur_xtags, name, strdup(value ?: ""));
break;
}
else if (cmd_get() != EMPD_COMMAND_CURRENT_SONG)
{
/* at end of current song, push to list
* for sending all at once later
*/
empd->pending = eina_list_append(empd->pending, so);
empd->pending_xtags = eina_list_append(empd->pending_xtags, empd->cur_xtags);
empd->cur = NULL;
empd->cur_xtags = NULL;
}
}
//fprintf(stderr, "[%s]|FEED\n", cmd_txt[cmd_get()]);
}
else if (cmd_get() == EMPD_COMMAND_CURRENT_SONG)
{
const char *track;
char *albumimage;
if (!so) break; //no current song
track = mpd_song_get_tag(so, MPD_TAG_TRACK, 0);
albumimage = eina_hash_find(empd->cur_xtags, "X-AlbumImage");
//fprintf(stderr, "CURRENT\n");
@ -653,19 +677,21 @@ fdh_func(void *d EINA_UNUSED, Ecore_Fd_Handler *fdh EINA_UNUSED)
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_TITLE, 0)), STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_ALBUM, 0)),
track ? atoi(track) : 0, STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_NAME, 0)), STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_DATE, 0)),
STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_DISC, 0)), STRING_SAFETY(mpd_song_get_tag(so, MPD_TAG_GENRE, 0)),
mpd_song_get_pos(so), mpd_song_get_id(so));
mpd_song_get_pos(so), mpd_song_get_id(so), STRING_SAFETY(albumimage));
mpd_song_free(so);
}
else if (cmd_get() == EMPD_COMMAND_QUEUE_CHANGES_META)
{
Eina_List *l, *ll;
Eldbus_Message *msg;
Eina_Hash *h;
unsigned int n;
if (res != MPD_PARSER_SUCCESS)
break;
msg = eldbus_service_signal_new(empd_iface, EMPD_SIGNAL_QUEUE_CHANGES_META);
queue_list_info_send(msg, empd->pending, 0, -1, 1);
queue_list_info_send(msg, empd->pending, empd->pending_xtags, 0, -1, 1);
if (!empd->pending)
{
while (eina_list_count(empd->current_queue) > empd_queue_length)
@ -673,25 +699,39 @@ fdh_func(void *d EINA_UNUSED, Ecore_Fd_Handler *fdh EINA_UNUSED)
mpd_song_free(eina_list_last_data_get(empd->current_queue));
empd->current_queue = eina_list_remove_list(empd->current_queue,
eina_list_last(empd->current_queue));
eina_hash_free(eina_list_last_data_get(empd->current_queue_xtags));
empd->current_queue_xtags = eina_list_remove_list(empd->current_queue_xtags,
eina_list_last(empd->current_queue_xtags));
}
break;
}
so = eina_list_data_get(empd->pending);
EINA_LIST_FOREACH_SAFE(eina_list_nth_list(empd->current_queue, mpd_song_get_pos(so)), l, ll, so)
n = mpd_song_get_pos(so);
EINA_LIST_FOREACH_SAFE(eina_list_nth_list(empd->current_queue, n), l, ll, so)
{
mpd_song_free(so);
empd->current_queue = eina_list_remove_list(empd->current_queue, l);
}
EINA_LIST_FOREACH_SAFE(eina_list_nth_list(empd->current_queue_xtags, n), l, ll, h)
{
eina_hash_free(h);
empd->current_queue_xtags = eina_list_remove_list(empd->current_queue_xtags, l);
}
empd->current_queue = eina_list_merge(empd->current_queue, empd->pending);
empd->current_queue_xtags = eina_list_merge(empd->current_queue_xtags, empd->pending_xtags);
empd->pending = NULL;
empd->pending_xtags = NULL;
}
else if (cmd_get() == EMPD_COMMAND_QUEUE_LIST)
{
if (res != MPD_PARSER_SUCCESS)
break;
E_FREE_LIST(empd->current_queue, mpd_song_free);
E_FREE_LIST(empd->current_queue_xtags, eina_hash_free);
empd->current_queue = empd->pending;
empd->current_queue_xtags = empd->pending_xtags;
empd->pending = NULL;
empd->pending_xtags = NULL;
if (empd->current_queue)
queue_list_send(NULL, 0, -1);
}

View File

@ -62,12 +62,12 @@
<annotation name="org.freedesktop.DBus.Method.NoReply" value="true" />
</method>
<method name="QueueListCached">
<arg type="a(stusssisssii)" name="array_of_songs" direction="out" />
<arg type="a(stusssisssiis)" name="array_of_songs" direction="out" />
</method>
<method name="QueueListCachedRange">
<arg type="i" name="start" direction="in" />
<arg type="i" name="num" direction="in" />
<arg type="a(stusssisssii)" name="array_of_songs" direction="out" />
<arg type="a(stusssisssiis)" name="array_of_songs" direction="out" />
</method>
<method name="ClearList">
<annotation name="org.freedesktop.DBus.Method.NoReply" value="true" />
@ -171,12 +171,13 @@
<arg type="s" name="genre" direction="out" />
<arg type="i" name="song_pos" direction="out" />
<arg type="i" name="songid" direction="out" />
<arg type="s" name="albumimage" direction="out" />
</signal>
<signal name="QueueList">
<arg type="a(stusssisssii)" name="array_of_songs" direction="out" />
<arg type="a(stusssisssiis)" name="array_of_songs" direction="out" />
</signal>
<signal name="QueueChangesMeta">
<arg type="a(stusssisssii)" name="array_of_songs" direction="out" />
<arg type="a(stusssisssiis)" name="array_of_songs" direction="out" />
</signal>
<signal name="LoginFailed">
<arg type="s" name="host" direction="out" />

View File

@ -80,6 +80,29 @@ src_modules_google_image_la_LDFLAGS = -module -avoid-version
src_modules_google_image_la_LIBTOOLFLAGS = --tag=disable-static
endif
if MOD_META
mod_LTLIBRARIES += src/modules/meta.la
src_modules_meta_la_SOURCES = \
src/modules/meta.c \
src/bin/empc.h
src_modules_meta_la_CPPFLAGS = \
$(AM_CFLAGS) \
$(mod_cppflags) \
@EFL_CFLAGS@ \
@ELM_CFLAGS@ \
-I$(top_srcdir)/src/bin \
-I$(top_builddir)
src_modules_meta_la_LIBADD = \
@EFL_LIBS@
src_modules_meta_la_LDFLAGS = -module -avoid-version
src_modules_meta_la_LIBTOOLFLAGS = --tag=disable-static
endif
if MOD_ELYR
ELYR_AZY_SRC = \
src/modules/Lyricwiki_Common_Azy.c \

50
src/modules/meta.c Normal file
View File

@ -0,0 +1,50 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "empdd.h"
#include "empc.h"
EAPI Eina_Bool
empc_module_metadata_fetch(Empc_Fetch_Request *req)
{
if (req->type != EMPC_METADATA_TYPE_IMAGE) return EINA_FALSE;
if ((!req->albumimage) || (!req->albumimage[0])) return EINA_FALSE;
if (req->force)
empc_metadata_image_download(req, req->albumimage);
else
empc_metadata_image_download_queue(req, req->albumimage);
return EINA_TRUE;
}
EAPI Eina_Bool
empc_module_remote(void)
{
return EINA_TRUE;
}
EAPI Empc_Module_Type
empc_module_type(void)
{
return EMPC_MODULE_TYPE_METADATA_FETCH;
}
EAPI int
empc_module_priority(void)
{
return 6;
}
static Eina_Bool
meta_init(void)
{
return EINA_TRUE;
}
static void
meta_shutdown(void)
{
}
EINA_MODULE_INIT(meta_init);
EINA_MODULE_SHUTDOWN(meta_shutdown);