summaryrefslogtreecommitdiffstats
path: root/apps/plugins/properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/properties.c')
-rw-r--r--apps/plugins/properties.c94
1 files changed, 66 insertions, 28 deletions
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);