diff --git a/source/net/sourceforge/filebot/cli/ArgumentProcessor.java b/source/net/sourceforge/filebot/cli/ArgumentProcessor.java index e278e007..76d9dce6 100644 --- a/source/net/sourceforge/filebot/cli/ArgumentProcessor.java +++ b/source/net/sourceforge/filebot/cli/ArgumentProcessor.java @@ -78,9 +78,9 @@ public class ArgumentProcessor { } if (args.getSubtitles) { - files.addAll(cli.getSubtitles(files, args.db, args.query, args.lang, args.output, args.encoding, !args.nonStrict)); + files.addAll(cli.getSubtitles(files, args.db, args.query, args.lang, args.output, args.encoding, args.format, !args.nonStrict)); } else if (args.getMissingSubtitles) { - files.addAll(cli.getMissingSubtitles(files, args.db, args.query, args.lang, args.output, args.encoding, !args.nonStrict)); + files.addAll(cli.getMissingSubtitles(files, args.db, args.query, args.lang, args.output, args.encoding, args.format, !args.nonStrict)); } if (args.rename) { diff --git a/source/net/sourceforge/filebot/cli/CmdlineInterface.java b/source/net/sourceforge/filebot/cli/CmdlineInterface.java index 5cae2efe..2dee1d63 100644 --- a/source/net/sourceforge/filebot/cli/CmdlineInterface.java +++ b/source/net/sourceforge/filebot/cli/CmdlineInterface.java @@ -1,7 +1,5 @@ - package net.sourceforge.filebot.cli; - import java.io.File; import java.io.FileFilter; import java.util.Collection; @@ -9,30 +7,22 @@ import java.util.List; import net.sourceforge.filebot.RenameAction; - public interface CmdlineInterface { - + List rename(Collection files, RenameAction action, String conflict, String output, String format, String db, String query, String sortOrder, String filter, String lang, boolean strict) throws Exception; - - - List getSubtitles(Collection files, String db, String query, String lang, String output, String encoding, boolean strict) throws Exception; - - - List getMissingSubtitles(Collection files, String db, String query, String lang, String output, String encoding, boolean strict) throws Exception; - - + + List getSubtitles(Collection files, String db, String query, String lang, String output, String encoding, String format, boolean strict) throws Exception; + + List getMissingSubtitles(Collection files, String db, String query, String lang, String output, String encoding, String format, boolean strict) throws Exception; + boolean check(Collection files) throws Exception; - - + File compute(Collection files, String output, String encoding) throws Exception; - - + List fetchEpisodeList(String query, String format, String db, String sortOrder, String lang) throws Exception; - - + String getMediaInfo(File file, String format) throws Exception; - - + List extract(Collection files, String output, String conflict, FileFilter filter, boolean forceExtractAll) throws Exception; - + } diff --git a/source/net/sourceforge/filebot/cli/CmdlineOperations.java b/source/net/sourceforge/filebot/cli/CmdlineOperations.java index 4a4604ba..63d90b91 100644 --- a/source/net/sourceforge/filebot/cli/CmdlineOperations.java +++ b/source/net/sourceforge/filebot/cli/CmdlineOperations.java @@ -58,6 +58,7 @@ import net.sourceforge.filebot.similarity.SeriesNameMatcher; import net.sourceforge.filebot.similarity.SimilarityComparator; import net.sourceforge.filebot.similarity.SimilarityMetric; import net.sourceforge.filebot.subtitle.SubtitleFormat; +import net.sourceforge.filebot.subtitle.SubtitleNaming; import net.sourceforge.filebot.vfs.MemoryFile; import net.sourceforge.filebot.web.AudioTrack; import net.sourceforge.filebot.web.Episode; @@ -641,9 +642,10 @@ public class CmdlineOperations implements CmdlineInterface { } @Override - public List getSubtitles(Collection files, String db, String query, String languageName, String output, String csn, boolean strict) throws Exception { + public List getSubtitles(Collection files, String db, String query, String languageName, String output, String csn, String format, boolean strict) throws Exception { final Language language = getLanguage(languageName); final Pattern databaseFilter = (db != null) ? Pattern.compile(db, Pattern.CASE_INSENSITIVE) : null; + final SubtitleNaming naming = getSubtitleNaming(format); CLILogger.finest(String.format("Get [%s] subtitles for %d files", language.getName(), files.size())); // when rewriting subtitles to target format an encoding must be defined, default to UTF-8 @@ -669,7 +671,7 @@ public class CmdlineOperations implements CmdlineInterface { try { CLILogger.fine("Looking up subtitles by filehash via " + service.getName()); Map subtitles = lookupSubtitleByHash(service, language, remainingVideos); - Map downloads = downloadSubtitleBatch(service.getName(), subtitles, outputFormat, outputEncoding); + Map downloads = downloadSubtitleBatch(service.getName(), subtitles, outputFormat, outputEncoding, naming); remainingVideos.removeAll(downloads.keySet()); subtitleFiles.addAll(downloads.values()); } catch (Exception e) { @@ -714,7 +716,7 @@ public class CmdlineOperations implements CmdlineInterface { try { CLILogger.fine(format("Searching for %s at [%s]", querySet, service.getName())); Map subtitles = lookupSubtitleByFileName(service, querySet, language, remainingVideos, strict); - Map downloads = downloadSubtitleBatch(service.getName(), subtitles, outputFormat, outputEncoding); + Map downloads = downloadSubtitleBatch(service.getName(), subtitles, outputFormat, outputEncoding, naming); remainingVideos.removeAll(downloads.keySet()); subtitleFiles.addAll(downloads.values()); } catch (Exception e) { @@ -734,12 +736,14 @@ public class CmdlineOperations implements CmdlineInterface { } @Override - public List getMissingSubtitles(Collection files, String db, String query, final String languageName, String output, String csn, boolean strict) throws Exception { + public List getMissingSubtitles(Collection files, String db, String query, final String languageName, String output, String csn, final String format, boolean strict) throws Exception { List videoFiles = filter(filter(files, VIDEO_FILES), new FileFilter() { // save time on repeating filesystem calls private final Map cache = new HashMap(); + private final SubtitleNaming naming = getSubtitleNaming(format); + // get language code suffix for given language (.eng) private final String languageCodeSuffix = "." + Language.getISO3LanguageCodeByName(getLanguage(languageName).getName()); @@ -752,10 +756,17 @@ public class CmdlineOperations implements CmdlineInterface { } for (File subtitle : subtitlesByFolder) { - if (isDerived(subtitle, video) && (subtitle.getName().contains(languageCodeSuffix))) + // can't tell which subtitle belongs to which file -> if any subtitles exist skip the whole folder + if (naming == SubtitleNaming.ORIGINAL) { return false; + } else if (isDerived(subtitle, video)) { + if (naming == SubtitleNaming.MATCH_VIDEO) { + return false; + } else if (subtitle.getName().contains(languageCodeSuffix)) { + return false; + } + } } - return true; } }); @@ -765,16 +776,25 @@ public class CmdlineOperations implements CmdlineInterface { return emptyList(); } - return getSubtitles(videoFiles, db, query, languageName, output, csn, strict); + return getSubtitles(videoFiles, db, query, languageName, output, csn, format, strict); } - private Map downloadSubtitleBatch(String service, Map subtitles, SubtitleFormat outputFormat, Charset outputEncoding) { + private SubtitleNaming getSubtitleNaming(String format) { + SubtitleNaming naming = SubtitleNaming.forName(format); + if (naming != null) { + return naming; + } else { + return SubtitleNaming.MATCH_VIDEO_ADD_LANGUAGE_TAG; + } + } + + private Map downloadSubtitleBatch(String service, Map subtitles, SubtitleFormat outputFormat, Charset outputEncoding, SubtitleNaming naming) { Map downloads = new HashMap(); // fetch subtitle for (Entry it : subtitles.entrySet()) { try { - downloads.put(it.getKey(), downloadSubtitle(it.getValue(), it.getKey(), outputFormat, outputEncoding)); + downloads.put(it.getKey(), downloadSubtitle(it.getValue(), it.getKey(), outputFormat, outputEncoding, naming)); Analytics.trackEvent(service, "DownloadSubtitle", it.getValue().getLanguageName(), 1); } catch (Exception e) { CLILogger.warning(format("Failed to download %s: %s", it.getValue().getPath(), e.getMessage())); @@ -784,13 +804,12 @@ public class CmdlineOperations implements CmdlineInterface { return downloads; } - private File downloadSubtitle(SubtitleDescriptor descriptor, File movieFile, SubtitleFormat outputFormat, Charset outputEncoding) throws Exception { + private File downloadSubtitle(SubtitleDescriptor descriptor, File movieFile, SubtitleFormat outputFormat, Charset outputEncoding, SubtitleNaming naming) throws Exception { // fetch subtitle archive CLILogger.config(format("Fetching [%s]", descriptor.getPath())); MemoryFile subtitleFile = fetchSubtitle(descriptor); // subtitle filename is based on movie filename - String base = getName(movieFile); String ext = getExtension(subtitleFile.getName()); ByteBuffer data = subtitleFile.getData(); @@ -803,7 +822,7 @@ public class CmdlineOperations implements CmdlineInterface { data = exportSubtitles(subtitleFile, outputFormat, 0, outputEncoding); } - File destination = new File(movieFile.getParentFile(), formatSubtitle(base, descriptor.getLanguageName(), ext)); + File destination = new File(movieFile.getParentFile(), naming.format(movieFile, descriptor, ext)); CLILogger.info(format("Writing [%s] to [%s]", subtitleFile.getName(), destination.getName())); writeFile(data, destination); diff --git a/source/net/sourceforge/filebot/cli/ScriptShell.lib.groovy b/source/net/sourceforge/filebot/cli/ScriptShell.lib.groovy index b38ec026..b2e2f5a0 100644 --- a/source/net/sourceforge/filebot/cli/ScriptShell.lib.groovy +++ b/source/net/sourceforge/filebot/cli/ScriptShell.lib.groovy @@ -283,13 +283,13 @@ def rename(args) { args = _defaults(args) def getSubtitles(args) { args = _defaults(args) synchronized (_cli) { - _guarded { _cli.getSubtitles(_files(args), args.db as String, args.query as String, args.lang as String, args.output as String, args.encoding as String, args.strict as Boolean) } + _guarded { _cli.getSubtitles(_files(args), args.db as String, args.query as String, args.lang as String, args.output as String, args.encoding as String, args.format as String, args.strict as Boolean) } } } def getMissingSubtitles(args) { args = _defaults(args) synchronized (_cli) { - _guarded { _cli.getMissingSubtitles(_files(args), args.db as String, args.query as String, args.lang as String, args.output as String, args.encoding as String, args.strict as Boolean) } + _guarded { _cli.getMissingSubtitles(_files(args), args.db as String, args.query as String, args.lang as String, args.output as String, args.encoding as String, args.format as String, args.strict as Boolean) } } } diff --git a/source/net/sourceforge/filebot/format/ExpressionFormat.lib.groovy b/source/net/sourceforge/filebot/format/ExpressionFormat.lib.groovy index 38fb510a..80e4d950 100644 --- a/source/net/sourceforge/filebot/format/ExpressionFormat.lib.groovy +++ b/source/net/sourceforge/filebot/format/ExpressionFormat.lib.groovy @@ -220,7 +220,7 @@ def csv(path, delim = ';', keyIndex = 0, valueIndex = 1) { def f = path as File def values = [:] if (f.isFile()) { - f.splitEachLine(delim) { line -> + f.splitEachLine(delim, 'UTF-8') { line -> values.put(line[keyIndex], c{ line[valueIndex] }) } } diff --git a/source/net/sourceforge/filebot/subtitle/SubtitleNaming.java b/source/net/sourceforge/filebot/subtitle/SubtitleNaming.java index 573b8745..08261f6c 100644 --- a/source/net/sourceforge/filebot/subtitle/SubtitleNaming.java +++ b/source/net/sourceforge/filebot/subtitle/SubtitleNaming.java @@ -11,8 +11,8 @@ public enum SubtitleNaming { ORIGINAL { @Override - public String format(File video, SubtitleDescriptor subtitle) { - return String.format("%s.%s", getName(video), subtitle.getType()); + public String format(File video, SubtitleDescriptor subtitle, String ext) { + return String.format("%s.%s", subtitle.getName(), ext); } @Override @@ -24,8 +24,8 @@ public enum SubtitleNaming { MATCH_VIDEO { @Override - public String format(File video, SubtitleDescriptor subtitle) { - return SubtitleUtilities.formatSubtitle(getName(video), null, subtitle.getType()); + public String format(File video, SubtitleDescriptor subtitle, String ext) { + return SubtitleUtilities.formatSubtitle(getName(video), null, ext); } @Override @@ -37,8 +37,8 @@ public enum SubtitleNaming { MATCH_VIDEO_ADD_LANGUAGE_TAG { @Override - public String format(File video, SubtitleDescriptor subtitle) { - return SubtitleUtilities.formatSubtitle(getName(video), subtitle.getLanguageName(), subtitle.getType()); + public String format(File video, SubtitleDescriptor subtitle, String ext) { + return SubtitleUtilities.formatSubtitle(getName(video), subtitle.getLanguageName(), ext); } @Override @@ -47,6 +47,15 @@ public enum SubtitleNaming { } }; - public abstract String format(File video, SubtitleDescriptor subtitle); + public abstract String format(File video, SubtitleDescriptor subtitle, String ext); + + public static SubtitleNaming forName(String s) { + for (SubtitleNaming it : values()) { + if (it.name().equalsIgnoreCase(s) || it.toString().equalsIgnoreCase(s)) { + return it; + } + } + return null; + } } diff --git a/source/net/sourceforge/filebot/ui/subtitle/SubtitleAutoMatchDialog.java b/source/net/sourceforge/filebot/ui/subtitle/SubtitleAutoMatchDialog.java index 3e1f6ef4..d0a6ceba 100644 --- a/source/net/sourceforge/filebot/ui/subtitle/SubtitleAutoMatchDialog.java +++ b/source/net/sourceforge/filebot/ui/subtitle/SubtitleAutoMatchDialog.java @@ -794,7 +794,7 @@ class SubtitleAutoMatchDialog extends JDialog { return null; // prefer type from descriptor because we need to know before we download the actual subtitle file - String name = naming.format(video, descriptor.getDescriptor()); + String name = naming.format(video, descriptor.getDescriptor(), descriptor.getType()); return new File(video.getParentFile(), name); }