From 43419226770d8c7f91afe64e3ca9b3036fb21f3a Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Mon, 2 Jan 2012 16:59:37 +0000 Subject: [PATCH] * detect locale from language suffix first, and then lookup via osdb language detection --- .../filebot/format/MediaBindingBean.java | 7 ++++ .../filebot/media/ReleaseInfo.java | 41 +++++++++++++------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/source/net/sourceforge/filebot/format/MediaBindingBean.java b/source/net/sourceforge/filebot/format/MediaBindingBean.java index 7ddfabc7..6f5beb3f 100644 --- a/source/net/sourceforge/filebot/format/MediaBindingBean.java +++ b/source/net/sourceforge/filebot/format/MediaBindingBean.java @@ -288,6 +288,13 @@ public class MediaBindingBean { @Define("lang") public Locale detectSubtitleLanguage() throws Exception { + // make sure media file is defined + checkMediaFile(); + + Locale languageSuffix = new ReleaseInfo().getLanguageSuffix(FileUtilities.getName(mediaFile)); + if (languageSuffix != null) + return languageSuffix; + // require subtitle file if (!SUBTITLE_FILES.accept(mediaFile)) return null; diff --git a/source/net/sourceforge/filebot/media/ReleaseInfo.java b/source/net/sourceforge/filebot/media/ReleaseInfo.java index 950266ff..0b7725e7 100644 --- a/source/net/sourceforge/filebot/media/ReleaseInfo.java +++ b/source/net/sourceforge/filebot/media/ReleaseInfo.java @@ -2,6 +2,7 @@ package net.sourceforge.filebot.media; +import static java.util.Arrays.*; import static java.util.ResourceBundle.*; import static java.util.regex.Pattern.*; import static net.sourceforge.filebot.similarity.Normalization.*; @@ -12,13 +13,12 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Scanner; -import java.util.Set; -import java.util.TreeSet; +import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; @@ -42,6 +42,16 @@ public class ReleaseInfo { } + public Locale getLanguageSuffix(String name) { + // match locale identifier and lookup Locale object + String lang = matchLast(getLanguageSuffixPattern(), null, name); + if (lang == null) + return null; + + return getLanguageMap(Locale.ENGLISH, Locale.getDefault()).get(lang); + } + + protected String matchLast(Pattern pattern, String[] standardValues, CharSequence... sequence) { String lastMatch = null; @@ -57,7 +67,7 @@ public class ReleaseInfo { } // prefer standard value over matched value - if (lastMatch != null) { + if (lastMatch != null && standardValues != null) { for (String standard : standardValues) { if (standard.equalsIgnoreCase(lastMatch)) { return standard; @@ -102,22 +112,29 @@ public class ReleaseInfo { public Pattern getLanguageSuffixPattern() { - Set tokens = new TreeSet(); + // .{language}[.srt] + return compile("(?<=\\p{Punct}|\\s)(" + join(getLanguageMap(Locale.ENGLISH, Locale.getDefault()).keySet(), "|") + ")(?=$)", CASE_INSENSITIVE | UNICODE_CASE | CANON_EQ); + } + + + public Map getLanguageMap(Locale... supportedLanguageName) { + Map languageMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); for (String code : Locale.getISOLanguages()) { Locale locale = new Locale(code); - tokens.add(locale.getLanguage()); - tokens.add(locale.getISO3Language()); - for (Locale language : new HashSet(Arrays.asList(Locale.ENGLISH, Locale.getDefault()))) { - tokens.add(locale.getDisplayLanguage(language)); + languageMap.put(locale.getLanguage(), locale); + languageMap.put(locale.getISO3Language(), locale); + + // map display language names for given locales + for (Locale language : new HashSet(asList(supportedLanguageName))) { + languageMap.put(locale.getDisplayLanguage(language), locale); } } // remove illegal tokens - tokens.remove(""); + languageMap.remove(""); - // .{language}[.srt] - return compile("(?<=\\p{Punct})(" + join(tokens, "|") + ")(?=$)", CASE_INSENSITIVE | UNICODE_CASE | CANON_EQ); + return languageMap; }