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

Walter Cacau waltercacau at gmail.com
Fri Feb 1 21:46:16 CET 2013


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
+    );
+    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;
+}
-- 
1.7.12.4 (Apple Git-37)




More information about the vlc-devel mailing list