/************************************************************************** * add_file_content (Public) **************************************************************************/ int libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist, const char * psz_uri ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_NewExt( psz_uri, _("Media Library"), 0, NULL, 0, -1 ); if( !p_input_item ) { libvlc_printerr( "Not enough memory" ); return -1; } p_md = libvlc_media_new_from_input_item( p_mlist->p_libvlc_instance, p_input_item ); if( !p_md ) { vlc_gc_decref( p_input_item ); return -1; } if( libvlc_media_list_add_media( p_mlist, p_md ) ) { #warning Missing error handling! /* printerr and leaks */ return -1; } input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item ); return 0; }
int playlist_MLLoad( playlist_t *p_playlist ) { input_item_t *p_input; char *psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } char *psz_file; if( asprintf( &psz_file, "%s" DIR_SEP "ml.xspf", psz_datadir ) == -1 ) psz_file = NULL; free( psz_datadir ); if( psz_file == NULL ) return VLC_ENOMEM; /* lousy check for media library file */ struct stat st; if( vlc_stat( psz_file, &st ) ) { free( psz_file ); return VLC_EGENERIC; } char *psz_uri = vlc_path2uri( psz_file, "file/xspf-open" ); free( psz_file ); if( psz_uri == NULL ) return VLC_ENOMEM; p_input = input_item_New( psz_uri, _("Media Library") ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_media_library->p_input ) vlc_gc_decref( p_playlist->p_media_library->p_input ); p_playlist->p_media_library->p_input = p_input; vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); PL_UNLOCK; vlc_object_t *dummy = vlc_object_create( p_playlist, sizeof (*dummy) ); var_Create( dummy, "meta-file", VLC_VAR_VOID ); input_Read( dummy, p_input ); vlc_object_release( dummy ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); return VLC_SUCCESS; }
/***************************************************************************** * Run: *****************************************************************************/ static void *Run( void *data ) { services_discovery_t *p_sd = data; services_discovery_sys_t *p_sys = p_sd->p_sys; int canc = vlc_savecancel(); int num_dir = sizeof( p_sys->psz_dir ) / sizeof( p_sys->psz_dir[0] ); for( int i = 0; i < num_dir; i++ ) { char* psz_dir = p_sys->psz_dir[i]; /* make sure the directory exists */ struct stat st; if( psz_dir == NULL || utf8_stat( psz_dir, &st ) || !S_ISDIR( st.st_mode ) ) continue; // TODO: make_URI is only for file://, what about dir:// ? // char* psz_uri = make_URI( psz_dir ); char* psz_uri; if( asprintf( &psz_uri, "dir://%s", psz_dir ) == -1 ) continue; input_item_t* p_root = input_item_New( p_sd, psz_uri, NULL ); if( p_sys->i_type == Picture ) input_item_AddOption( p_root, "ignore-filetypes=ini,db,lnk,txt", VLC_INPUT_OPTION_TRUSTED ); input_item_AddOption( p_root, "recursive=collapse", VLC_INPUT_OPTION_TRUSTED ); vlc_event_manager_t *p_em = &p_root->event_manager; vlc_event_attach( p_em, vlc_InputItemSubItemAdded, input_item_subitem_added, p_sd ); input_Read( p_sd, p_root ); vlc_event_detach( p_em, vlc_InputItemSubItemAdded, input_item_subitem_added, p_sd ); vlc_gc_decref( p_root ); free( psz_uri ); } vlc_restorecancel(canc); return NULL; }
int playlist_Import( playlist_t *p_playlist, const char *psz_file ) { input_item_t *p_input; const char *const psz_option = "meta-file"; char *psz_uri = make_URI( psz_file, NULL ); if( psz_uri == NULL ) return VLC_EGENERIC; p_input = input_item_NewExt( psz_uri, psz_file, 1, &psz_option, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END, true, false ); return input_Read( p_playlist, p_input ); }
/***************************************************************************** * AddSubitemsOfShoutItemURL: *****************************************************************************/ static void AddSubitemsOfShoutItemURL( services_discovery_t *p_sd, const struct shout_item_t * p_item, const char * psz_category ) { struct shout_category_t category = { p_sd, psz_category }; /* Create the item */ input_item_t *p_input = CreateInputItemFromShoutItem( p_sd, p_item ); /* Read every subitems, and add them in ItemAdded */ vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); input_Read( p_sd, p_input, true ); vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, ItemAdded, &category ); vlc_gc_decref( p_input ); }
/***************************************************************************** * Run: *****************************************************************************/ static void *Run( void *data ) { services_discovery_t *p_sd = data; services_discovery_sys_t *p_sys = p_sd->p_sys; int num_dir = sizeof( p_sys->psz_dir ) / sizeof( p_sys->psz_dir[0] ); for( int i = 0; i < num_dir; i++ ) { char* psz_dir = p_sys->psz_dir[i]; /* make sure the directory exists */ struct stat st; if( psz_dir == NULL || vlc_stat( psz_dir, &st ) || !S_ISDIR( st.st_mode ) ) continue; char* psz_uri = vlc_path2uri( psz_dir, "file" ); input_item_t* p_root = input_item_New( psz_uri, NULL ); if( p_sys->i_type == Picture ) input_item_AddOption( p_root, "ignore-filetypes=ini,db,lnk,txt", VLC_INPUT_OPTION_TRUSTED|VLC_INPUT_OPTION_UNIQUE ); input_item_AddOption( p_root, "recursive=collapse", VLC_INPUT_OPTION_TRUSTED|VLC_INPUT_OPTION_UNIQUE ); vlc_event_manager_t *p_em = &p_root->event_manager; vlc_event_attach( p_em, vlc_InputItemSubItemTreeAdded, input_subnode_added, p_sd ); input_Read( p_sd, p_root ); vlc_event_detach( p_em, vlc_InputItemSubItemTreeAdded, input_subnode_added, p_sd ); input_item_Release( p_root ); free( psz_uri ); } return NULL; }
int playlist_Import( playlist_t *p_playlist, const char *psz_file ) { input_item_t *p_input; char *psz_uri = vlc_path2uri( psz_file, NULL ); if( psz_uri == NULL ) return VLC_EGENERIC; p_input = input_item_New( psz_uri, psz_file ); free( psz_uri ); playlist_AddInput( p_playlist, p_input, false, true ); vlc_object_t *dummy = vlc_object_create( p_playlist, sizeof (*dummy) ); var_Create( dummy, "meta-file", VLC_VAR_VOID ); int ret = input_Read( dummy, p_input ); vlc_object_release( dummy ); return ret; }
/************************************************************************** * add_file_content (Public) **************************************************************************/ void libvlc_media_list_add_file_content( libvlc_media_list_t * p_mlist, const char * psz_uri, libvlc_exception_t * p_e ) { input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_NewExt( p_mlist->p_libvlc_instance->p_libvlc_int, psz_uri, _("Media Library"), 0, NULL, 0, -1 ); if( !p_input_item ) { libvlc_exception_raise( p_e ); libvlc_printerr( "Not enough memory" ); return; } p_md = libvlc_media_new_from_input_item( p_mlist->p_libvlc_instance, p_input_item, p_e ); if( !p_md ) { vlc_gc_decref( p_input_item ); return; } libvlc_media_list_add_media( p_mlist, p_md, p_e ); if( libvlc_exception_raised( p_e ) ) return; input_Read( p_mlist->p_libvlc_instance->p_libvlc_int, p_input_item ); return; }
int playlist_MLLoad( playlist_t *p_playlist ) { input_item_t *p_input; char *psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } char *psz_file; if( asprintf( &psz_file, "%s" DIR_SEP "ml.xspf", psz_datadir ) == -1 ) psz_file = NULL; free( psz_datadir ); if( psz_file == NULL ) return VLC_ENOMEM; /* loosy check for media library file */ struct stat st; if( vlc_stat( psz_file, &st ) ) { free( psz_file ); return VLC_EGENERIC; } char *psz_uri = make_URI( psz_file, "file/xspf-open" ); free( psz_file ); if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_tree_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_media_library->p_input ) vlc_gc_decref( p_playlist->p_media_library->p_input ); p_playlist->p_media_library->p_input = p_input; vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); return VLC_SUCCESS; }
int playlist_MLLoad( playlist_t *p_playlist ) { char *psz_datadir; char *psz_uri = NULL; input_item_t *p_input; if( !config_GetInt( p_playlist, "media-library") ) return VLC_SUCCESS; psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } if( asprintf( &psz_uri, "%s" DIR_SEP "ml.xspf", psz_datadir ) != -1 ) { /* loosy check for media library file */ struct stat st; int ret = utf8_stat( psz_uri , &st ); free( psz_uri ); if( ret ) { free( psz_datadir ); return VLC_EGENERIC; } } psz_uri = make_URI( psz_datadir ); free( psz_datadir ); psz_datadir = psz_uri; if( psz_datadir == NULL ) return VLC_EGENERIC; /* Force XSPF demux (psz_datadir was a path, now it is a file URI) */ if( asprintf( &psz_uri, "file/xspf-open%s/ml.xspf", psz_datadir+4 ) == -1 ) psz_uri = NULL; free( psz_datadir ); psz_datadir = NULL; if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( p_playlist, psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_ml_onelevel->p_input ) vlc_gc_decref( p_playlist->p_ml_onelevel->p_input ); if( p_playlist->p_ml_category->p_input ) vlc_gc_decref( p_playlist->p_ml_category->p_input ); p_playlist->p_ml_onelevel->p_input = p_playlist->p_ml_category->p_input = p_input; /* We save the input at two different place, incref */ vlc_gc_incref( p_input ); vlc_gc_incref( p_input ); vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); vlc_gc_decref( p_input ); return VLC_SUCCESS; }