From e4b58df6216824a08c3eddfcbe91eda39f6a5a51 Mon Sep 17 00:00:00 2001 From: Thomas Guillem <thomas@gllm.fr> Date: Mon, 18 May 2015 16:01:03 +0200 Subject: [PATCH] playlist: don't play directories that can loop into themselves --- include/vlc_input_item.h | 1 + modules/demux/playlist/directory.c | 6 +++++- src/input/item.c | 1 + src/playlist/item.c | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h index 60dce6efcc26..f86c40533e13 100644 --- a/include/vlc_input_item.h +++ b/include/vlc_input_item.h @@ -122,6 +122,7 @@ struct input_item_node_t input_item_node_t **pp_children; input_item_node_t *p_parent; input_item_compar_cb compar_cb; + bool b_can_loop; }; VLC_API void input_item_CopyOptions( input_item_t *p_parent, input_item_t *p_child ); diff --git a/modules/demux/playlist/directory.c b/modules/demux/playlist/directory.c index 51d39279f5c8..5c835bb44975 100644 --- a/modules/demux/playlist/directory.c +++ b/modules/demux/playlist/directory.c @@ -36,6 +36,7 @@ struct demux_sys_t { bool b_dir_sorted; + bool b_dir_can_loop; }; /***************************************************************************** @@ -50,14 +51,16 @@ int Import_Dir ( vlc_object_t *p_this) bool b_is_dir = false; bool b_dir_sorted = false; + bool b_dir_can_loop = false; int i_err = stream_Control( p_demux->s, STREAM_IS_DIRECTORY, &b_is_dir, - &b_dir_sorted, NULL ); + &b_dir_sorted, &b_dir_can_loop ); if ( !( i_err == VLC_SUCCESS && b_is_dir ) ) return VLC_EGENERIC; STANDARD_DEMUX_INIT_MSG( "reading directory content" ); p_demux->p_sys->b_dir_sorted = b_dir_sorted; + p_demux->p_sys->b_dir_can_loop = b_dir_can_loop; return VLC_SUCCESS; } @@ -153,6 +156,7 @@ static int Demux( demux_t *p_demux ) p_input = GetCurrentItem( p_demux ); p_node = input_item_node_Create( p_input ); + p_node->b_can_loop = p_demux->p_sys->b_dir_can_loop; input_item_Release(p_input); b_show_hiddenfiles = var_InheritBool( p_demux, "show-hiddenfiles" ); diff --git a/src/input/item.c b/src/input/item.c index 10e7216211eb..2dd8ca0fee96 100644 --- a/src/input/item.c +++ b/src/input/item.c @@ -1102,6 +1102,7 @@ input_item_node_t *input_item_node_Create( input_item_t *p_input ) p_node->p_parent = NULL; p_node->i_children = 0; p_node->pp_children = NULL; + p_node->b_can_loop = false; return p_node; } diff --git a/src/playlist/item.c b/src/playlist/item.c index 5ce59f3a4068..8d54e86f8919 100644 --- a/src/playlist/item.c +++ b/src/playlist/item.c @@ -150,6 +150,22 @@ static void input_item_add_subitem_tree ( const vlc_event_t * p_event, } else { + /* Don't Play a directory if it can loop into a parent */ + if( p_new_root->b_can_loop ) + { + /* Play the first regular file */ + for( ; pos < last_pos; pos++ ) + { + if( p_item->pp_children[pos]->p_input->i_type != ITEM_TYPE_DIRECTORY ) + break; + } + if( last_pos == pos ) + { + PL_UNLOCK; + playlist_Stop( p_playlist ); + return; + } + } p_play_item = p_item->pp_children[pos]; /* NOTE: this is a work around the general bug: if node-to-be-played contains sub-nodes, then second instead -- GitLab