Commit 291b59b6 authored by Yoann Peronneau's avatar Yoann Peronneau

* src/input/subtitles.c: corrected bug in subtitle detection

* src/libvlc.h: modified subtitle paths for Windows 
parent b24bd76d
......@@ -151,54 +151,28 @@ static int compare_sub_priority( const void *a, const void *b )
}
/**
* Detect subtitle files.
*
* When called this function will split up the psz_fname string into a
* directory, filename and extension. It then opens the directory
* in which the file resides and tries to find possible matches of
* subtitles files.
*
* \ingroup Demux
* \param p_this the calling \ref input_thread_t
* \param psz_path a list of subdirectories (separated by a ',') to look in.
* \param psz_fname the complete filename to base the search on.
* \return a NULL terminated array of filenames with detected possible subtitles.
* The array contains max MAX_SUBTITLE_FILES items and you need to free it after use.
* Convert a list of paths separated by ',' to a char**
*/
char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
char *psz_fname )
static char **paths_to_list( char *psz_dir, char *psz_path )
{
/* variables to be used for derivatives of psz_fname */
char *f_dir, *f_fname, *f_fname_noext, *f_fname_trim, *tmp;
/* variables to be used for derivatives FILE *f */
char *tmp_fname_noext, *tmp_fname_trim, *tmp_fname_ext, *tmpresult;
vlc_value_t fuzzy;
int len, i, j, i_sub_count, i_nb_subdirs;
unsigned int k, i_max_sub_len;
subfn *result; /* unsorted results */
char **result2; /* sorted results */
unsigned int i, k, i_nb_subdirs;
char **subdirs; /* list of subdirectories to look in */
FILE *f;
DIR *d;
struct dirent *de;
i_nb_subdirs = 1;
for( k = 0; k < strlen( psz_path ); k++ )
{
if( psz_path[k] == ',' )
if( psz_path[k] == ',' )
{
i_nb_subdirs++;
}
}
i_max_sub_len = 0;
if( i_nb_subdirs > 0 )
{
char *psz_parser;
subdirs = (char**)malloc( sizeof(char*) * i_nb_subdirs );
char *psz_parser, *psz_temp;
subdirs = (char**)malloc( sizeof(char*) * ( i_nb_subdirs + 1 ) );
memset( subdirs, 0, sizeof(char*) * ( i_nb_subdirs + 1 ) );
i = 0;
psz_parser = psz_path;
while( psz_parser && *psz_parser )
......@@ -215,23 +189,66 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
psz_parser++;
}
}
subdirs[i] = strdup( psz_subdir );
i++;
if( strlen( psz_subdir ) > i_max_sub_len )
if( strlen( psz_subdir ) > 0 )
{
i_max_sub_len = strlen( psz_subdir );
psz_temp = (char *)malloc( strlen(psz_dir)
+ strlen(psz_subdir) + 2 );
if( psz_temp )
{
sprintf( psz_temp, "%s%s%c",
psz_subdir[0] == '.' ? psz_dir : "",
psz_subdir,
psz_subdir[strlen(psz_subdir) - 1] ==
DIRECTORY_SEPARATOR ? '\0' : DIRECTORY_SEPARATOR );
subdirs[i] = psz_temp;
i++;
}
}
}
}
else
subdirs[i] = NULL;
}
else
{
i_nb_subdirs = -1;
subdirs = NULL;
}
return subdirs;
}
/**
* Detect subtitle files.
*
* When called this function will split up the psz_fname string into a
* directory, filename and extension. It then opens the directory
* in which the file resides and tries to find possible matches of
* subtitles files.
*
* \ingroup Demux
* \param p_this the calling \ref input_thread_t
* \param psz_path a list of subdirectories (separated by a ',') to look in.
* \param psz_fname the complete filename to base the search on.
* \return a NULL terminated array of filenames with detected possible subtitles.
* The array contains max MAX_SUBTITLE_FILES items and you need to free it after use.
*/
char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
char *psz_fname )
{
/* variables to be used for derivatives of psz_fname */
char *f_dir, *f_fname, *f_fname_noext, *f_fname_trim, *tmp;
/* variables to be used for derivatives FILE *f */
char *tmp_fname_noext, *tmp_fname_trim, *tmp_fname_ext, *tmpresult;
vlc_value_t fuzzy;
int len, i, j, i_sub_count;
subfn *result; /* unsorted results */
char **result2; /* sorted results */
char **tmp_subdirs, **subdirs; /* list of subdirectories to look in */
FILE *f;
DIR *d;
struct dirent *de;
i_sub_count = 0;
len = ( strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256 ) +
( i_max_sub_len > 256 ? i_max_sub_len : 256 ) + 2;
len = strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256;
f_dir = (char*)malloc(len);
f_fname = (char*)malloc(len);
......@@ -269,38 +286,18 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
strcpy_trim( f_fname_trim, f_fname_noext );
var_Get( p_this, "sub-autodetect-fuzzy", &fuzzy );
tmp_subdirs = paths_to_list( f_dir, psz_path );
subdirs = tmp_subdirs;
for( j = -1; j < i_nb_subdirs; j++)
for( j = -1; j == -1 || ( j >= 0 && subdirs != NULL && *subdirs != NULL );
j++)
{
if( j >= 0 )
{
if( subdirs[j] && subdirs[j][0] == '.' )
{
char* psz_dir;
psz_dir = (char *)malloc( len );
if( psz_dir )
{
sprintf( psz_dir, "%s%s", f_dir, subdirs[j] );
d = opendir( psz_dir );
free( psz_dir );
}
else d = NULL;
}
else
{
d = opendir( subdirs[j] );
}
}
else
{
d = opendir( f_dir );
}
d = opendir( j < 0 ? f_dir : *subdirs );
if( d )
{
int b_found;
msg_Dbg( p_this, "looking for a subtitle file in %s",
j < 0 ? f_dir : subdirs[j] );
j < 0 ? f_dir : *subdirs );
while( ( de = readdir( d ) ) )
{
/* retrieve various parts of the filename */
......@@ -355,7 +352,7 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
if( i_prio >= fuzzy.i_int )
{
sprintf( tmpresult, "%s%s", j == 0 ? f_dir : psz_path,
sprintf( tmpresult, "%s%s", j == -1 ? f_dir : *subdirs,
de->d_name );
msg_Dbg( p_this, "autodetected subtitle: %s with "
"priority %d", de->d_name, i_prio );
......@@ -372,9 +369,10 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
}
closedir( d );
}
free( *subdirs++ );
}
if( subdirs ) free( subdirs );
if( tmp_subdirs ) free( tmp_subdirs );
free( f_dir );
free( f_fname );
......
......@@ -847,7 +847,7 @@ vlc_module_begin();
add_integer( "sub-autodetect-fuzzy", 3, NULL,
SUB_FUZZY_TEXT, SUB_FUZZY_LONGTEXT, VLC_TRUE );
#if defined( WIN32 )
add_string( "sub-autodetect-path", ".\\Subtitles, .\\subtitles", NULL,
add_string( "sub-autodetect-path", ".\\subtitles", NULL,
#else
add_string( "sub-autodetect-path", "./Subtitles, ./subtitles", NULL,
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment