From 2340469f429b9045744265a9f9b885c43cd08d6e Mon Sep 17 00:00:00 2001 From: Al Poole Date: Thu, 12 Jan 2017 14:36:36 -0800 Subject: [PATCH] add support for video thumbnails from meta data and album artwork for audio files. Summary: Generally these images are better quality than those from the Interwebz and local so let's use em! For now using emotion_object_meta_preview_get() as Apple stores them in this tag. emotion_object_meta_image_get() is also available and I've heard also it is used similarly, but am yet to find a file that does that. Reviewers: raster Differential Revision: https://phab.enlightenment.org/D4555 Signed-off-by: Cedric BAIL --- src/bin/video.c | 8 ++++++ src/bin/video.h | 2 +- src/bin/win.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/bin/video.c b/src/bin/video.c index 32bc78f..1b31a76 100644 --- a/src/bin/video.c +++ b/src/bin/video.c @@ -999,6 +999,14 @@ video_meta_year_get(Evas_Object *obj) return emotion_object_meta_info_get(sd->o_vid, EMOTION_META_INFO_TRACK_YEAR); } +Evas_Object * +video_meta_artwork_get(Evas_Object *obj, const char *path, int type) +{ + Video *sd = evas_object_smart_data_get(obj); + if (!sd) return NULL; + return emotion_file_meta_artwork_get(sd->o_vid, path, type); +} + const char * video_meta_genre_get(Evas_Object *obj) { diff --git a/src/bin/video.h b/src/bin/video.h index 1da8212..5562882 100644 --- a/src/bin/video.h +++ b/src/bin/video.h @@ -56,5 +56,5 @@ const char *video_meta_year_get(Evas_Object *obj); const char *video_meta_genre_get(Evas_Object *obj); const char *video_meta_comment_get(Evas_Object *obj); void video_file_autosub_set(Evas_Object *obj, const char *file, const char *sub); - +Evas_Object * video_meta_artwork_get(Evas_Object *obj, const char *path, int type); #endif diff --git a/src/bin/win.c b/src/bin/win.c index 474592e..c758e6d 100644 --- a/src/bin/win.c +++ b/src/bin/win.c @@ -62,6 +62,7 @@ _cb_win_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (inf->mouse_idle_timeout) ecore_timer_del(inf->mouse_idle_timeout); if (inf->albumart_timeout) ecore_timer_del(inf->albumart_timeout); if (inf->down_timeout) ecore_timer_del(inf->down_timeout); + EINA_LIST_FREE(inf->file_list, vid) { if (vid->file) eina_stringshare_del(vid->file); @@ -214,6 +215,62 @@ _cb_fetched(void *data) } } +Eina_Bool +_local_artwork_get(void *data) +{ + Evas_Object *win = data; + Inf *inf = evas_object_data_get(win, "inf"); + + if (!inf) return EINA_FALSE; + if (!inf->vid) return EINA_FALSE; + + const char *file = NULL; + const char *filename = video_file_get(inf->vid); + + Efreet_Uri *uri = efreet_uri_decode(filename); + if (uri) + { + file = ecore_file_realpath(uri->path); + efreet_uri_free(uri); + } + else + { + file = filename; + } + + if ((!video_has_video_get(inf->vid)) && (video_has_audio_get(inf->vid))) + { + char *path = albumart_file_get(file); + if (path) + { + if (ecore_file_exists(path)) + { + win_art(win, path); + free(path); + return EINA_TRUE; + } + + Evas_Object *artwork = video_meta_artwork_get(inf->vid, file, EMOTION_ARTWORK_PREVIEW_IMAGE); + if (!artwork) artwork = video_meta_artwork_get(inf->vid, file, EMOTION_ARTWORK_IMAGE); + + if (artwork) + { + evas_object_image_save(artwork, path, NULL, NULL); + evas_object_del(artwork); + free(path); + } + else + { + free(path); + return EINA_FALSE; + } + } + } + + + return EINA_TRUE; +} + static Eina_Bool _cb_albumart_delay(void *data) { @@ -230,7 +287,6 @@ _cb_albumart_delay(void *data) const char *title = video_meta_title_get(inf->vid); const char *artist = video_meta_artist_get(inf->vid); const char *album = video_meta_album_get(inf->vid); - albumart_find(file, title, artist, album, NULL, _cb_fetched, win); } else albumart_find(NULL, NULL, NULL, NULL, NULL, NULL, NULL); @@ -241,7 +297,6 @@ void win_do_play(Evas_Object *win) { Inf *inf = evas_object_data_get(win, "inf"); - video_play_set(inf->vid, EINA_TRUE); elm_layout_signal_emit(inf->lay, "action,play", "rage"); } @@ -678,8 +733,12 @@ win_show(Evas_Object *win, int w, int h) } evas_object_show(win); } - if (inf->albumart_timeout) ecore_timer_del(inf->albumart_timeout); - inf->albumart_timeout = ecore_timer_add(0.2, _cb_albumart_delay, win); + + if (!_local_artwork_get(win)) + { + if (inf->albumart_timeout) ecore_timer_del(inf->albumart_timeout); + inf->albumart_timeout = ecore_timer_add(0.2, _cb_albumart_delay, win); + } if (!video_has_video_get(inf->vid)) elm_layout_signal_emit(inf->lay, "state,novideo", "rage");