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

Walter Cacau waltercacau at gmail.com
Sat Feb 2 14:33:59 CET 2013


Well, I took some more time looking around the VLC source and then changed
a little bit the code which uses the input to do reference counting and
locking (actually I am relying on the access functions for doing the
latter). Bellow is the modified version.

---
 modules/demux/subtitle.c | 68
++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/modules/demux/subtitle.c b/modules/demux/subtitle.c
index aa1c7e6..464f4e8 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,30 @@ static int Open ( vlc_object_t *p_this )
     }
     else
         es_format_Init( &fmt, SPU_ES, VLC_CODEC_SUBT );
+
+    /* Detecting subtitle language using its filename */
+    {
+        input_thread_t * p_input = demux_GetParentInput(p_demux);
+        char * psz_video_url = input_item_GetURI(input_GetItem(p_input));
+        vlc_object_release(p_input);
+
+        if ( psz_video_url )
+        {
+            char * psz_language = get_language_from_filename(
+                p_demux->psz_location,
+                psz_video_url
+
+            );
+            if( psz_language )
+            {
+                fmt.psz_language = psz_language;
+                msg_Dbg( p_demux, "detected language %s of subtitle: %s",
+                         psz_language, p_demux->psz_location );
+            }
+            free(psz_video_url);
+        }
+    }
+
     if( unicode )
         fmt.subs.psz_encoding = strdup( "UTF-8" );
     char *psz_description = var_InheritString( p_demux, "sub-description"
);
@@ -2079,3 +2105,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;
+}
--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20130202/c83a7158/attachment.html>


More information about the vlc-devel mailing list