📄 directory.c
字号:
* DemuxOpen: *****************************************************************************/static int Control( access_t *p_access, int i_query, va_list args ){ vlc_bool_t *pb_bool; int *pi_int; int64_t *pi_64; switch( i_query ) { /* */ case ACCESS_CAN_SEEK: case ACCESS_CAN_FASTSEEK: case ACCESS_CAN_PAUSE: case ACCESS_CAN_CONTROL_PACE: pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* ); *pb_bool = VLC_FALSE; /* FIXME */ break; /* */ case ACCESS_GET_MTU: pi_int = (int*)va_arg( args, int * ); *pi_int = 0; break; case ACCESS_GET_PTS_DELAY: pi_64 = (int64_t*)va_arg( args, int64_t * ); *pi_64 = DEFAULT_PTS_DELAY * 1000; break; /* */ case ACCESS_SET_PAUSE_STATE: case ACCESS_GET_TITLE_INFO: case ACCESS_SET_TITLE: case ACCESS_SET_SEEKPOINT: case ACCESS_SET_PRIVATE_ID_STATE: return VLC_EGENERIC; default: msg_Warn( p_access, "unimplemented query in control" ); return VLC_EGENERIC; } return VLC_SUCCESS;}/***************************************************************************** * DemuxOpen: *****************************************************************************/static int DemuxOpen ( vlc_object_t *p_this ){ demux_t *p_demux = (demux_t*)p_this; if( strcmp( p_demux->psz_demux, "directory" ) ) return VLC_EGENERIC; p_demux->pf_demux = Demux; p_demux->pf_control = DemuxControl; return VLC_SUCCESS;}/***************************************************************************** * Demux: EOF *****************************************************************************/static int Demux( demux_t *p_demux ){ return 0;}/***************************************************************************** * DemuxControl: *****************************************************************************/static int DemuxControl( demux_t *p_demux, int i_query, va_list args ){ return demux2_vaControlHelper( p_demux->s, 0, 0, 0, 1, i_query, args );}#if defined(SYS_BEOS) || defined(WIN32)/* BeOS doesn't have scandir/alphasort/versionsort */static int alphasort( const struct dirent **a, const struct dirent **b ){ return strcoll( (*a)->d_name, (*b)->d_name );}static int scandir( const char *name, struct dirent ***namelist, int (*filter) ( const struct dirent * ), int (*compar) ( const struct dirent **, const struct dirent ** ) ){ DIR * p_dir; struct dirent * p_content; struct dirent ** pp_list; int ret, size; if( !namelist || !( p_dir = opendir( name ) ) ) return -1; ret = 0; pp_list = NULL; while( ( p_content = readdir( p_dir ) ) ) { if( filter && !filter( p_content ) ) { continue; } pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) ); size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1; pp_list[ret] = malloc( size ); memcpy( pp_list[ret], p_content, size ); ret++; } closedir( p_dir ); if( compar ) { qsort( pp_list, ret, sizeof( struct dirent * ), (int (*)(const void *, const void *)) compar ); } *namelist = pp_list; return ret;}#endifstatic int Filter( const struct dirent *foo ){ return VLC_TRUE;}/***************************************************************************** * ReadDir: read a directory and add its content to the list *****************************************************************************/static int ReadDir( playlist_t *p_playlist, char *psz_name , int i_mode, int *pi_position, playlist_item_t *p_parent ){ struct dirent **pp_dir_content; int i_dir_content, i; playlist_item_t *p_node; /* Build array with ignores */#ifdef HAVE_STRSEP char **ppsz_extensions = 0; int i_extensions = 0; char *psz_ignore = var_CreateGetString( p_playlist, "ignore-filetypes" ); if( psz_ignore && *psz_ignore ) { char *psz_backup; char *psz_parser = psz_backup = strdup( psz_ignore ); int a = 0; while( strsep( &psz_parser, "," ) ) i_extensions++; free( psz_backup ); ppsz_extensions = (char **)malloc( sizeof( char * ) * i_extensions ); psz_parser = psz_ignore; while( a < i_extensions && ( ppsz_extensions[a++] = strsep( &psz_parser, "," ) ) ); }#endif /* HAVE_STRSEP */ /* Change the item to a node */ if( p_parent->i_children == -1 ) { playlist_LockItemToNode( p_playlist,p_parent ); } /* get the first directory entry */ i_dir_content = scandir( psz_name, &pp_dir_content, Filter, alphasort ); if( i_dir_content == -1 ) { msg_Warn( p_playlist, "Failed to read directory" ); return VLC_EGENERIC; } else if( i_dir_content <= 0 ) { /* directory is empty */ return VLC_SUCCESS; } /* While we still have entries in the directory */ for( i = 0; i < i_dir_content; i++ ) { struct dirent *p_dir_content = pp_dir_content[i]; int i_size_entry = strlen( psz_name ) + strlen( p_dir_content->d_name ) + 2; char *psz_uri = (char *)malloc( sizeof(char) * i_size_entry ); sprintf( psz_uri, "%s/%s", psz_name, p_dir_content->d_name ); /* if it starts with '.' then forget it */ if( p_dir_content->d_name[0] != '.' ) {#if defined( S_ISDIR ) struct stat stat_data; stat( psz_uri, &stat_data ); if( S_ISDIR(stat_data.st_mode) && i_mode != MODE_COLLAPSE )#elif defined( DT_DIR ) if( ( p_dir_content->d_type & DT_DIR ) && i_mode != MODE_COLLAPSE )#else if( 0 )#endif { if( i_mode == MODE_NONE ) { msg_Dbg( p_playlist, "Skipping subdirectory %s", psz_uri ); free( psz_uri ); continue; } else if( i_mode == MODE_EXPAND ) { char *psz_newname; msg_Dbg(p_playlist, "Reading subdirectory %s", psz_uri ); if( !strncmp( psz_uri, psz_name, strlen( psz_name ) ) ) { char *psz_subdir = psz_uri; /* Skip the parent path + the separator */ psz_subdir += strlen( psz_name ) + 1; psz_newname = strdup( psz_subdir ); } else { psz_newname = strdup( psz_uri ); } p_node = playlist_NodeCreate( p_playlist, p_parent->pp_parents[0]->i_view, psz_newname, p_parent ); playlist_CopyParents( p_parent, p_node ); p_node->input.i_type = ITEM_TYPE_DIRECTORY; if( ReadDir( p_playlist, psz_uri , MODE_EXPAND, pi_position, p_node ) != VLC_SUCCESS ) { return VLC_EGENERIC; } free( psz_newname ); } } else { playlist_item_t *p_item;#ifdef HAVE_STRSEP if( i_extensions > 0 ) { char *psz_dot = strrchr( p_dir_content->d_name, '.' ); if( psz_dot++ && *psz_dot ) { int a; for( a = 0; a < i_extensions; a++ ) { if( !strcmp( psz_dot, ppsz_extensions[a] ) ) break; } if( a < i_extensions ) { msg_Dbg( p_playlist, "Ignoring file %s", psz_uri ); free( psz_uri ); continue; } } }#endif /* HAVE_STRSEP */ p_item = playlist_ItemNewWithType( VLC_OBJECT(p_playlist), psz_uri, p_dir_content->d_name, ITEM_TYPE_VFILE ); playlist_NodeAddItem( p_playlist,p_item, p_parent->pp_parents[0]->i_view, p_parent, PLAYLIST_APPEND, PLAYLIST_END ); playlist_CopyParents( p_parent, p_item ); } } free( psz_uri ); }#ifdef HAVE_STRSEP if( ppsz_extensions ) free( ppsz_extensions ); if( psz_ignore ) free( psz_ignore );#endif /* HAVE_STRSEP */ free( pp_dir_content ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -