From 2d0a16688e8f3a4fd07eec5560ac7a75a99cbe5a Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Wed, 5 Oct 2016 15:00:03 +0800 Subject: [PATCH] Support "Generic File" renaming via the command-line tools by using `--db xattr -non-strict` so that only xattr-tagged files are processed in strict mode, but any generic file can be processed in non-strict mode (File object is used in absence of Episode/Movie object) --- source/net/filebot/cli/CmdlineOperations.java | 18 +++++++++--------- .../filebot/media/XattrMetaInfoProvider.java | 17 +++++++++++------ source/net/filebot/ui/rename/RenamePanel.java | 16 +++------------- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/source/net/filebot/cli/CmdlineOperations.java b/source/net/filebot/cli/CmdlineOperations.java index 9e303837..56dba619 100644 --- a/source/net/filebot/cli/CmdlineOperations.java +++ b/source/net/filebot/cli/CmdlineOperations.java @@ -115,8 +115,8 @@ public class CmdlineOperations implements CmdlineInterface { return renameMusic(files, action, conflictAction, outputDir, format, getMusicIdentificationService(db)); } - if (XattrMetaData.getName().equalsIgnoreCase(db)) { - return renameByMetaData(files, action, conflictAction, outputDir, format, filter, XattrMetaData); + if (XattrMetaData.getIdentifier().equalsIgnoreCase(db)) { + return renameFiles(files, action, conflictAction, outputDir, format, XattrMetaData, filter, strict); } // auto-detect mode for each fileset @@ -534,23 +534,23 @@ public class CmdlineOperations implements CmdlineInterface { return renameAll(renameMap, renameAction, conflictAction, null); } - public List renameByMetaData(Collection files, RenameAction renameAction, ConflictAction conflictAction, File outputDir, ExpressionFormat format, ExpressionFilter filter, XattrMetaInfoProvider service) throws Exception { + public List renameFiles(Collection files, RenameAction renameAction, ConflictAction conflictAction, File outputDir, ExpressionFormat format, XattrMetaInfoProvider service, ExpressionFilter filter, boolean strict) throws Exception { log.config(format("Rename files using [%s]", service.getName())); - // force sort order - List selection = sortByUniquePath(files); + // match to xattr metadata object or the file itself + Map matches = service.match(files, strict); + Map renameMap = new LinkedHashMap(); - for (Entry it : service.getMetaData(selection).entrySet()) { - MediaBindingBean bindingBean = new MediaBindingBean(it.getValue(), it.getKey()); + for (Entry it : matches.entrySet()) { + MediaBindingBean bindingBean = new MediaBindingBean(it.getValue(), it.getKey(), matches); if (filter == null || filter.matches(bindingBean)) { - String newName = (format != null) ? format.format(bindingBean) : validateFileName(it.getValue().toString()); + String newName = format != null ? format.format(bindingBean) : bindingBean.getInfoObject() instanceof File ? bindingBean.getInfoObject().toString() : validateFileName(bindingBean.getInfoObject().toString()); renameMap.put(it.getKey(), getDestinationFile(it.getKey(), newName, outputDir)); } } - // rename files according to xattr metadata objects return renameAll(renameMap, renameAction, conflictAction, null); } diff --git a/source/net/filebot/media/XattrMetaInfoProvider.java b/source/net/filebot/media/XattrMetaInfoProvider.java index 95d2bd3a..3582fa7e 100644 --- a/source/net/filebot/media/XattrMetaInfoProvider.java +++ b/source/net/filebot/media/XattrMetaInfoProvider.java @@ -1,8 +1,7 @@ package net.filebot.media; -import static net.filebot.media.XattrMetaInfo.*; - import java.io.File; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; @@ -22,13 +21,19 @@ public class XattrMetaInfoProvider implements Datasource { return null; } - public Map getMetaData(Iterable files) { + public Map match(Collection files, boolean strict) { + // enable xattr regardless of -DuseExtendedFileAttributes system properties + XattrMetaInfo xattr = new XattrMetaInfo(true, false); + Map result = new LinkedHashMap(); for (File f : files) { - Object metaObject = xattr.getMetaInfo(f); - if (metaObject != null) { - result.put(f, metaObject); + Object object = xattr.getMetaInfo(f); + + if (object != null) { + result.put(f, object); + } else if (!strict) { + result.put(f, f); } } diff --git a/source/net/filebot/ui/rename/RenamePanel.java b/source/net/filebot/ui/rename/RenamePanel.java index e45a89fe..eef4f1ab 100644 --- a/source/net/filebot/ui/rename/RenamePanel.java +++ b/source/net/filebot/ui/rename/RenamePanel.java @@ -314,21 +314,11 @@ public class RenamePanel extends JComponent { try { if (namesList.getModel().isEmpty()) { withWaitCursor(evt.getSource(), () -> { - // try to read xattr from all files - Map xattr = WebServices.XattrMetaData.getMetaData(renameModel.files()); - - // upper list is based on xattr metadata - List files = new ArrayList(xattr.keySet()); - List objects = new ArrayList(xattr.values()); - - // lower list is just the fallback file object - renameModel.files().stream().filter(f -> !xattr.containsKey(f)).forEach(f -> { - files.add(f); - objects.add(f); - }); + // match to xattr metadata object or the file itself + Map xattr = WebServices.XattrMetaData.match(renameModel.files(), false); renameModel.clear(); - renameModel.addAll(objects, files); + renameModel.addAll(xattr.values(), xattr.keySet()); }); } else { int index = namesList.getListComponent().getSelectedIndex();