Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (12)
Showing
with 84 additions and 76 deletions
......@@ -130,12 +130,6 @@ struct input_item_t
bool b_net; /**< Net: always true for TYPE_STREAM, it
depends for others types */
int i_preparse_depth; /**< How many level of sub items can be preparsed:
-1: recursive, 0: none, >0: n levels */
bool b_preparse_interact; /**< Force interaction with the user when
preparsing.*/
void *libvlc_owner; /**< LibVLC private data, can only be set
before events are registered. */
};
......@@ -472,6 +466,10 @@ struct input_item_parser_cfg {
const input_item_parser_cbs_t *cbs;
/** Opaque data used by parser callbacks */
void *cbs_data;
/** true to parse subitems (from a folder or a playlist file) */
bool subitems;
/** true to trigger dialog interactions when needed */
bool interact;
};
/**
......@@ -525,6 +523,7 @@ typedef enum input_item_meta_request_option_t
META_REQUEST_OPTION_FETCH_ANY =
META_REQUEST_OPTION_FETCH_LOCAL|META_REQUEST_OPTION_FETCH_NETWORK,
META_REQUEST_OPTION_DO_INTERACT = 0x20,
META_REQUEST_OPTION_PARSE_SUBITEMS = 0x40,
} input_item_meta_request_option_t;
/* status of the on_preparse_ended() callback */
......
......@@ -901,9 +901,11 @@ vlc_playlist_PlayAt(vlc_playlist_t *playlist, size_t index)
*
* \param playlist the playlist (not necessarily locked)
* \param media the media to preparse
* \param parse_subitems true to parse subitems (from a folder or a playlist file)
*/
VLC_API void
vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *media);
vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *media,
bool parse_subitems);
/**
* Export the playlist to a file.
......
......@@ -767,6 +767,7 @@ int libvlc_media_parse_request(libvlc_instance_t *inst, libvlc_media_t *media,
parse_scope |= META_REQUEST_OPTION_FETCH_NETWORK;
if (parse_flag & libvlc_media_do_interact)
parse_scope |= META_REQUEST_OPTION_DO_INTERACT;
parse_scope |= META_REQUEST_OPTION_PARSE_SUBITEMS;
ret = libvlc_MetadataRequest(libvlc, item, parse_scope,
&preparser_callbacks, media,
......
......@@ -592,7 +592,8 @@ static const struct vlc_metadata_cbs preparseCallbacks = {
return libvlc_MetadataRequest(vlc_object_instance(getIntf()),
_vlcInputItem,
META_REQUEST_OPTION_SCOPE_ANY |
META_REQUEST_OPTION_FETCH_LOCAL,
META_REQUEST_OPTION_FETCH_LOCAL |
META_REQUEST_OPTION_PARSE_SUBITEMS,
&preparseCallbacks,
(__bridge void *)self,
-1, NULL);
......
......@@ -387,7 +387,7 @@ void DialogsProvider::mediaInfoDialog( const MLItemId& itemId )
const int result = libvlc_MetadataRequest( vlc_object_instance( p_intf ),
inputItem,
static_cast<input_item_meta_request_option_t>(META_REQUEST_OPTION_SCOPE_ANY | META_REQUEST_OPTION_SCOPE_FORCED),
static_cast<input_item_meta_request_option_t>(META_REQUEST_OPTION_SCOPE_ANY | META_REQUEST_OPTION_SCOPE_FORCED | META_REQUEST_OPTION_PARSE_SUBITEMS),
&cbs,
this,
0,
......
......@@ -236,9 +236,10 @@ medialibrary::parser::Status MetadataExtractor::run( medialibrary::parser::IItem
const struct input_item_parser_cfg cfg= {
.cbs = &cbs,
.cbs_data = std::addressof( ctx ),
.subitems = true,
.interact = false,
};
m_currentCtx = &ctx;
ctx.inputItem->i_preparse_depth = 1;
ctx.inputParser = {
input_item_Parse( m_obj, ctx.inputItem.get(), &cfg ),
&input_item_parser_id_Release
......
......@@ -162,8 +162,6 @@ static bool request_metadata_sync( libvlc_int_t *libvlc, input_item_t *media,
req.probe = false;
auto deadline = vlc_tick_now() + VLC_TICK_FROM_SEC( 15 );
media->i_preparse_depth = 1;
static const input_item_parser_cbs_t cbs = {
onParserEnded,
onParserSubtreeAdded,
......@@ -173,6 +171,8 @@ static bool request_metadata_sync( libvlc_int_t *libvlc, input_item_t *media,
const struct input_item_parser_cfg cfg= {
.cbs = &cbs,
.cbs_data = &req,
.subitems = true,
.interact = false,
};
auto inputParser = vlc::wrap_cptr( input_item_Parse( VLC_OBJECT( libvlc ), media, &cfg ),
......
......@@ -252,6 +252,7 @@ input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *p_item,
priv->cbs = cfg->cbs;
priv->cbs_data = cfg->cbs_data;
priv->type = cfg->type;
priv->preparse_subitems = cfg->preparsing.subitems;
priv->i_start = 0;
priv->i_stop = 0;
priv->i_title_offset = input_priv(p_input)->i_seekpoint_offset = 0;
......@@ -283,34 +284,16 @@ input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *p_item,
if( !p_item->p_stats )
p_item->p_stats = calloc( 1, sizeof(*p_item->p_stats) );
/* setup the preparse depth of the item
* if we are preparsing, use the i_preparse_depth of the parent item */
if( priv->type != INPUT_TYPE_PLAYBACK )
{
p_input->obj.logger = NULL;
p_input->obj.no_interact = true;
}
else
{
char *psz_rec = var_InheritString( p_parent, "recursive" );
if( psz_rec != NULL )
{
if ( !strcasecmp( psz_rec, "none" ) )
p_item->i_preparse_depth = 0;
else if ( !strcasecmp( psz_rec, "collapse" ) )
p_item->i_preparse_depth = 1;
else
p_item->i_preparse_depth = -1; /* default is expand */
free (psz_rec);
} else
p_item->i_preparse_depth = -1;
}
/* Make sure the interaction option is honored */
if( !var_InheritBool( p_input, "interact" ) )
p_input->obj.no_interact = true;
else if( p_item->b_preparse_interact )
else if( cfg->interact )
{
/* If true, this item was asked explicitly to interact with the user
* (via libvlc_MetadataRequest). Sub items created from this input won't
......@@ -437,7 +420,7 @@ static void *Preparse( void *data )
if( !Init( p_input ) )
{ /* if the demux is a playlist, call Mainloop that will call
* demux_Demux in order to fetch sub items */
if ( input_item_ShouldPreparseSubItems( priv->p_item )
if( priv->preparse_subitems
&& priv->master->p_demux->pf_readdir != NULL )
MainLoop( p_input, false );
End( p_input );
......
......@@ -334,6 +334,11 @@ struct vlc_input_thread_cfg
vlc_renderer_item_t *renderer;
const struct vlc_input_thread_callbacks *cbs;
void *cbs_data;
struct {
bool subitems;
} preparsing;
bool interact;
};
/**
* Create a new input_thread_t.
......@@ -441,6 +446,7 @@ typedef struct input_thread_private_t
void *cbs_data;
enum input_type type;
bool preparse_subitems;
/* Current state */
int i_state;
......
......@@ -398,17 +398,6 @@ bool input_item_IsArtFetched( input_item_t *p_item )
return b_fetched;
}
bool input_item_ShouldPreparseSubItems( input_item_t *p_item )
{
bool b_ret;
vlc_mutex_lock( &p_item->lock );
b_ret = p_item->i_preparse_depth == -1 ? true : p_item->i_preparse_depth > 0;
vlc_mutex_unlock( &p_item->lock );
return b_ret;
}
input_item_t *input_item_Hold( input_item_t *p_item )
{
input_item_owner_t *owner = item_owner(p_item);
......@@ -1206,20 +1195,9 @@ void input_item_node_Delete( input_item_node_t *p_node )
input_item_node_t *input_item_node_AppendItem( input_item_node_t *p_node, input_item_t *p_item )
{
int i_preparse_depth;
input_item_node_t *p_new_child = input_item_node_Create( p_item );
if( !p_new_child ) return NULL;
vlc_mutex_lock( &p_node->p_item->lock );
i_preparse_depth = p_node->p_item->i_preparse_depth;
vlc_mutex_unlock( &p_node->p_item->lock );
vlc_mutex_lock( &p_item->lock );
p_item->i_preparse_depth = i_preparse_depth > 0 ?
i_preparse_depth -1 :
i_preparse_depth;
vlc_mutex_unlock( &p_item->lock );
input_item_node_AppendNode( p_node, p_new_child );
return p_new_child;
}
......
......@@ -28,7 +28,6 @@
void input_item_UpdateTracksInfo( input_item_t *item, const es_format_t *fmt,
const char *es_id, bool stable );
bool input_item_ShouldPreparseSubItems( input_item_t *p_i );
typedef struct input_item_owner
{
......
......@@ -108,6 +108,8 @@ input_item_Parse(vlc_object_t *obj, input_item_t *item,
.type = INPUT_TYPE_PREPARSING,
.cbs = &input_cbs,
.cbs_data = parser,
.preparsing.subitems = cfg->subitems,
.interact = cfg->interact,
};
parser->input = input_Create(obj, item, &input_cfg );
if (!parser->input || input_Start(parser->input))
......
......@@ -487,11 +487,6 @@ int libvlc_MetadataRequest(libvlc_int_t *libvlc, input_item_t *item,
if (unlikely(priv->parser == NULL))
return VLC_ENOMEM;
vlc_mutex_lock( &item->lock );
if( item->i_preparse_depth == 0 )
item->i_preparse_depth = 1;
vlc_mutex_unlock( &item->lock );
return vlc_MetadataRequest(libvlc, item, i_options, cbs, cbs_userdata, timeout, id);
}
......
......@@ -350,9 +350,9 @@ vlc_media_tree_Preparse(vlc_media_tree_t *tree, libvlc_int_t *libvlc,
VLC_UNUSED(id);
VLC_UNUSED(preparser_callbacks);
#else
media->i_preparse_depth = 1;
vlc_MetadataRequest(libvlc, media, META_REQUEST_OPTION_SCOPE_ANY |
META_REQUEST_OPTION_DO_INTERACT,
META_REQUEST_OPTION_DO_INTERACT |
META_REQUEST_OPTION_PARSE_SUBITEMS,
&preparser_callbacks, tree, 0, id);
#endif
}
......
......@@ -58,7 +58,8 @@ vlc_playlist_ItemsReset(vlc_playlist_t *playlist)
}
static void
vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index, size_t count)
vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index, size_t count,
bool subitems)
{
if (playlist->order == VLC_PLAYLIST_PLAYBACK_ORDER_RANDOM)
randomizer_Add(&playlist->randomizer,
......@@ -79,7 +80,7 @@ vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index, size_t count)
for (size_t i = index; i < index + count; ++i)
{
vlc_playlist_item_t *item = playlist->items.data[i];
vlc_playlist_AutoPreparse(playlist, item->media);
vlc_playlist_AutoPreparse(playlist, item->media, subitems);
}
}
......@@ -175,7 +176,8 @@ vlc_playlist_ItemReplaced(vlc_playlist_t *playlist, size_t index)
&playlist->items.data[index], 1);
vlc_playlist_state_NotifyChanges(playlist, &state);
vlc_playlist_AutoPreparse(playlist, playlist->items.data[index]->media);
vlc_playlist_AutoPreparse(playlist, playlist->items.data[index]->media,
false);
}
size_t
......@@ -282,7 +284,7 @@ vlc_playlist_Insert(vlc_playlist_t *playlist, size_t index,
return ret;
}
vlc_playlist_ItemsInserted(playlist, index, count);
vlc_playlist_ItemsInserted(playlist, index, count, true);
vlc_playlist_UpdateNextMedia(playlist);
return VLC_SUCCESS;
......@@ -379,7 +381,7 @@ vlc_playlist_Expand(vlc_playlist_t *playlist, size_t index,
vlc_vector_remove_slice(&playlist->items, index + 1, count - 1);
return ret;
}
vlc_playlist_ItemsInserted(playlist, index + 1, count - 1);
vlc_playlist_ItemsInserted(playlist, index + 1, count - 1, false);
}
if ((ssize_t) index == playlist->current)
......
......@@ -54,6 +54,7 @@ vlc_playlist_New(vlc_object_t *parent)
playlist->repeat = VLC_PLAYLIST_PLAYBACK_REPEAT_NONE;
playlist->order = VLC_PLAYLIST_PLAYBACK_ORDER_NORMAL;
playlist->idgen = 0;
playlist->recursive = VLC_PLAYLIST_RECURSIVE_COLLAPSE;
#ifdef TEST_PLAYLIST
playlist->libvlc = NULL;
playlist->auto_preparse = false;
......@@ -61,6 +62,16 @@ vlc_playlist_New(vlc_object_t *parent)
assert(parent);
playlist->libvlc = vlc_object_instance(parent);
playlist->auto_preparse = var_InheritBool(parent, "auto-preparse");
char *rec = var_InheritString(parent, "recursive");
if (rec != NULL)
{
if (!strcasecmp(rec, "none"))
playlist->recursive = VLC_PLAYLIST_RECURSIVE_NONE;
else if (!strcasecmp(rec, "expand"))
playlist->recursive = VLC_PLAYLIST_RECURSIVE_EXPAND;
free(rec);
}
#endif
return playlist;
......
......@@ -44,12 +44,20 @@ typedef struct input_item_t input_item_t;
typedef struct VLC_VECTOR(vlc_playlist_item_t *) playlist_item_vector_t;
enum vlc_playlist_recursive_parsing
{
VLC_PLAYLIST_RECURSIVE_NONE,
VLC_PLAYLIST_RECURSIVE_COLLAPSE,
VLC_PLAYLIST_RECURSIVE_EXPAND,
};
struct vlc_playlist
{
vlc_player_t *player;
libvlc_int_t *libvlc;
enum vlc_playlist_media_stopped_action stopped_action;
bool auto_preparse;
enum vlc_playlist_recursive_parsing recursive;
/* all remaining fields are protected by the lock of the player */
struct vlc_player_listener_id *player_listener;
playlist_item_vector_t items;
......
......@@ -112,7 +112,8 @@ static const struct vlc_metadata_cbs preparser_callbacks = {
};
void
vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *input)
vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *input,
bool parse_subitems)
{
#ifdef TEST_PLAYLIST
VLC_UNUSED(playlist);
......@@ -120,16 +121,34 @@ vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *input)
VLC_UNUSED(preparser_callbacks);
#else
/* vlc_MetadataRequest is not exported */
vlc_MetadataRequest(playlist->libvlc, input,
META_REQUEST_OPTION_SCOPE_LOCAL |
META_REQUEST_OPTION_FETCH_LOCAL,
input_item_meta_request_option_t options =
META_REQUEST_OPTION_SCOPE_LOCAL | META_REQUEST_OPTION_FETCH_LOCAL;
if (parse_subitems)
options |= META_REQUEST_OPTION_PARSE_SUBITEMS;
vlc_MetadataRequest(playlist->libvlc, input, options,
&preparser_callbacks, playlist, -1, NULL);
#endif
}
void
vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input)
vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
bool parse_subitems)
{
if (playlist->auto_preparse && !input_item_IsPreparsed(input))
vlc_playlist_Preparse(playlist, input);
{
switch (playlist->recursive)
{
case VLC_PLAYLIST_RECURSIVE_NONE:
parse_subitems = false;
break;
case VLC_PLAYLIST_RECURSIVE_COLLAPSE:
break;
case VLC_PLAYLIST_RECURSIVE_EXPAND:
parse_subitems = true;
break;
default: vlc_assert_unreachable();
}
vlc_playlist_Preparse(playlist, input, parse_subitems);
}
}
......@@ -27,7 +27,8 @@ typedef struct vlc_playlist vlc_playlist_t;
typedef struct input_item_node_t input_item_node_t;
void
vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input);
vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
bool parse_subitems);
int
vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
......
......@@ -224,6 +224,8 @@ Parse(struct task *task, vlc_tick_t deadline)
const struct input_item_parser_cfg cfg = {
.cbs = &cbs,
.cbs_data = task,
.subitems = task->options & META_REQUEST_OPTION_PARSE_SUBITEMS,
.interact = task->options & META_REQUEST_OPTION_DO_INTERACT,
};
task->parser = input_item_Parse(obj, task->item, &cfg);
if (!task->parser)
......@@ -358,8 +360,6 @@ int vlc_preparser_Push( vlc_preparser_t *preparser,
vlc_mutex_lock( &item->lock );
enum input_item_type_e i_type = item->i_type;
int b_net = item->b_net;
if( i_options & META_REQUEST_OPTION_DO_INTERACT )
item->b_preparse_interact = true;
vlc_mutex_unlock( &item->lock );
if (!(i_options & META_REQUEST_OPTION_SCOPE_FORCED))
......