diff --git a/source/net/filebot/WebServices.java b/source/net/filebot/WebServices.java index b33d47d6..8e7e1cd1 100644 --- a/source/net/filebot/WebServices.java +++ b/source/net/filebot/WebServices.java @@ -111,22 +111,6 @@ public final class WebServices { return null; // default } - public static Datasource getDatasourceByName(String name) { - EpisodeListProvider sdb = WebServices.getEpisodeListProvider(name); - if (sdb != null) { - return sdb; - } - MovieIdentificationService mdb = WebServices.getMovieIdentificationService(name); - if (mdb != null) { - return mdb; - } - MusicIdentificationService adb = WebServices.getMusicIdentificationService(name); - if (adb != null) { - return adb; - } - return null; - } - public static final ExecutorService requestThreadPool = Executors.newCachedThreadPool(); public static class TheTVDBClientWithLocalSearch extends TheTVDBClient { diff --git a/source/net/filebot/resources/file.text.png b/source/net/filebot/resources/file.text.png new file mode 100755 index 00000000..813f712f Binary files /dev/null and b/source/net/filebot/resources/file.text.png differ diff --git a/source/net/filebot/ui/rename/FormatDialog.java b/source/net/filebot/ui/rename/FormatDialog.java index 5489d3e0..cab87065 100644 --- a/source/net/filebot/ui/rename/FormatDialog.java +++ b/source/net/filebot/ui/rename/FormatDialog.java @@ -452,7 +452,7 @@ public class FormatDialog extends JDialog { String sample = bundle.getString(mode.key() + ".sample"); info = JsonReader.jsonToJava(sample); } catch (Exception illegalSample) { - throw new RuntimeException(illegalSample); // won't happen + Logger.getLogger(RenamePanel.class.getName()).log(Level.SEVERE, "Illegal Sample", e); } } diff --git a/source/net/filebot/ui/rename/PlainFileMatcher.java b/source/net/filebot/ui/rename/PlainFileMatcher.java new file mode 100644 index 00000000..c3c9fe98 --- /dev/null +++ b/source/net/filebot/ui/rename/PlainFileMatcher.java @@ -0,0 +1,39 @@ +package net.filebot.ui.rename; + +import java.awt.Component; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.swing.Icon; + +import net.filebot.ResourceManager; +import net.filebot.similarity.Match; +import net.filebot.web.Datasource; +import net.filebot.web.SortOrder; + +public class PlainFileMatcher implements Datasource, AutoCompleteMatcher { + + public static final PlainFileMatcher INSTANCE = new PlainFileMatcher(); + + @Override + public String getName() { + return "File"; + } + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("file.text"); + } + + @Override + public List> match(List files, boolean strict, SortOrder order, Locale locale, boolean autodetection, Component parent) throws Exception { + List> matches = new ArrayList<>(); + for (File f : files) { + matches.add(new Match(f, f)); + } + return matches; + } + +} diff --git a/source/net/filebot/ui/rename/Preset.java b/source/net/filebot/ui/rename/Preset.java index e36d5ecc..0335c25b 100644 --- a/source/net/filebot/ui/rename/Preset.java +++ b/source/net/filebot/ui/rename/Preset.java @@ -8,7 +8,6 @@ import net.filebot.StandardRenameAction; import net.filebot.WebServices; import net.filebot.format.ExpressionFilter; import net.filebot.format.ExpressionFormat; -import net.filebot.ui.rename.FormatDialog.Mode; import net.filebot.web.Datasource; import net.filebot.web.EpisodeListProvider; import net.filebot.web.MovieIdentificationService; @@ -63,26 +62,44 @@ public class Preset { } } - public Datasource getDatasource() { - return WebServices.getDatasourceByName(database); - } - public AutoCompleteMatcher getAutoCompleteMatcher() { EpisodeListProvider sdb = WebServices.getEpisodeListProvider(database); if (sdb != null) { return new EpisodeListMatcher(sdb, sdb != WebServices.AniDB, sdb == WebServices.AniDB); } - MovieIdentificationService mdb = WebServices.getMovieIdentificationService(database); if (mdb != null) { return new MovieHashMatcher(mdb); } - MusicIdentificationService adb = WebServices.getMusicIdentificationService(database); if (adb != null) { return new AudioFingerprintMatcher(adb); } + if (PlainFileMatcher.INSTANCE.getName().equals(database)) { + return PlainFileMatcher.INSTANCE; + } + throw new IllegalStateException(database); + } + public Datasource getDatasource() { + if (database == null || database.isEmpty()) { + return null; + } + EpisodeListProvider sdb = WebServices.getEpisodeListProvider(database); + if (sdb != null) { + return sdb; + } + MovieIdentificationService mdb = WebServices.getMovieIdentificationService(database); + if (mdb != null) { + return mdb; + } + MusicIdentificationService adb = WebServices.getMusicIdentificationService(database); + if (adb != null) { + return adb; + } + if (PlainFileMatcher.INSTANCE.getName().equals(database)) { + return PlainFileMatcher.INSTANCE; + } throw new IllegalStateException(database); } diff --git a/source/net/filebot/ui/rename/PresetEditor.java b/source/net/filebot/ui/rename/PresetEditor.java index 4f092b13..172ba642 100644 --- a/source/net/filebot/ui/rename/PresetEditor.java +++ b/source/net/filebot/ui/rename/PresetEditor.java @@ -11,6 +11,7 @@ import java.awt.Window; import java.awt.event.ActionEvent; import java.io.File; import java.util.EnumSet; +import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; @@ -37,9 +38,10 @@ import net.filebot.UserFiles; import net.filebot.WebServices; import net.filebot.format.ExpressionFilter; import net.filebot.format.ExpressionFormat; +import net.filebot.format.MediaBindingBean; import net.filebot.ui.HeaderPanel; +import net.filebot.util.FileUtilities.ExtensionFileFilter; import net.filebot.web.Datasource; -import net.filebot.web.EpisodeListProvider; import net.filebot.web.SortOrder; import net.miginfocom.swing.MigLayout; @@ -76,7 +78,7 @@ public class PresetEditor extends JDialog { presetNameHeader = new HeaderPanel(); inheritRadio = new JRadioButton("Use Original Files selection"); - selectRadio = new JRadioButton("Do Select"); + selectRadio = new JRadioButton("Do Select files"); pathInput = new JTextField(40); filterEditor = createEditor(); @@ -134,9 +136,6 @@ public class PresetEditor extends JDialog { selectRadio.addItemListener((evt) -> { inputPanel.setVisible(selectRadio.isSelected()); }); - providerCombo.addItemListener((evt) -> { - sortOrderCombo.setEnabled(evt.getItem() instanceof EpisodeListProvider); - }); setSize(650, 570); } @@ -218,6 +217,7 @@ public class PresetEditor extends JDialog { providers.addElement(it); } } + providers.addElement(PlainFileMatcher.INSTANCE); JComboBox combo = new JComboBox(providers); combo.setRenderer(new ListCellRenderer() { @@ -328,7 +328,16 @@ public class PresetEditor extends JDialog { @Override public void actionPerformed(ActionEvent evt) { FormatDialog.Mode mode = FormatDialog.Mode.getMode((Datasource) providerCombo.getSelectedItem()); - FormatDialog dialog = new FormatDialog(getWindow(evt.getSource()), mode, null); + MediaBindingBean lockOnBinding = null; + if (mode == FormatDialog.Mode.File) { + List files = UserFiles.showLoadDialogSelectFiles(false, false, null, new ExtensionFileFilter(ExtensionFileFilter.WILDCARD), "Select Sample File", evt); + if (files.isEmpty()) { + return; + } + lockOnBinding = new MediaBindingBean(files.get(0), files.get(0)); + } + + FormatDialog dialog = new FormatDialog(getWindow(evt.getSource()), mode, lockOnBinding); dialog.setFormatCode(formatEditor.getText()); dialog.setLocation(getOffsetLocation(dialog.getOwner())); dialog.setVisible(true); diff --git a/source/net/filebot/ui/rename/RenamePanel.java b/source/net/filebot/ui/rename/RenamePanel.java index 76d386d5..54b1f1df 100644 --- a/source/net/filebot/ui/rename/RenamePanel.java +++ b/source/net/filebot/ui/rename/RenamePanel.java @@ -1,6 +1,7 @@ package net.filebot.ui.rename; import static java.awt.event.KeyEvent.*; +import static java.util.Collections.*; import static javax.swing.JOptionPane.*; import static javax.swing.KeyStroke.*; import static javax.swing.SwingUtilities.*; @@ -421,6 +422,7 @@ public class RenamePanel extends JComponent { } PresetEditor presetEditor = new PresetEditor(getWindow(evt.getSource())); + presetEditor.setLocation(getOffsetLocation(presetEditor.getOwner())); presetEditor.setPreset(preset); presetEditor.setVisible(true); @@ -698,6 +700,11 @@ public class RenamePanel extends JComponent { public List getFiles(ActionEvent evt) { List input = new ArrayList(); if (preset.getInputFolder() != null) { + if (isMacSandbox()) { + if (!MacAppUtilities.askUnlockFolders(getWindow(RenamePanel.this), singleton(preset.getInputFolder()))) { + throw new IllegalStateException("Unable to access folder: " + preset.getInputFolder()); + } + } input.addAll(FileUtilities.listFiles(preset.getInputFolder())); ExpressionFilter filter = preset.getIncludeFilter(); if (filter != null) { @@ -715,6 +722,10 @@ public class RenamePanel extends JComponent { } else { input.addAll(super.getFiles(evt)); } + + if (input.isEmpty()) { + throw new IllegalStateException("No files selected."); + } return input; } @@ -755,7 +766,11 @@ public class RenamePanel extends JComponent { new SetRenameAction(preset.getRenameAction(), preset.getRenameAction().getDisplayName(), ResourceManager.getIcon("rename.action." + preset.getRenameAction().toString().toLowerCase())).actionPerformed(evt); } - super.actionPerformed(evt); + try { + super.actionPerformed(evt); + } catch (Exception e) { + UILogger.info(e.getMessage()); + } } }