diff --git a/build.xml b/build.xml
index 779c712f..20ae7c6c 100644
--- a/build.xml
+++ b/build.xml
@@ -93,15 +93,15 @@
-
+
-
+
-
+
@@ -109,6 +109,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -123,7 +199,7 @@
-
+
diff --git a/installer/icons/icon16.png b/installer/icons/icon16.png
new file mode 100644
index 00000000..5686e827
Binary files /dev/null and b/installer/icons/icon16.png differ
diff --git a/installer/icons/icon32.png b/installer/icons/icon32.png
new file mode 100644
index 00000000..402b19e0
Binary files /dev/null and b/installer/icons/icon32.png differ
diff --git a/installer/icons/icon48.png b/installer/icons/icon48.png
new file mode 100644
index 00000000..b2c094ca
Binary files /dev/null and b/installer/icons/icon48.png differ
diff --git a/installer/icons/nosplash.png b/installer/icons/nosplash.png
new file mode 100644
index 00000000..789478b8
Binary files /dev/null and b/installer/icons/nosplash.png differ
diff --git a/installer/icons/sfv.ico b/installer/icons/sfv.ico
new file mode 100644
index 00000000..ca9dde0f
Binary files /dev/null and b/installer/icons/sfv.ico differ
diff --git a/installer/icons/sfv16.png b/installer/icons/sfv16.png
new file mode 100644
index 00000000..e9c51880
Binary files /dev/null and b/installer/icons/sfv16.png differ
diff --git a/installer/icons/sfv32.png b/installer/icons/sfv32.png
new file mode 100644
index 00000000..55c823de
Binary files /dev/null and b/installer/icons/sfv32.png differ
diff --git a/installer/icons/sfv48.png b/installer/icons/sfv48.png
new file mode 100644
index 00000000..1785f531
Binary files /dev/null and b/installer/icons/sfv48.png differ
diff --git a/installer/icons/shortcut.ico b/installer/icons/shortcut.ico
new file mode 100644
index 00000000..c34f7f6a
Binary files /dev/null and b/installer/icons/shortcut.ico differ
diff --git a/installer/icons/splash.png b/installer/icons/splash.png
new file mode 100644
index 00000000..b505144f
Binary files /dev/null and b/installer/icons/splash.png differ
diff --git a/installer/webstart/filebot.jnlp b/installer/webstart/filebot.jnlp
new file mode 100644
index 00000000..72877ebb
--- /dev/null
+++ b/installer/webstart/filebot.jnlp
@@ -0,0 +1,54 @@
+
+
+
+ FileBot
+ rednoah
+
+ A cross-platform tool for tv renaming, subtitle download and file verification
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/webstart/filebot.lib.jnlp b/installer/webstart/filebot.lib.jnlp
new file mode 100644
index 00000000..189d4770
--- /dev/null
+++ b/installer/webstart/filebot.lib.jnlp
@@ -0,0 +1,32 @@
+
+
+
+ Unsigned libs for FileBot
+ rednoah
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/webstart/filebot.sfv.jnlp b/installer/webstart/filebot.sfv.jnlp
new file mode 100644
index 00000000..2f5857ca
--- /dev/null
+++ b/installer/webstart/filebot.sfv.jnlp
@@ -0,0 +1,47 @@
+
+
+
+ Simple File Verification
+ rednoah
+
+
+
+
+
+
+
+
+
+ sfv file
+
+
+
+ md5sum file
+
+
+
+ sha1sum file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ --sfv
+
+
diff --git a/lib/jna.jar b/lib/jna.jar
index 0b042893..4853c81e 100644
Binary files a/lib/jna.jar and b/lib/jna.jar differ
diff --git a/lib/native/darwin/libmediainfo.dylib b/lib/native/darwin/libmediainfo.dylib
new file mode 100644
index 00000000..6608b819
Binary files /dev/null and b/lib/native/darwin/libmediainfo.dylib differ
diff --git a/lib/native/linux-amd64/libmediainfo.so b/lib/native/linux-amd64/libmediainfo.so
new file mode 100644
index 00000000..6569f796
Binary files /dev/null and b/lib/native/linux-amd64/libmediainfo.so differ
diff --git a/lib/native/linux-amd64/libzen.so b/lib/native/linux-amd64/libzen.so
new file mode 100644
index 00000000..e25b338a
Binary files /dev/null and b/lib/native/linux-amd64/libzen.so differ
diff --git a/lib/native/linux-i386/libmediainfo.so b/lib/native/linux-i386/libmediainfo.so
new file mode 100644
index 00000000..99e7d77f
Binary files /dev/null and b/lib/native/linux-i386/libmediainfo.so differ
diff --git a/lib/native/linux-i386/libzen.so b/lib/native/linux-i386/libzen.so
new file mode 100644
index 00000000..8b783467
Binary files /dev/null and b/lib/native/linux-i386/libzen.so differ
diff --git a/lib/native/win32-amd64/MediaInfo.dll b/lib/native/win32-amd64/MediaInfo.dll
new file mode 100644
index 00000000..52b82cfd
Binary files /dev/null and b/lib/native/win32-amd64/MediaInfo.dll differ
diff --git a/lib/native/win32-x86/MediaInfo.dll b/lib/native/win32-x86/MediaInfo.dll
new file mode 100644
index 00000000..9b79f860
Binary files /dev/null and b/lib/native/win32-x86/MediaInfo.dll differ
diff --git a/source/net/sourceforge/filebot/ArgumentBean.java b/source/net/sourceforge/filebot/ArgumentBean.java
index 3025140c..7e4707a8 100644
--- a/source/net/sourceforge/filebot/ArgumentBean.java
+++ b/source/net/sourceforge/filebot/ArgumentBean.java
@@ -5,31 +5,36 @@ package net.sourceforge.filebot;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
-import net.sourceforge.filebot.ui.transfer.FileTransferable;
-
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
+import net.sourceforge.filebot.ui.transfer.FileTransferable;
+import net.sourceforge.tuned.FileUtilities;
+
public class ArgumentBean {
@Option(name = "-help", usage = "Print this help message")
private boolean help = false;
- @Option(name = "-clear", usage = "Clear history and settings")
+ @Option(name = "-clear", usage = "Clear application settings")
private boolean clear = false;
- @Option(name = "--sfv", usage = "Open file in 'SFV' panel", metaVar = "")
- private boolean sfv;
+ @Option(name = "-open", usage = "Open file", metaVar = "")
+ private boolean open = false;
+
+ @Option(name = "--sfv", usage = "Open SFV panel", metaVar = "")
+ private boolean sfv = false;
@Argument
- private List arguments;
-
+ private List arguments = new LinkedList();
+
public boolean help() {
return help;
}
@@ -40,8 +45,13 @@ public class ArgumentBean {
}
+ public boolean open() {
+ return open;
+ }
+
+
public boolean sfv() {
- return sfv;
+ return sfv || (open && FileUtilities.containsOnly(arguments, MediaTypes.getFilter("verification")));
}
diff --git a/source/net/sourceforge/filebot/Main.java b/source/net/sourceforge/filebot/Main.java
index 4c6a6d9d..09420816 100644
--- a/source/net/sourceforge/filebot/Main.java
+++ b/source/net/sourceforge/filebot/Main.java
@@ -18,10 +18,8 @@ import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
-import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
-import net.sf.ehcache.CacheManager;
import net.sourceforge.filebot.format.ExpressionFormat;
import net.sourceforge.filebot.ui.MainFrame;
import net.sourceforge.filebot.ui.NotificationLoggingHandler;
@@ -35,7 +33,11 @@ public class Main {
* @param args
*/
public static void main(String... args) throws Exception {
+ // initialize this stuff before anything else
+ initializeLogging();
+ initializeSecurityManager();
+ // parse arguments
final ArgumentBean argumentBean = initializeArgumentBean(args);
if (argumentBean.help()) {
@@ -50,16 +52,11 @@ public class Main {
Settings.userRoot().clear();
}
- initializeLogging();
- initializeSettings();
- initializeCache();
- initializeSecurityManager();
-
try {
// use native laf an all platforms
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
- Logger.getLogger(Main.class.getName()).log(Level.WARNING, e.toString(), e);
+ Logger.getLogger(Main.class.getName()).log(Level.WARNING, e.getMessage(), e);
}
SwingUtilities.invokeLater(new Runnable() {
@@ -69,7 +66,7 @@ public class Main {
JFrame frame;
if (argumentBean.sfv()) {
- // sfv frame
+ // single panel frame
frame = new SinglePanelFrame(new SfvPanelBuilder()).publish(argumentBean.transferable());
} else {
// default frame
@@ -103,30 +100,6 @@ public class Main {
}
- /**
- * Preset the default thetvdb.apikey.
- */
- private static void initializeSettings() {
- Settings.userRoot().putDefault("thetvdb.apikey", "58B4AA94C59AD656");
- Settings.userRoot().putDefault("sublight.apikey", "afa9ecb2-a3ee-42b1-9225-000b4038bc85");
- }
-
-
- /**
- * Shutdown {@link CacheManager} in case there are any persistent caches that need to be stored.
- */
- private static void initializeCache() {
- // shutdown CacheManager
- Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
-
- @Override
- public void run() {
- CacheManager.getInstance().shutdown();
- }
- }));
- }
-
-
/**
* Initialize default SecurityManager and grant all permissions via security policy.
* Initialization is required in order to run {@link ExpressionFormat} in a secure sandbox.
@@ -164,10 +137,15 @@ public class Main {
/**
* Parse command line arguments.
*/
- private static ArgumentBean initializeArgumentBean(String... args) throws CmdLineException {
+ private static ArgumentBean initializeArgumentBean(String... args) {
ArgumentBean argumentBean = new ArgumentBean();
- new CmdLineParser(argumentBean).parseArgument(args);
+ try {
+ CmdLineParser parser = new CmdLineParser(argumentBean);
+ parser.parseArgument(args);
+ } catch (Exception e) {
+ Logger.getLogger(Main.class.getName()).log(Level.WARNING, e.getMessage(), e);
+ }
return argumentBean;
}
@@ -179,7 +157,8 @@ public class Main {
private static void printUsage(ArgumentBean argumentBean) {
System.out.println("Options:");
- new CmdLineParser(argumentBean).printUsage(System.out);
+ CmdLineParser parser = new CmdLineParser(argumentBean);
+ parser.printUsage(System.out);
}
}
diff --git a/source/net/sourceforge/filebot/Settings.java b/source/net/sourceforge/filebot/Settings.java
index 10c91eca..e6aa4611 100644
--- a/source/net/sourceforge/filebot/Settings.java
+++ b/source/net/sourceforge/filebot/Settings.java
@@ -2,6 +2,9 @@
package net.sourceforge.filebot;
+import java.io.File;
+import java.util.Locale;
+import java.util.ResourceBundle;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
@@ -16,15 +19,39 @@ import net.sourceforge.tuned.PreferencesMap.StringAdapter;
public final class Settings {
public static String getApplicationName() {
- return "FileBot";
+ return getApplicationProperty("application.name");
};
public static String getApplicationVersion() {
- return "1.9";
+ return getApplicationProperty("application.version");
};
+ public static String getApplicationProperty(String key) {
+ return ResourceBundle.getBundle(Settings.class.getName(), Locale.ROOT).getString(key);
+ }
+
+
+ public static File getApplicationFolder() {
+ // special handling for web start
+ if (System.getProperty("javawebstart.version") != null) {
+ // can't use working directory for web start applications
+ File folder = new File(System.getProperty("user.home"), ".filebot");
+
+ // create folder if necessary
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+
+ return folder;
+ }
+
+ // use working directory
+ return new File(System.getProperty("user.dir"));
+ }
+
+
private static final Settings userRoot = new Settings(Preferences.userNodeForPackage(Settings.class));
diff --git a/source/net/sourceforge/filebot/Settings.properties b/source/net/sourceforge/filebot/Settings.properties
new file mode 100644
index 00000000..51974777
--- /dev/null
+++ b/source/net/sourceforge/filebot/Settings.properties
@@ -0,0 +1,6 @@
+# application settings
+application.name: FileBot
+application.version: 0.0
+
+thetvdb.apikey: 58B4AA94C59AD656
+sublight.apikey: afa9ecb2-a3ee-42b1-9225-000b4038bc85
diff --git a/source/net/sourceforge/filebot/mediainfo/MediaInfo.java b/source/net/sourceforge/filebot/mediainfo/MediaInfo.java
index 6b7984fd..8face4d5 100644
--- a/source/net/sourceforge/filebot/mediainfo/MediaInfo.java
+++ b/source/net/sourceforge/filebot/mediainfo/MediaInfo.java
@@ -9,16 +9,32 @@ import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.Logger;
+import com.sun.jna.NativeLibrary;
+import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.WString;
public class MediaInfo implements Closeable {
+ static {
+ // libmediainfo for linux depends on libzen
+ if (Platform.isLinux()) {
+ try {
+ // We need to load dependencies first, because we know where our native libs are (e.g. Java Web Start Cache).
+ // If we do not, the system will look for dependencies, but only in the library path.
+ NativeLibrary.getInstance("zen");
+ } catch (Exception e) {
+ Logger.getLogger(MediaInfo.class.getName()).warning("Failed to preload libzen");
+ }
+ }
+ }
+
private Pointer handle;
-
+
public MediaInfo() {
handle = MediaInfoLibrary.INSTANCE.New();
}
@@ -137,7 +153,7 @@ public class MediaInfo implements Closeable {
}
}
-
+
public enum StreamKind {
General,
Video,
@@ -194,7 +210,7 @@ public class MediaInfo implements Closeable {
Domain;
}
-
+
public static String version() {
return staticOption("Info_Version");
}
diff --git a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java
index 27708d9f..197def17 100644
--- a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java
+++ b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java
@@ -2,6 +2,7 @@
package net.sourceforge.filebot.ui.panel.episodelist;
+import static net.sourceforge.filebot.Settings.*;
import static net.sourceforge.filebot.ui.panel.episodelist.SeasonSpinnerModel.*;
import java.awt.event.ActionEvent;
@@ -43,7 +44,7 @@ public class EpisodeListPanel extends AbstractSearchPanel