From 32f365bf3cdcaadb22087041bfc44574737b557d Mon Sep 17 00:00:00 2001 From: Christian Soffke Date: Tue, 10 Jan 2023 18:50:05 +0100 Subject: database: make parent tables work with plugin Enables the use of PictureFlow and the Properties plugin with parent tables of ALLSUBENTRIES, such as an album or album artist, instead of individual tracks. Change-Id: I18c4779ed116a48c732ae32b9629e7e0d93ce7c8 --- apps/plugins/properties.c | 94 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 28 deletions(-) (limited to 'apps/plugins/properties.c') diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c index 46cf818fb4..7dacda3579 100644 --- a/apps/plugins/properties.c +++ b/apps/plugins/properties.c @@ -19,6 +19,11 @@ * ****************************************************************************/ #include "plugin.h" +#include "lib/id3.h" + +#ifdef HAVE_TAGCACHE +#include "lib/mul_id3.h" +#endif #if !defined(ARRAY_SIZE) #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0])) @@ -35,12 +40,16 @@ struct dir_stats { enum props_types { PROPS_FILE = 0, PROPS_ID3, + PROPS_MUL_ID3, PROPS_DIR }; static int props_type = PROPS_FILE; static struct mp3entry id3; +#ifdef HAVE_TAGCACHE +static int mul_id3_count; +#endif static char str_filename[MAX_PATH]; static char str_dirname[MAX_PATH]; @@ -118,14 +127,8 @@ static bool file_properties(const char* selected_file) rb->snprintf(str_time, sizeof str_time, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); - int fd = rb->open(selected_file, O_RDONLY); - if (fd >= 0) - { - if (rb->get_metadata(&id3, fd, selected_file)) - props_type = PROPS_ID3; - - rb->close(fd); - } + if (retrieve_id3(&id3, selected_file, false)) + props_type = PROPS_ID3; found = true; break; } @@ -369,6 +372,19 @@ static bool determine_file_or_dir(void) return false; } +#ifdef HAVE_TAGCACHE +bool mul_id3_add(const char *file_name) +{ + if (!retrieve_id3(&id3, file_name, false)) + return false; + + collect_id3(&id3, mul_id3_count == 0); + mul_id3_count++; + + return true; +} +#endif + enum plugin_status plugin_start(const void* parameter) { static struct dir_stats stats = @@ -380,40 +396,62 @@ enum plugin_status plugin_start(const void* parameter) }; const char *file = parameter; - if(!parameter || (file[0] != '/')) return PLUGIN_ERROR; + if(!parameter) + return PLUGIN_ERROR; #ifdef HAVE_TOUCHSCREEN rb->touchscreen_set_mode(rb->global_settings->touch_mode); #endif - const char* file_name = rb->strrchr(file, '/') + 1; - int dirlen = (file_name - file); +#ifdef HAVE_TAGCACHE + if (!rb->strcmp(file, MAKE_ACT_STR(ACTIVITY_DATABASEBROWSER))) /* db table selected */ + { + props_type = PROPS_MUL_ID3; + init_mul_id3(); + mul_id3_count = 0; - rb->strlcpy(str_dirname, file, dirlen + 1); - rb->snprintf(str_filename, sizeof str_filename, "%s", file+dirlen); + if (!rb->tagtree_subentries_do_action(&mul_id3_add) || mul_id3_count == 0) + return PLUGIN_ERROR; - if(!determine_file_or_dir()) - { - /* weird: we couldn't find the entry. This Should Never Happen (TM) */ - rb->splashf(0, "File/Dir not found: %s", file); - rb->action_userabort(TIMEOUT_BLOCK); - return PLUGIN_OK; + if (mul_id3_count > 1) /* otherwise, the retrieved id3 can be used as-is */ + write_id3_mul_tracks(&id3); } - - /* get the info depending on its_a_dir */ - if(!(props_type == PROPS_DIR ? dir_properties(file, &stats) : file_properties(file))) + else +#endif + if (file[0] == '/') /* single track selected */ { - /* something went wrong (to do: tell user what it was (nesting,...) */ - rb->splash(0, ID2P(LANG_PROPERTIES_FAIL)); - rb->action_userabort(TIMEOUT_BLOCK); - return PLUGIN_OK; + const char* file_name = rb->strrchr(file, '/') + 1; + int dirlen = (file_name - file); + + rb->strlcpy(str_dirname, file, dirlen + 1); + rb->snprintf(str_filename, sizeof str_filename, "%s", file+dirlen); + + if(!determine_file_or_dir()) + { + /* weird: we couldn't find the entry. This Should Never Happen (TM) */ + rb->splashf(0, "File/Dir not found: %s", file); + rb->action_userabort(TIMEOUT_BLOCK); + return PLUGIN_OK; + } + + /* get the info depending on its_a_dir */ + if(!(props_type == PROPS_DIR ? dir_properties(file, &stats) : file_properties(file))) + { + /* something went wrong (to do: tell user what it was (nesting,...) */ + rb->splash(0, ID2P(LANG_PROPERTIES_FAIL)); + rb->action_userabort(TIMEOUT_BLOCK); + return PLUGIN_OK; + } } + else + return PLUGIN_ERROR; FOR_NB_SCREENS(i) rb->viewportmanager_theme_enable(i, true, NULL); - bool usb = props_type == PROPS_ID3 ? rb->browse_id3(&id3, 0, 0, &tm) : - browse_file_or_dir(&stats); + bool usb = props_type == PROPS_ID3 ? rb->browse_id3(&id3, 0, 0, &tm) : + (props_type == PROPS_MUL_ID3 ? rb->browse_id3(&id3, 0, 0, NULL) : + browse_file_or_dir(&stats)); FOR_NB_SCREENS(i) rb->viewportmanager_theme_undo(i, false); -- cgit v1.2.3