Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save waltercacau/4689021 to your computer and use it in GitHub Desktop.
Save waltercacau/4689021 to your computer and use it in GitHub Desktop.
VLC patch for detecting language of subtitles using its filename http://forum.videolan.org/posting.php?mode=reply&f=7&t=98342
From 7955c0ba9cab03fe6975f66e20ad127705dee8ca Mon Sep 17 00:00:00 2001
From: Walter Cacau <waltercacau@gmail.com>
Date: Fri, 1 Feb 2013 00:00:44 -0300
Subject: [PATCH] Detecting language of subtitles using its filename
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment