diff options
Diffstat (limited to 'audio/herrie/patches/herrie-2.1-filters.diff')
-rw-r--r-- | audio/herrie/patches/herrie-2.1-filters.diff | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/audio/herrie/patches/herrie-2.1-filters.diff b/audio/herrie/patches/herrie-2.1-filters.diff new file mode 100644 index 0000000000..36ef1fcc80 --- /dev/null +++ b/audio/herrie/patches/herrie-2.1-filters.diff @@ -0,0 +1,263 @@ +diff -ru herrie-2.1-autoquit/herrie-2.1/src/config.c herrie-2.1-filters/herrie-2.1/src/config.c +--- herrie-2.1-autoquit/herrie-2.1/src/config.c 2008-07-18 10:40:34.000000000 -0500 ++++ herrie-2.1-filters/herrie-2.1/src/config.c 2008-07-18 10:27:31.000000000 -0500 +@@ -172,6 +172,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-autoquit/herrie-2.1/src/playq.c herrie-2.1-filters/herrie-2.1/src/playq.c +--- herrie-2.1-autoquit/herrie-2.1/src/playq.c 2008-07-18 10:40:34.000000000 -0500 ++++ herrie-2.1-filters/herrie-2.1/src/playq.c 2008-07-18 10:53:53.000000000 -0500 +@@ -153,7 +153,7 @@ + /** + * @brief If true, quit when end of list reached + */ +-int playq_autoquit = 0; ++int playq_autoquit = 0; + + /** + * @brief Infinitely play music in the playlist, honouring the +@@ -182,19 +182,19 @@ + + /* Try to start a new song when we're not stopped */ + if (!(playq_flags & PF_STOP)) { +- if ((nvr = funcs->give()) != NULL) { +- /* We've got work to do */ +- break; +- } +- else { +- if (playq_autoquit_ready && playq_autoquit) { +- /* Time to quit - Send ourself the SIGTERM */ +- int res = getpid(); +- if (res !=0){ +- kill(res,SIGTERM); +- } +- } +- } ++ if ((nvr = funcs->give()) != NULL) { ++ /* We've got work to do */ ++ break; ++ } ++ else { ++ if (playq_autoquit_ready && playq_autoquit) { ++ /* Time to quit - Send ourself the SIGTERM */ ++ int res = getpid(); ++ if (res !=0){ ++ kill(res,SIGTERM); ++ } ++ } ++ } + } + + /* Wait for new events to occur */ +@@ -282,12 +282,20 @@ + if (autoquit || config_getopt_bool("playq.autoquit")) + playq_autoquit = 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); + } + } +@@ -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; + +@@ -359,7 +367,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; + +@@ -469,7 +477,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; + +@@ -491,7 +499,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-autoquit/herrie-2.1/src/vfs.c herrie-2.1-filters/herrie-2.1/src/vfs.c +--- herrie-2.1-autoquit/herrie-2.1/src/vfs.c 2008-07-15 10:59:07.000000000 -0500 ++++ herrie-2.1-filters/herrie-2.1/src/vfs.c 2008-07-18 10:27:31.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-autoquit/herrie-2.1/src/vfs.h herrie-2.1-filters/herrie-2.1/src/vfs.h +--- herrie-2.1-autoquit/herrie-2.1/src/vfs.h 2008-07-15 10:59:07.000000000 -0500 ++++ herrie-2.1-filters/herrie-2.1/src/vfs.h 2008-07-18 10:27:31.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-autoquit/herrie-2.1/src/vfs_regular.c herrie-2.1-filters/herrie-2.1/src/vfs_regular.c +--- herrie-2.1-autoquit/herrie-2.1/src/vfs_regular.c 2008-07-15 10:59:07.000000000 -0500 ++++ herrie-2.1-filters/herrie-2.1/src/vfs_regular.c 2008-07-18 10:27:31.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. + */ |