diff -ru herrie-2.1-orig/herrie-2.1/src/config.c herrie-2.1-filters-orig/herrie-2.1/src/config.c
--- herrie-2.1-orig/herrie-2.1/src/config.c 2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/config.c 2008-07-18 09:51:35.000000000 -0500
@@ -171,6 +171,8 @@
{ "scrobbler.username", "", NULL, NULL },
#endif /* BUILD_SCROBBLER */
{ "vfs.dir.hide_dotfiles", "yes", valid_bool, NULL },
+ { "vfs.dir.hide_extfiles", "no", valid_bool, NULL },
+ { "vfs.ext.whitelist", "mp3 wav ogg", NULL, NULL },
#ifdef G_OS_UNIX
{ "vfs.lockup.chroot", "", NULL, NULL },
{ "vfs.lockup.user", "", NULL, NULL },
diff -ru herrie-2.1-orig/herrie-2.1/src/playq.c herrie-2.1-filters-orig/herrie-2.1/src/playq.c
--- herrie-2.1-orig/herrie-2.1/src/playq.c 2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/playq.c 2008-07-18 10:16:04.000000000 -0500
@@ -259,12 +259,20 @@
playq_repeat = 1;
}
+ /* Create and compile Whitelist regex */
+ vfs_create_whitelist(config_getopt("vfs.ext.whitelist"));
+
filename = config_getopt("playq.dumpfile");
if (load_dumpfile && filename[0] != '\0') {
/* Autoload playlist */
vr = vfs_lookup(filename, NULL, NULL, 0);
if (vr != NULL) {
- vfs_unfold(&playq_list, vr);
+ if (config_getopt_bool("vfs.dir.hide_extfiles"))
+ vfs_unfold(&playq_list, vr, 1);
+ else {
+ /* Don't filter out files at this time */
+ vfs_unfold(&playq_list, vr, 0);
+ }
vfs_close(vr);
}
}
@@ -313,7 +321,7 @@
struct vfslist newlist = VFSLIST_INITIALIZER;
/* Recursively expand the item */
- vfs_unfold(&newlist, vr);
+ vfs_unfold(&newlist, vr, 1);
if (vfs_list_empty(&newlist))
return;
@@ -336,7 +344,7 @@
struct vfslist newlist = VFSLIST_INITIALIZER;
/* Recursively expand the item */
- vfs_unfold(&newlist, vr);
+ vfs_unfold(&newlist, vr, 1);
if (vfs_list_empty(&newlist))
return;
@@ -446,7 +454,7 @@
struct vfslist newlist = VFSLIST_INITIALIZER;
/* Recursively expand the item */
- vfs_unfold(&newlist, nvr);
+ vfs_unfold(&newlist, nvr, 1);
if (vfs_list_empty(&newlist))
return;
@@ -468,7 +476,7 @@
struct vfslist newlist = VFSLIST_INITIALIZER;
/* Recursively expand the item */
- vfs_unfold(&newlist, nvr);
+ vfs_unfold(&newlist, nvr, 1);
if (vfs_list_empty(&newlist))
return;
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs.c herrie-2.1-filters-orig/herrie-2.1/src/vfs.c
--- herrie-2.1-orig/herrie-2.1/src/vfs.c 2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs.c 2008-07-18 10:10:18.000000000 -0500
@@ -185,6 +185,11 @@
return g_string_free(npath, FALSE);
}
+struct vfsmatch * vfs_get_vm_whitelist()
+{
+ return vm_whitelist;
+}
+
const char *
vfs_lockup(void)
{
@@ -245,6 +250,27 @@
g_slice_free(struct vfsent, ve);
}
+void
+vfs_create_whitelist(const char* whitelist)
+{
+ char res[128] = "";
+ char *expr = "|[.]";
+ strcat(res, "[.]");
+
+ int i,j;
+ for (i=0,j=strlen(res); i < strlen(whitelist); i++) {
+ if (whitelist[i] == ' ') {
+ strcat(res, expr);
+ j+=strlen(expr);
+ }
+ else
+ res[j++] = whitelist[i];
+ }
+ res[j] = '\0';
+
+ vm_whitelist = vfs_match_new(res);
+}
+
struct vfsref *
vfs_lookup(const char *filename, const char *name, const char *basepath,
int strict)
@@ -363,7 +389,7 @@
}
void
-vfs_unfold(struct vfslist *vl, const struct vfsref *vr)
+vfs_unfold(struct vfslist *vl, const struct vfsref *vr, int useWhiteList)
{
struct vfsref *cvr;
@@ -374,8 +400,14 @@
/* See if we can recurse it */
vfs_populate(vr);
VFS_LIST_FOREACH(&vr->ent->population, cvr) {
- if (cvr->ent->recurse)
- vfs_unfold(vl, cvr);
+ if (cvr->ent->recurse) {
+ /* Ignore Whitelist if it is not valid
+ * Make sure directories aren't filtered
+ */
+ if (!useWhiteList || vm_whitelist == NULL || !vfs_playable(cvr) ||
+ vfs_match_compare(vm_whitelist, vfs_filename(cvr)))
+ vfs_unfold(vl, cvr, useWhiteList);
+ }
}
}
}
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs.h herrie-2.1-filters-orig/herrie-2.1/src/vfs.h
--- herrie-2.1-orig/herrie-2.1/src/vfs.h 2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs.h 2008-07-18 09:59:21.000000000 -0500
@@ -164,11 +164,21 @@
};
/**
+ * @brief The compiled regex for the whitelist
+ */
+static struct vfsmatch *vm_whitelist;
+
+/**
* @brief Contents of an empty VFS list structure.
*/
#define VFSLIST_INITIALIZER { NULL, NULL, 0 }
/**
+ * @brief Returns the whitelist
+ */
+struct vfsmatch * vfs_get_vm_whitelist();
+
+/**
* @brief Run-time initialize a VFS list structure.
*/
static inline void
@@ -362,6 +372,14 @@
const char *vfs_lockup(void);
/**
+ * @brief Create the compiled regex for the whitelist.
+ * The input string should be formatted similar to
+ * "ext1 ext2 ext3" and this will be converted into a
+ * Regular Expr like "[.]ext1|[.]ext2|[.]ext3".
+ */
+void vfs_create_whitelist(const char* whitelist);
+
+/**
* @brief Create a VFS reference from a filename. The name argument is
* optional. It only allows you to display entities with a
* different name (inside playlists). When setting the basepath
@@ -390,7 +408,7 @@
* @brief Recursively expand a VFS reference to all their usable
* children and append them to the specified list.
*/
-void vfs_unfold(struct vfslist *vl, const struct vfsref *vr);
+void vfs_unfold(struct vfslist *vl, const struct vfsref *vr, int useWhiteList);
/**
* @brief Recursively search through a VFS reference and add all
* matching objects to a list. The VFS reference itself will be
diff -ru herrie-2.1-orig/herrie-2.1/src/vfs_regular.c herrie-2.1-filters-orig/herrie-2.1/src/vfs_regular.c
--- herrie-2.1-orig/herrie-2.1/src/vfs_regular.c 2008-07-15 10:59:07.000000000 -0500
+++ herrie-2.1-filters-orig/herrie-2.1/src/vfs_regular.c 2008-07-18 10:03:06.000000000 -0500
@@ -73,9 +73,13 @@
GDir *dir;
const char *sfn;
struct vfsref *nvr, *svr;
- int hide_dotfiles;
+ struct vfsmatch *whitelist;
+ int hide_dotfiles, hide_extfiles;
hide_dotfiles = config_getopt_bool("vfs.dir.hide_dotfiles");
+ hide_extfiles = config_getopt_bool("vfs.dir.hide_extfiles");
+
+ whitelist = vfs_get_vm_whitelist();
if ((dir = g_dir_open(ve->filename, 0, NULL)) == NULL)
return (-1);
@@ -88,6 +92,11 @@
if ((nvr = vfs_lookup(sfn, NULL, ve->filename, 1)) == NULL)
continue;
+ /* Hide files (not directories) that are not whitelisted */
+ if (hide_extfiles && whitelist != NULL && vfs_playable(nvr) &&
+ !vfs_match_compare(whitelist, vfs_filename(nvr)))
+ continue;
+
/*
* Add the items to the tailq in a sorted manner.
*/
|