From aec56019e82f7f3a21d99ed5b986e6b89eb69b48 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 12 Jan 2017 22:18:10 +0800 Subject: [PATCH] Refactor MediaTypes --- source/net/filebot/Main.java | 3 - source/net/filebot/MediaTypes.java | 115 ++++------- source/net/filebot/MediaTypes.properties | 49 +++++ source/net/filebot/cli/ArgumentProcessor.java | 5 +- source/net/filebot/cli/CmdlineOperations.java | 6 +- .../net/filebot/cli/ScriptShellMethods.java | 2 +- .../net/filebot/format/MediaBindingBean.java | 2 +- source/net/filebot/hash/HashType.java | 10 +- source/net/filebot/media.types | 178 ------------------ .../net/filebot/subtitle/SubtitleFormat.java | 24 ++- .../net/filebot/ui/rename/BindingDialog.java | 2 +- .../rename/NamesListTransferablePolicy.java | 5 +- .../sfv/ChecksumTableTransferablePolicy.java | 3 +- .../ui/subtitle/SubtitleDropTarget.java | 2 +- source/net/filebot/util/FileUtilities.java | 10 + 15 files changed, 133 insertions(+), 283 deletions(-) create mode 100644 source/net/filebot/MediaTypes.properties delete mode 100644 source/net/filebot/media.types diff --git a/source/net/filebot/Main.java b/source/net/filebot/Main.java index 6f16abfa..0c7cc1ad 100644 --- a/source/net/filebot/Main.java +++ b/source/net/filebot/Main.java @@ -151,9 +151,6 @@ public class Main { SwingEventBus.getInstance().post(new FileTransferable(files)); } - // preload media.types (when loaded during DnD it will freeze the UI for a few hundred milliseconds) - MediaTypes.getDefault(); - // JavaFX is used for ProgressMonitor and GettingStartedDialog try { initJavaFX(); diff --git a/source/net/filebot/MediaTypes.java b/source/net/filebot/MediaTypes.java index e836e283..14aa38e4 100644 --- a/source/net/filebot/MediaTypes.java +++ b/source/net/filebot/MediaTypes.java @@ -1,118 +1,73 @@ package net.filebot; import static java.util.Collections.*; -import static net.filebot.util.XPathUtilities.*; +import static net.filebot.util.RegularExpressions.*; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; - -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; +import java.util.ResourceBundle; import net.filebot.util.FileUtilities.ExtensionFileFilter; public class MediaTypes { - private static MediaTypes defaultInstance; + private static Map types = getKnownMediaTypes(); - public static synchronized MediaTypes getDefault() { - if (defaultInstance == null) { - defaultInstance = parseDefault(); - } - return defaultInstance; - } + private static Map getKnownMediaTypes() { + Map types = new LinkedHashMap(64); - private static MediaTypes parseDefault() { - try { - Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(MediaTypes.class.getResourceAsStream("media.types")); - Map> types = new LinkedHashMap>(); + ResourceBundle bundle = ResourceBundle.getBundle(MediaTypes.class.getName()); + for (Enumeration keys = bundle.getKeys(); keys.hasMoreElements();) { + String type = keys.nextElement(); + String[] extensions = SPACE.split(bundle.getString(type)); - for (Node it : getChildren("type", dom.getFirstChild())) { - List extensions = new ArrayList(2); - for (Node ie : getChildren("extension", it)) { - extensions.add(getTextContent(ie)); - } - - types.put(getAttribute("name", it), extensions); - } - - return new MediaTypes(types); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private Map> types; - private Map filters = synchronizedMap(new HashMap()); - - public MediaTypes(Map> types) { - this.types = types; - } - - public List getExtensionList(String name) { - List list = new ArrayList(); - - for (Entry> type : types.entrySet()) { - if (type.getKey().startsWith(name)) { - list.addAll(type.getValue()); - } + types.put(type, new ExtensionFileFilter(extensions)); } - return list; - } - - public ExtensionFileFilter getFilter(String name) { - ExtensionFileFilter filter = filters.get(name); - - if (filter == null) { - filter = new ExtensionFileFilter(getExtensionList(name)); - filters.put(name, filter); - } - - return filter; - } - - public Map> getTypes() { return types; } - public String getMediaType(String extension) { - for (Entry> it : getTypes().entrySet()) { - if (it.getValue().contains(extension)) { + public static void main(String[] args) { + System.out.println(MediaTypes.types); + } + + public static String getMediaType(String extension) { + for (Entry it : types.entrySet()) { + if (it.getValue().acceptExtension(extension)) { return it.getKey(); } } return null; } - public static ExtensionFileFilter getDefaultFilter(String name) { - return getDefault().getFilter(name); + public static ExtensionFileFilter getTypeFilter(String name) { + return types.get(name); } - public static ExtensionFileFilter combineFilter(ExtensionFileFilter... filters) { + public static ExtensionFileFilter getCategoryFilter(String category) { List extensions = new ArrayList(); - for (ExtensionFileFilter it : filters) { - if (!it.acceptAny()) { - addAll(extensions, it.extensions()); + + for (Entry it : types.entrySet()) { + if (it.getKey().startsWith(category)) { + addAll(extensions, it.getValue().extensions()); } } + return new ExtensionFileFilter(extensions); } - // some convenience filters - public static final ExtensionFileFilter AUDIO_FILES = getDefaultFilter("audio"); - public static final ExtensionFileFilter VIDEO_FILES = getDefaultFilter("video"); - public static final ExtensionFileFilter SUBTITLE_FILES = getDefaultFilter("subtitle"); - public static final ExtensionFileFilter ARCHIVE_FILES = getDefaultFilter("archive"); - public static final ExtensionFileFilter VERIFICATION_FILES = getDefaultFilter("verification"); - public static final ExtensionFileFilter NFO_FILES = getDefaultFilter("application/nfo"); - public static final ExtensionFileFilter LIST_FILES = getDefaultFilter("application/list"); - public static final ExtensionFileFilter TORRENT_FILES = getDefaultFilter("application/torrent"); + public static final ExtensionFileFilter AUDIO_FILES = getCategoryFilter("audio"); + public static final ExtensionFileFilter VIDEO_FILES = getCategoryFilter("video"); + public static final ExtensionFileFilter SUBTITLE_FILES = getCategoryFilter("subtitle"); + public static final ExtensionFileFilter ARCHIVE_FILES = getCategoryFilter("archive"); + public static final ExtensionFileFilter VERIFICATION_FILES = getCategoryFilter("verification"); + + public static final ExtensionFileFilter NFO_FILES = getTypeFilter("application/nfo"); + public static final ExtensionFileFilter LIST_FILES = getTypeFilter("application/list"); + public static final ExtensionFileFilter TORRENT_FILES = getTypeFilter("application/torrent"); } diff --git a/source/net/filebot/MediaTypes.properties b/source/net/filebot/MediaTypes.properties new file mode 100644 index 00000000..d0455b11 --- /dev/null +++ b/source/net/filebot/MediaTypes.properties @@ -0,0 +1,49 @@ +application/torrent: torrent tor +application/list: list txt +application/nfo: nfo url + +verification/sfv: sfv +verification/md5sum: md5 +verification/sha1sum: sha1 sha +verification/sha256sum: sha256 sha2 +verification/ed2k: ed2k + +archive/zip: zip +archive/rar: rar +archive/7z: 7z +archive/gzip: gzip gz +archive/tar: tar +archive/bzip2: bzip2 + +audio/mp3: mp3 +audio/mp4: m4a aac +audio/flac: flac +audio/wma: wma +audio/ogm: ogg ogm ogv oga +audio/wav: wav aiff alac + +video/avi: avi +video/mkv: mkv mk3d +video/ogm: ogm ogg +video/mp4: mp4 m4v 3gp +video/mov: mov +video/divx: divx +video/mpeg: mpg mpeg vob ts tp m2ts rec +video/wmv: wmv asf wtv +video/WebM: webm +video/flash: flv +video/realmedia: rm rmvb rmp4 +video/tivo: tivo +video/NuppelVideo: nuv +video/3DSBS: 3DSBS 3DTAB +video/stream-descriptor: strm +video/audio-stream: ac3 dts +video/iso: iso + +subtitle/SubRip: srt +subtitle/MicroDVD: sub +subtitle/SubViewer: sub +subtitle/SubStationAlpha: ssa ass +subtitle/SAMI: smi sami +subtitle/WebVTT: vtt +subtitle/VobSub: vobsub sub idx diff --git a/source/net/filebot/cli/ArgumentProcessor.java b/source/net/filebot/cli/ArgumentProcessor.java index 9d232621..1f7d8c20 100644 --- a/source/net/filebot/cli/ArgumentProcessor.java +++ b/source/net/filebot/cli/ArgumentProcessor.java @@ -1,6 +1,7 @@ package net.filebot.cli; import static net.filebot.Logging.*; +import static net.filebot.MediaTypes.*; import static net.filebot.util.ExceptionUtilities.*; import static net.filebot.util.FileUtilities.*; @@ -13,8 +14,6 @@ import java.util.logging.Level; import javax.script.Bindings; import javax.script.SimpleBindings; -import net.filebot.MediaTypes; - public class ArgumentProcessor { public int run(ArgumentBean args) { @@ -86,7 +85,7 @@ public class ArgumentProcessor { if (args.check) { // check verification file - if (containsOnly(files, MediaTypes.getDefaultFilter("verification"))) { + if (containsOnly(files, VERIFICATION_FILES)) { if (!cli.check(files)) { throw new Exception("Data corruption detected"); // one or more hashes do not match } diff --git a/source/net/filebot/cli/CmdlineOperations.java b/source/net/filebot/cli/CmdlineOperations.java index d2387989..c35a61ab 100644 --- a/source/net/filebot/cli/CmdlineOperations.java +++ b/source/net/filebot/cli/CmdlineOperations.java @@ -42,7 +42,6 @@ import java.util.stream.Stream; import net.filebot.HistorySpooler; import net.filebot.Language; -import net.filebot.MediaTypes; import net.filebot.RenameAction; import net.filebot.StandardRenameAction; import net.filebot.archive.Archive; @@ -871,7 +870,7 @@ public class CmdlineOperations implements CmdlineInterface { // only check existing hashes boolean result = true; - for (File it : filter(files, MediaTypes.getDefaultFilter("verification"))) { + for (File it : filter(files, VERIFICATION_FILES)) { result &= check(it, it.getParentFile()); } @@ -959,8 +958,9 @@ public class CmdlineOperations implements CmdlineInterface { try { for (File it : files) { - if (it.isHidden() || MediaTypes.getDefaultFilter("verification").accept(it)) + if (it.isHidden() || VERIFICATION_FILES.accept(it)) { continue; + } String relativePath = normalizePathSeparators(it.getPath().substring(root.getPath().length() + 1)); // skip root and first slash String hash = computeHash(it, hashType); diff --git a/source/net/filebot/cli/ScriptShellMethods.java b/source/net/filebot/cli/ScriptShellMethods.java index a5a411a7..a4c4de20 100644 --- a/source/net/filebot/cli/ScriptShellMethods.java +++ b/source/net/filebot/cli/ScriptShellMethods.java @@ -111,7 +111,7 @@ public class ScriptShellMethods { } // check disk image - if (self.isFile() && MediaTypes.getDefaultFilter("video/iso").accept(self)) { + if (self.isFile() && MediaTypes.getTypeFilter("video/iso").accept(self)) { try { return MediaDetection.isVideoDiskFile(self); } catch (Exception e) { diff --git a/source/net/filebot/format/MediaBindingBean.java b/source/net/filebot/format/MediaBindingBean.java index e76d1b9d..1efd0c54 100644 --- a/source/net/filebot/format/MediaBindingBean.java +++ b/source/net/filebot/format/MediaBindingBean.java @@ -881,7 +881,7 @@ public class MediaBindingBean { @Define("mime") public List getMediaType() throws Exception { // format engine does not allow / in binding value - return SLASH.splitAsStream(MediaTypes.getDefault().getMediaType(getExtension())).collect(toList()); + return SLASH.splitAsStream(MediaTypes.getMediaType(getExtension())).collect(toList()); } @Define("mediaPath") diff --git a/source/net/filebot/hash/HashType.java b/source/net/filebot/hash/HashType.java index 798a9421..f94800cb 100644 --- a/source/net/filebot/hash/HashType.java +++ b/source/net/filebot/hash/HashType.java @@ -22,7 +22,7 @@ public enum HashType { @Override public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("verification/sfv"); + return MediaTypes.getTypeFilter("verification/sfv"); } }, @@ -41,7 +41,7 @@ public enum HashType { @Override public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("verification/md5sum"); + return MediaTypes.getTypeFilter("verification/md5sum"); } }, @@ -60,7 +60,7 @@ public enum HashType { @Override public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("verification/sha1sum"); + return MediaTypes.getTypeFilter("verification/sha1sum"); } @Override @@ -84,7 +84,7 @@ public enum HashType { @Override public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("verification/sha256sum"); + return MediaTypes.getTypeFilter("verification/sha256sum"); } @Override @@ -107,7 +107,7 @@ public enum HashType { @Override public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("verification/ed2k"); + return MediaTypes.getTypeFilter("verification/ed2k"); } @Override diff --git a/source/net/filebot/media.types b/source/net/filebot/media.types deleted file mode 100644 index 22a248f2..00000000 --- a/source/net/filebot/media.types +++ /dev/null @@ -1,178 +0,0 @@ - - - - - torrent - tor - - - list - txt - - - nfo - url - - - - - sfv - - - md5 - - - sha1 - sha - - - sha256 - sha2 - - - ed2k - - - - - zip - - - rar - - - 7z - - - gzip - gz - - - tar - - - bzip2 - - - - - mp3 - - - m4a - aac - - - flac - - - wma - - - ogg - ogm - ogv - oga - - - wav - aiff - alac - - - - - avi - - - mkv - mk3d - - - ogm - ogg - - - mp4 - m4v - 3gp - - - mov - - - divx - - - mpg - mpeg - vob - ts - tp - m2ts - rec - - - wmv - asf - wtv - - - webm - - - flv - - - rm - rmvb - rmp4 - - - tivo - - - nuv - - - 3DSBS - 3DTAB - - - strm - - - ac3 - dts - - - iso - - - - - srt - - - sub - - - sub - - - ssa - ass - - - smi - sami - - - vtt - - - vobsub - sub - idx - - \ No newline at end of file diff --git a/source/net/filebot/subtitle/SubtitleFormat.java b/source/net/filebot/subtitle/SubtitleFormat.java index 6eb4262e..3e4fca5f 100644 --- a/source/net/filebot/subtitle/SubtitleFormat.java +++ b/source/net/filebot/subtitle/SubtitleFormat.java @@ -12,6 +12,11 @@ public enum SubtitleFormat { public SubtitleReader newReader(Readable readable) { return new SubRipReader(readable); } + + @Override + public ExtensionFileFilter getFilter() { + return MediaTypes.getTypeFilter("subtitle/SubRip"); + } }, MicroDVD { @@ -20,6 +25,11 @@ public enum SubtitleFormat { public SubtitleReader newReader(Readable readable) { return new MicroDVDReader(readable); } + + @Override + public ExtensionFileFilter getFilter() { + return MediaTypes.getTypeFilter("subtitle/MicroDVD"); + } }, SubViewer { @@ -28,6 +38,11 @@ public enum SubtitleFormat { public SubtitleReader newReader(Readable readable) { return new SubViewerReader(readable); } + + @Override + public ExtensionFileFilter getFilter() { + return MediaTypes.getTypeFilter("subtitle/SubViewer"); + } }, SubStationAlpha { @@ -36,12 +51,15 @@ public enum SubtitleFormat { public SubtitleReader newReader(Readable readable) { return new SubStationAlphaReader(readable); } + + @Override + public ExtensionFileFilter getFilter() { + return MediaTypes.getTypeFilter("subtitle/SubStationAlpha"); + } }; public abstract SubtitleReader newReader(Readable readable); - public ExtensionFileFilter getFilter() { - return MediaTypes.getDefaultFilter("subtitle/" + name()); - } + public abstract ExtensionFileFilter getFilter(); } diff --git a/source/net/filebot/ui/rename/BindingDialog.java b/source/net/filebot/ui/rename/BindingDialog.java index d857d72a..cd5dde09 100644 --- a/source/net/filebot/ui/rename/BindingDialog.java +++ b/source/net/filebot/ui/rename/BindingDialog.java @@ -296,7 +296,7 @@ class BindingDialog extends JDialog { @Override public void actionPerformed(ActionEvent evt) { - ExtensionFileFilter mediaFiles = combineFilter(VIDEO_FILES, AUDIO_FILES, SUBTITLE_FILES); + ExtensionFileFilter mediaFiles = ExtensionFileFilter.union(VIDEO_FILES, AUDIO_FILES, SUBTITLE_FILES); List selection = showLoadDialogSelectFiles(false, false, getMediaFile(), mediaFiles, (String) getValue(NAME), evt); if (selection.size() > 0) { diff --git a/source/net/filebot/ui/rename/NamesListTransferablePolicy.java b/source/net/filebot/ui/rename/NamesListTransferablePolicy.java index cac05265..0d0bb8be 100644 --- a/source/net/filebot/ui/rename/NamesListTransferablePolicy.java +++ b/source/net/filebot/ui/rename/NamesListTransferablePolicy.java @@ -1,7 +1,6 @@ package net.filebot.ui.rename; import static java.awt.datatransfer.DataFlavor.*; -import static java.util.Arrays.*; import static java.util.stream.Collectors.*; import static net.filebot.MediaTypes.*; import static net.filebot.hash.VerificationUtilities.*; @@ -17,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; +import java.util.stream.Stream; import net.filebot.hash.HashType; import net.filebot.hash.VerificationFileReader; @@ -24,6 +24,7 @@ import net.filebot.torrent.Torrent; import net.filebot.ui.transfer.ArrayTransferable; import net.filebot.ui.transfer.FileTransferablePolicy; import net.filebot.util.FastFile; +import net.filebot.util.FileUtilities.ExtensionFileFilter; import net.filebot.vfs.SimpleFileInfo; import net.filebot.web.Episode; @@ -148,7 +149,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override public List getFileFilterExtensions() { - return asList(combineFilter(VIDEO_FILES, SUBTITLE_FILES, AUDIO_FILES, LIST_FILES, TORRENT_FILES, VERIFICATION_FILES).extensions()); + return Stream.of(VIDEO_FILES, SUBTITLE_FILES, AUDIO_FILES, LIST_FILES, TORRENT_FILES, VERIFICATION_FILES).map(ExtensionFileFilter::extensions).flatMap(Stream::of).collect(toList()); } } diff --git a/source/net/filebot/ui/sfv/ChecksumTableTransferablePolicy.java b/source/net/filebot/ui/sfv/ChecksumTableTransferablePolicy.java index 7a983432..a2255519 100644 --- a/source/net/filebot/ui/sfv/ChecksumTableTransferablePolicy.java +++ b/source/net/filebot/ui/sfv/ChecksumTableTransferablePolicy.java @@ -19,7 +19,6 @@ import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import java.util.logging.Level; -import net.filebot.MediaTypes; import net.filebot.hash.HashType; import net.filebot.hash.VerificationFileReader; import net.filebot.mac.MacAppUtilities; @@ -247,7 +246,7 @@ class ChecksumTableTransferablePolicy extends BackgroundFileTransferablePolicy files = showLoadDialogSelectFiles(true, true, null, combineFilter(VIDEO_FILES, SUBTITLE_FILES), "Select Video Folder", evt); + List files = showLoadDialogSelectFiles(true, true, null, ExtensionFileFilter.union(VIDEO_FILES, SUBTITLE_FILES), "Select Video Folder", evt); if (files.size() > 0 && getDropAction(files) != DropAction.Cancel) { handleDrop(files); diff --git a/source/net/filebot/util/FileUtilities.java b/source/net/filebot/util/FileUtilities.java index 86c55dd8..4fee35fa 100644 --- a/source/net/filebot/util/FileUtilities.java +++ b/source/net/filebot/util/FileUtilities.java @@ -796,6 +796,16 @@ public final class FileUtilities { } return s.toString(); } + + public static ExtensionFileFilter union(ExtensionFileFilter... filters) { + List extensions = new ArrayList(); + for (ExtensionFileFilter it : filters) { + if (!it.acceptAny()) { + addAll(extensions, it.extensions()); + } + } + return new ExtensionFileFilter(extensions); + } } public static class RegexFileFilter implements FileFilter, FilenameFilter {