forked from len0rd/rockbox
[Feature] bookmark.ignore to selectively ignore or include directories
allows blacklist / whitelisting of bookmarks by directory Change-Id: I4eb684bb5775d1bba1c97b416e7d25e4763be553
This commit is contained in:
parent
c7dfb9f916
commit
a8f6ddc5ed
3 changed files with 94 additions and 16 deletions
|
@ -50,6 +50,14 @@
|
||||||
#define MAX_BOOKMARKS 10
|
#define MAX_BOOKMARKS 10
|
||||||
#define MAX_BOOKMARK_SIZE 350
|
#define MAX_BOOKMARK_SIZE 350
|
||||||
#define RECENT_BOOKMARK_FILE ROCKBOX_DIR "/most-recent.bmark"
|
#define RECENT_BOOKMARK_FILE ROCKBOX_DIR "/most-recent.bmark"
|
||||||
|
#define BOOKMARK_IGNORE "/bookmark.ignore"
|
||||||
|
#define BOOKMARK_UNIGNORE "/bookmark.unignore"
|
||||||
|
|
||||||
|
/* flags for write_bookmark() */
|
||||||
|
#define BMARK_WRITE 0x0
|
||||||
|
#define BMARK_ASK_USER 0x1
|
||||||
|
#define BMARK_CREATE_FILE 0x2
|
||||||
|
#define BMARK_CHECK_IGNORE 0x4
|
||||||
|
|
||||||
/* Used to buffer bookmarks while displaying the bookmark list. */
|
/* Used to buffer bookmarks while displaying the bookmark list. */
|
||||||
struct bookmark_list
|
struct bookmark_list
|
||||||
|
@ -539,6 +547,41 @@ static void get_track_resume_info(struct resume_info *resume_info)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------- */
|
||||||
|
/* This function checks for bookmark ignore and unignore files to allow */
|
||||||
|
/* directories to be ignored or included in bookmarks */
|
||||||
|
/* ----------------------------------------------------------------------- */
|
||||||
|
static bool bookmark_has_ignore(struct resume_info *resume_info)
|
||||||
|
{
|
||||||
|
if (!resume_info->id3)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
char *buf = global_temp_buffer;
|
||||||
|
size_t bufsz = sizeof(global_temp_buffer);
|
||||||
|
|
||||||
|
strmemccpy(buf, resume_info->id3->path, bufsz);
|
||||||
|
|
||||||
|
char *slash;
|
||||||
|
while ((slash = strrchr(buf, '/')))
|
||||||
|
{
|
||||||
|
size_t rem = bufsz - (slash - buf);
|
||||||
|
if (strmemccpy(slash, BOOKMARK_UNIGNORE, rem) != NULL && file_exists(buf))
|
||||||
|
{
|
||||||
|
/* unignore exists we want bookmarks */
|
||||||
|
logf("unignore bookmark found %s\n", buf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strmemccpy(slash, BOOKMARK_IGNORE, rem) != NULL && file_exists(buf))
|
||||||
|
{
|
||||||
|
/* ignore exists we do not want bookmarks */
|
||||||
|
logf("ignore bookmark found %s\n", buf);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*slash = '\0';
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* This function takes the current current resume information and writes */
|
/* This function takes the current current resume information and writes */
|
||||||
/* that to the beginning of the bookmark file. */
|
/* that to the beginning of the bookmark file. */
|
||||||
|
@ -550,12 +593,17 @@ static void get_track_resume_info(struct resume_info *resume_info)
|
||||||
/* possible that a bookmark is successfully added to the most recent */
|
/* possible that a bookmark is successfully added to the most recent */
|
||||||
/* bookmark list but fails to be added to the bookmark file or vice versa. */
|
/* bookmark list but fails to be added to the bookmark file or vice versa. */
|
||||||
/* ------------------------------------------------------------------------*/
|
/* ------------------------------------------------------------------------*/
|
||||||
static bool write_bookmark(bool create_bookmark_file)
|
static bool write_bookmark(unsigned int flags)
|
||||||
{
|
{
|
||||||
logf("%s", __func__);
|
logf("%s flags: %d", __func__, flags);
|
||||||
char bm_filename[MAX_PATH];
|
char bm_filename[MAX_PATH];
|
||||||
bool ret=true;
|
bool ret=true;
|
||||||
|
|
||||||
|
bool create_bookmark_file = flags & BMARK_CREATE_FILE;
|
||||||
|
bool check_ignore = flags & BMARK_CHECK_IGNORE;
|
||||||
|
bool ask_user = flags & BMARK_ASK_USER;
|
||||||
|
bool usemrb = global_settings.usemrb;
|
||||||
|
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
size_t namelen = 0;
|
size_t namelen = 0;
|
||||||
char* bm;
|
char* bm;
|
||||||
|
@ -564,8 +612,27 @@ static bool write_bookmark(bool create_bookmark_file)
|
||||||
if (bookmark_is_bookmarkable_state())
|
if (bookmark_is_bookmarkable_state())
|
||||||
{
|
{
|
||||||
get_track_resume_info(&resume_info);
|
get_track_resume_info(&resume_info);
|
||||||
|
|
||||||
|
if (check_ignore
|
||||||
|
&& (create_bookmark_file || ask_user || usemrb))
|
||||||
|
{
|
||||||
|
if (bookmark_has_ignore(&resume_info))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask_user)
|
||||||
|
{
|
||||||
|
if (yesno_pop(ID2P(LANG_AUTO_BOOKMARK_QUERY)))
|
||||||
|
{
|
||||||
|
if (global_settings.autocreatebookmark != BOOKMARK_RECENT_ONLY_ASK)
|
||||||
|
create_bookmark_file = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* writing the most recent bookmark */
|
/* writing the most recent bookmark */
|
||||||
if (global_settings.usemrb)
|
if (usemrb)
|
||||||
{
|
{
|
||||||
/* since we use the same buffer bookmark needs created each time */
|
/* since we use the same buffer bookmark needs created each time */
|
||||||
bm = create_bookmark(&name, &namelen, &resume_info);
|
bm = create_bookmark(&name, &namelen, &resume_info);
|
||||||
|
@ -1103,7 +1170,7 @@ bool bookmark_create_menu(void)
|
||||||
if (!bookmark_is_bookmarkable_state())
|
if (!bookmark_is_bookmarkable_state())
|
||||||
save_playlist_screen(NULL);
|
save_playlist_screen(NULL);
|
||||||
|
|
||||||
return write_bookmark(true);
|
return write_bookmark(BMARK_CREATE_FILE);
|
||||||
}
|
}
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* This function acts as the load interface from the context menu. */
|
/* This function acts as the load interface from the context menu. */
|
||||||
|
@ -1175,29 +1242,23 @@ bool bookmark_autobookmark(bool prompt_ok)
|
||||||
update = (global_settings.autoupdatebookmark && bookmark_exists());
|
update = (global_settings.autoupdatebookmark && bookmark_exists());
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
return write_bookmark(true);
|
return write_bookmark(BMARK_CREATE_FILE | BMARK_CHECK_IGNORE);
|
||||||
|
|
||||||
switch (global_settings.autocreatebookmark)
|
switch (global_settings.autocreatebookmark)
|
||||||
{
|
{
|
||||||
case BOOKMARK_YES:
|
case BOOKMARK_YES:
|
||||||
return write_bookmark(true);
|
return write_bookmark(BMARK_CREATE_FILE | BMARK_CHECK_IGNORE);
|
||||||
|
|
||||||
case BOOKMARK_NO:
|
case BOOKMARK_NO:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
case BOOKMARK_RECENT_ONLY_YES:
|
case BOOKMARK_RECENT_ONLY_YES:
|
||||||
return write_bookmark(false);
|
return write_bookmark(BMARK_CHECK_IGNORE);
|
||||||
}
|
}
|
||||||
const char *lines[]={ID2P(LANG_AUTO_BOOKMARK_QUERY)};
|
|
||||||
const struct text_message message={lines, 1};
|
|
||||||
|
|
||||||
if(prompt_ok && gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES)
|
if(prompt_ok)
|
||||||
{
|
return write_bookmark(BMARK_ASK_USER | BMARK_CHECK_IGNORE);
|
||||||
if (global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_ASK)
|
|
||||||
return write_bookmark(false);
|
|
||||||
else
|
|
||||||
return write_bookmark(true);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,20 @@
|
||||||
the bookmark to load. There are other ways to load a bookmarks mentioned
|
the bookmark to load. There are other ways to load a bookmarks mentioned
|
||||||
below.
|
below.
|
||||||
|
|
||||||
|
You can also configure what directories will save bookmarks by creating a file
|
||||||
|
named 'bookmark.ignore' in a directory if you would like to never create a bookmark
|
||||||
|
when files are played from it.
|
||||||
|
|
||||||
|
\note{You can still manually create a bookmark but ignored directories will
|
||||||
|
not update existing bookmarks nor auto create them for files located
|
||||||
|
in ignored directories. }
|
||||||
|
|
||||||
|
The file 'bookmark.unignore' provides the opposite functionality.
|
||||||
|
For instance in the root of the drive you could create '/bookmark.ignore'
|
||||||
|
and no files played from this drive would get bookmarks.
|
||||||
|
If you then created '/podcasts/bookmark.unignore' tracks played from the podcast
|
||||||
|
directory would get bookmarks.
|
||||||
|
|
||||||
\note{If the current playlist has been modified or is unsaved, such as when
|
\note{If the current playlist has been modified or is unsaved, such as when
|
||||||
playing tracks from the \setting{Database}, Rockbox will automatically
|
playing tracks from the \setting{Database}, Rockbox will automatically
|
||||||
offer to save the playlist to a file when you attempt to create a bookmark.
|
offer to save the playlist to a file when you attempt to create a bookmark.
|
||||||
|
|
|
@ -395,6 +395,9 @@ sub buildzip {
|
||||||
# create the file so the talkclip generation skips this folder
|
# create the file so the talkclip generation skips this folder
|
||||||
open(IGNORE, ">$temp_dir/talkclips.ignore") || die "can't open talkclips.ignore";
|
open(IGNORE, ">$temp_dir/talkclips.ignore") || die "can't open talkclips.ignore";
|
||||||
close(IGNORE);
|
close(IGNORE);
|
||||||
|
# create the file so bookmark generation skips this folder
|
||||||
|
open(IGNORE, ">$temp_dir/bookmark.ignore") || die "can't open bookmark.ignore";
|
||||||
|
close(IGNORE);
|
||||||
|
|
||||||
# the samsung ypr0 has a loader script that's needed in the zip
|
# the samsung ypr0 has a loader script that's needed in the zip
|
||||||
if ($modelname =~ /samsungypr[01]/) {
|
if ($modelname =~ /samsungypr[01]/) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue