[vlc-devel] [PATCH] Detecting language of subtitles using its filename

Rémi Denis-Courmont remi at remlab.net
Sat Feb 2 07:32:01 CET 2013


Le vendredi 1 février 2013 22:46:16, Walter Cacau a écrit :
> A user who has many subtitles for a single video can now distinguish
> between them by the suffix containing language information.
> 
> So, for example, suppose the user has a video file named "video.mp4".
> If he names a subtitle as "video.en.srt", the English language will
> be detected. Similarly, he can name other subtitles with different
> languages, ex: "video.pt.srt", "video.pt-BR.srt", ...
> 
> If the subtitle name is equal to the video name (except for the
> file extension), then no language is detected.
> 
> This change has the positive side effect of making the subtitle menu
> show the detected language instead of only "Track X".
> ---
>  modules/demux/subtitle.c | 57
> ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57
> insertions(+)
> 
> diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
> index aa1c7e6..dd91dbe 100644
> --- a/modules/demux/subtitle.c
> +++ b/modules/demux/subtitle.c
> @@ -35,6 +35,7 @@
>  #include <vlc_plugin.h>
>  #include <vlc_input.h>
>  #include <vlc_memory.h>
> +#include <vlc_url.h>
> 
>  #include <ctype.h>
> 
> @@ -223,6 +224,7 @@ static int Demux( demux_t * );
>  static int Control( demux_t *, int, va_list );
> 
>  static void Fix( demux_t * );
> +static char * get_language_from_filename( const char *, const char * );
> 
>  /*************************************************************************
> **** * Module initializer
> @@ -529,6 +531,19 @@ static int Open ( vlc_object_t *p_this )
>      }
>      else
>          es_format_Init( &fmt, SPU_ES, VLC_CODEC_SUBT );
> +
> +    /* Detecting subtitle language using its filename */
> +    char * psz_language = get_language_from_filename(
> +        p_demux->psz_location,
> +        input_GetItem(p_demux->p_input)->psz_uri
> +    );

Please leave the input alone; you don't need it to know your location. AFAIK, 
there might not even be an input. Also that code looks like it lacks reference 
counting and locking.

> +    if( psz_language )
> +    {
> +        fmt.psz_language = psz_language;
> +        msg_Dbg( p_demux, "detected language %s of subtitle: %s",
> psz_language, +                 p_demux->psz_location );
> +    }
> +
>      if( unicode )
>          fmt.subs.psz_encoding = strdup( "UTF-8" );
>      char *psz_description = var_InheritString( p_demux, "sub-description"
> ); @@ -2079,3 +2094,45 @@ static int ParseSubViewer1( demux_t *p_demux,
> subtitle_t *p_subtitle, int i_idx return VLC_SUCCESS;
>  }
> 
> +static char * get_language_from_filename( const char * psz_sub_location,
> +                                          const char * psz_video_url )
> +{
> +    char * psz_ret = NULL;
> +    char * psz_video_file = NULL;
> +    char * psz_sub_file = NULL;
> +    char * psz_tmp;
> +    char * psz_sub_suffix;
> +    char * ps_language_end;
> +
> +    psz_video_file = strrchr( psz_video_url, '/' );
> +    if( !psz_video_file ) goto end;
> +    psz_video_file++;
> +    psz_video_file = decode_URI_duplicate(psz_video_file);
> +    if( !psz_video_file ) goto end;
> +
> +    psz_sub_file = strrchr( psz_sub_location, '/' );
> +    if( !psz_sub_file ) goto end;
> +    psz_sub_file++;
> +    psz_sub_file = decode_URI_duplicate(psz_sub_file);
> +    if( !psz_video_file ) goto end;
> +
> +    /* Removing extension, but leaving the dot */
> +    psz_tmp = strrchr( psz_video_file, '.' );
> +    if( !psz_tmp ) goto end;
> +    psz_tmp[1] = '\0';
> +
> +    /* Extracting sub file prefix */
> +    if( strstr(psz_sub_file, psz_video_file) != psz_sub_file ) goto end;
> +    psz_sub_suffix = psz_sub_file + strlen(psz_video_file);
> +
> +    ps_language_end = strrchr( psz_sub_suffix, '.' );
> +    if( !ps_language_end ) goto end;
> +    *ps_language_end = '\0';
> +
> +    psz_ret = strdup(psz_sub_suffix);
> +
> +end:
> +    FREENULL(psz_video_file);
> +    FREENULL(psz_sub_file);
> +    return psz_ret;
> +}

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list