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 ) ...@@ -151,54 +151,28 @@ static int compare_sub_priority( const void *a, const void *b )
} }
/** /**
* Detect subtitle files. * Convert a list of paths separated by ',' to a char**
*
* 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, static char **paths_to_list( char *psz_dir, char *psz_path )
char *psz_fname )
{ {
/* variables to be used for derivatives of psz_fname */ unsigned int i, k, i_nb_subdirs;
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 */
char **subdirs; /* list of subdirectories to look in */ char **subdirs; /* list of subdirectories to look in */
FILE *f;
DIR *d;
struct dirent *de;
i_nb_subdirs = 1; i_nb_subdirs = 1;
for( k = 0; k < strlen( psz_path ); k++ ) for( k = 0; k < strlen( psz_path ); k++ )
{ {
if( psz_path[k] == ',' ) if( psz_path[k] == ',' )
{ {
i_nb_subdirs++; i_nb_subdirs++;
} }
} }
i_max_sub_len = 0;
if( i_nb_subdirs > 0 ) if( i_nb_subdirs > 0 )
{ {
char *psz_parser; char *psz_parser, *psz_temp;
subdirs = (char**)malloc( sizeof(char*) * i_nb_subdirs ); subdirs = (char**)malloc( sizeof(char*) * ( i_nb_subdirs + 1 ) );
memset( subdirs, 0, sizeof(char*) * ( i_nb_subdirs + 1 ) );
i = 0; i = 0;
psz_parser = psz_path; psz_parser = psz_path;
while( psz_parser && *psz_parser ) while( psz_parser && *psz_parser )
...@@ -215,23 +189,66 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -215,23 +189,66 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
psz_parser++; psz_parser++;
} }
} }
subdirs[i] = strdup( psz_subdir ); if( strlen( psz_subdir ) > 0 )
i++;
if( strlen( psz_subdir ) > i_max_sub_len )
{ {
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++;
}
} }
} }
} subdirs[i] = NULL;
else }
else
{ {
i_nb_subdirs = -1;
subdirs = NULL; 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; i_sub_count = 0;
len = ( strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256 ) + len = strlen( psz_fname ) > 256 ? strlen( psz_fname ) : 256;
( i_max_sub_len > 256 ? i_max_sub_len : 256 ) + 2;
f_dir = (char*)malloc(len); f_dir = (char*)malloc(len);
f_fname = (char*)malloc(len); f_fname = (char*)malloc(len);
...@@ -269,38 +286,18 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -269,38 +286,18 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
strcpy_trim( f_fname_trim, f_fname_noext ); strcpy_trim( f_fname_trim, f_fname_noext );
var_Get( p_this, "sub-autodetect-fuzzy", &fuzzy ); 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 ) d = opendir( j < 0 ? f_dir : *subdirs );
{
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 );
}
if( d ) if( d )
{ {
int b_found; int b_found;
msg_Dbg( p_this, "looking for a subtitle file in %s", 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 ) ) ) while( ( de = readdir( d ) ) )
{ {
/* retrieve various parts of the filename */ /* retrieve various parts of the filename */
...@@ -355,7 +352,7 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -355,7 +352,7 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
if( i_prio >= fuzzy.i_int ) 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 ); de->d_name );
msg_Dbg( p_this, "autodetected subtitle: %s with " msg_Dbg( p_this, "autodetected subtitle: %s with "
"priority %d", de->d_name, i_prio ); "priority %d", de->d_name, i_prio );
...@@ -372,9 +369,10 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path, ...@@ -372,9 +369,10 @@ char **subtitles_Detect( input_thread_t *p_this, char *psz_path,
} }
closedir( d ); closedir( d );
} }
free( *subdirs++ );
} }
if( subdirs ) free( subdirs ); if( tmp_subdirs ) free( tmp_subdirs );
free( f_dir ); free( f_dir );
free( f_fname ); free( f_fname );
......
...@@ -847,7 +847,7 @@ vlc_module_begin(); ...@@ -847,7 +847,7 @@ vlc_module_begin();
add_integer( "sub-autodetect-fuzzy", 3, NULL, add_integer( "sub-autodetect-fuzzy", 3, NULL,
SUB_FUZZY_TEXT, SUB_FUZZY_LONGTEXT, VLC_TRUE ); SUB_FUZZY_TEXT, SUB_FUZZY_LONGTEXT, VLC_TRUE );
#if defined( WIN32 ) #if defined( WIN32 )
add_string( "sub-autodetect-path", ".\\Subtitles, .\\subtitles", NULL, add_string( "sub-autodetect-path", ".\\subtitles", NULL,
#else #else
add_string( "sub-autodetect-path", "./Subtitles, ./subtitles", NULL, add_string( "sub-autodetect-path", "./Subtitles, ./subtitles", NULL,
#endif #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