From f4fa49e49bcc96727c7c234f49324960cf9d416d Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sun, 3 May 2009 16:28:39 +0000 Subject: [PATCH] + ExpressionFormat: support for "inferred" files (e.g. if we are formatting a subtitle, use media info of the actual movie file if possible) + ExpressionFormat: bindings are now case insensitive --- .../format/EpisodeFormatBindingBean.java | 46 ++++++++++++++----- .../filebot/format/ExpressionBindings.java | 4 +- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/source/net/sourceforge/filebot/format/EpisodeFormatBindingBean.java b/source/net/sourceforge/filebot/format/EpisodeFormatBindingBean.java index c933bf5f..f39dea67 100644 --- a/source/net/sourceforge/filebot/format/EpisodeFormatBindingBean.java +++ b/source/net/sourceforge/filebot/format/EpisodeFormatBindingBean.java @@ -2,7 +2,9 @@ package net.sourceforge.filebot.format; +import static net.sourceforge.filebot.FileBotUtilities.MOVIE_FILES; import static net.sourceforge.filebot.FileBotUtilities.SFV_FILES; +import static net.sourceforge.filebot.FileBotUtilities.SUBTITLE_FILES; import static net.sourceforge.filebot.format.Define.undefined; import java.io.File; @@ -126,25 +128,27 @@ public class EpisodeFormatBindingBean { // make sure media file is defined checkMediaFile(); + File inferredMediaFile = getInferredMediaFile(); + // try to get checksum from file name - String checksum = FileBotUtilities.getEmbeddedChecksum(mediaFile.getName()); + String checksum = FileBotUtilities.getEmbeddedChecksum(inferredMediaFile.getName()); if (checksum != null) return checksum; // try to get checksum from sfv file - checksum = getChecksumFromSfvFile(mediaFile); + checksum = getChecksumFromSfvFile(inferredMediaFile); if (checksum != null) return checksum; // calculate checksum from file - return crc32(mediaFile); + return crc32(inferredMediaFile); } @Define("ext") - public String getContainerExtension() { + public String getExtension() { // make sure media file is defined checkMediaFile(); @@ -153,7 +157,7 @@ public class EpisodeFormatBindingBean { } - @Define("general") + @Define("media") public Object getGeneralMediaInfo() { return new AssociativeScriptObject(getMediaInfo().snapshot(StreamKind.General, 0)); } @@ -195,6 +199,24 @@ public class EpisodeFormatBindingBean { } + @Define("inferredFile") + public File getInferredMediaFile() { + if (SUBTITLE_FILES.accept(mediaFile)) { + // file is a subtitle + String name = FileUtilities.getName(mediaFile); + + // find corresponding movie file + for (File movie : mediaFile.getParentFile().listFiles(MOVIE_FILES)) { + if (name.startsWith(FileUtilities.getName(movie))) { + return movie; + } + } + } + + return mediaFile; + } + + private void checkMediaFile() { // make sure file is not null if (mediaFile == null) @@ -210,11 +232,13 @@ public class EpisodeFormatBindingBean { // make sure media file is defined checkMediaFile(); - mediaInfo = new MediaInfo(); + MediaInfo newMediaInfo = new MediaInfo(); - if (!mediaInfo.open(mediaFile)) { - throw new RuntimeException(String.format("Cannot open file: %s", mediaFile)); + if (!newMediaInfo.open(getInferredMediaFile())) { + throw new RuntimeException(String.format("Cannot open media file: %s", mediaFile)); } + + mediaInfo = newMediaInfo; } return mediaInfo; @@ -234,8 +258,8 @@ public class EpisodeFormatBindingBean { } - private String getChecksumFromSfvFile(File mediaFile) throws IOException { - File folder = mediaFile.getParentFile(); + private String getChecksumFromSfvFile(File file) throws IOException { + File folder = file.getParentFile(); for (File sfvFile : folder.listFiles(SFV_FILES)) { SfvFileScanner scanner = new SfvFileScanner(sfvFile); @@ -245,7 +269,7 @@ public class EpisodeFormatBindingBean { try { Entry entry = scanner.next(); - if (mediaFile.getName().equals(entry.getKey().getPath())) { + if (file.getName().equals(entry.getKey().getPath())) { return entry.getValue(); } } catch (IllegalSyntaxException e) { diff --git a/source/net/sourceforge/filebot/format/ExpressionBindings.java b/source/net/sourceforge/filebot/format/ExpressionBindings.java index 644c4bd6..ad209774 100644 --- a/source/net/sourceforge/filebot/format/ExpressionBindings.java +++ b/source/net/sourceforge/filebot/format/ExpressionBindings.java @@ -4,10 +4,10 @@ package net.sourceforge.filebot.format; import java.lang.reflect.Method; import java.util.AbstractMap; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import javax.script.Bindings; @@ -18,7 +18,7 @@ public class ExpressionBindings extends AbstractMap implements B protected final Object bindingBean; - protected final Map bindings = new HashMap(); + protected final Map bindings = new TreeMap(String.CASE_INSENSITIVE_ORDER); public ExpressionBindings(Object bindingBean) {