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