From 877e52c02a7cd439d5f71863d6dc23670ef2fa34 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Mon, 27 May 2019 15:25:22 +0700 Subject: [PATCH] Add ExpressionMapper interface --- source/net/filebot/cli/ArgumentProcessor.java | 2 +- source/net/filebot/cli/CmdlineInterface.java | 2 +- source/net/filebot/cli/CmdlineOperations.java | 45 ++++++++++++++----- .../net/filebot/cli/ScriptShellBaseClass.java | 2 +- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/source/net/filebot/cli/ArgumentProcessor.java b/source/net/filebot/cli/ArgumentProcessor.java index 90070c0e..341fac80 100644 --- a/source/net/filebot/cli/ArgumentProcessor.java +++ b/source/net/filebot/cli/ArgumentProcessor.java @@ -88,7 +88,7 @@ public class ArgumentProcessor { return cli.renameLinear(args.getFiles(true), args.getEpisodeListProvider(), args.getSearchQuery(), args.getSortOrder(), args.getLanguage().getLocale(), args.getExpressionFilter(), args.getExpressionMapper(), args.getExpressionFileFormat(), args.getAbsoluteOutputFolder(), args.getRenameAction(), args.getConflictAction(), args.getExecCommand()).size() > 0 ? SUCCESS : ERROR; } else { // print episode info - return print(cli.fetchEpisodeList(args.getEpisodeListProvider(), args.getSearchQuery(), args.getSortOrder(), args.getLanguage().getLocale(), args.getExpressionFilter(), args.getExpressionFormat(), args.isStrict())); + return print(cli.fetchEpisodeList(args.getEpisodeListProvider(), args.getSearchQuery(), args.getSortOrder(), args.getLanguage().getLocale(), args.getExpressionFilter(), args.getExpressionMapper(), args.getExpressionFormat(), args.isStrict())); } } diff --git a/source/net/filebot/cli/CmdlineInterface.java b/source/net/filebot/cli/CmdlineInterface.java index 61e49f7c..cdafc26c 100644 --- a/source/net/filebot/cli/CmdlineInterface.java +++ b/source/net/filebot/cli/CmdlineInterface.java @@ -41,7 +41,7 @@ public interface CmdlineInterface { File compute(Collection files, HashType hash, File output, Charset encoding) throws Exception; - Stream fetchEpisodeList(EpisodeListProvider db, String query, SortOrder order, Locale locale, ExpressionFilter filter, ExpressionFormat format, boolean strict) throws Exception; + Stream fetchEpisodeList(EpisodeListProvider db, String query, SortOrder order, Locale locale, ExpressionFilter filter, ExpressionMapper mapper, ExpressionFormat format, boolean strict) throws Exception; Stream getMediaInfo(Collection files, FileFilter filter, ExpressionFormat format) throws Exception; diff --git a/source/net/filebot/cli/CmdlineOperations.java b/source/net/filebot/cli/CmdlineOperations.java index 41027a40..bff94b3e 100644 --- a/source/net/filebot/cli/CmdlineOperations.java +++ b/source/net/filebot/cli/CmdlineOperations.java @@ -95,7 +95,7 @@ public class CmdlineOperations implements CmdlineInterface { // series mode if (db instanceof EpisodeListProvider) { - return renameSeries(files, action, conflict, output, format, (EpisodeListProvider) db, query, order, filter, locale, strict, exec); + return renameSeries(files, action, conflict, output, format, (EpisodeListProvider) db, query, order, filter, mapper, locale, strict, exec); } // music mode @@ -120,10 +120,10 @@ public class CmdlineOperations implements CmdlineInterface { results.addAll(renameMovie(it.getValue(), action, conflict, output, format, TheMovieDB, query, filter, locale, strict, exec)); break; case Series: - results.addAll(renameSeries(it.getValue(), action, conflict, output, format, TheTVDB, query, order, filter, locale, strict, exec)); + results.addAll(renameSeries(it.getValue(), action, conflict, output, format, TheTVDB, query, order, filter, mapper, locale, strict, exec)); break; case Anime: - results.addAll(renameSeries(it.getValue(), action, conflict, output, format, TheTVDB, query, SortOrder.Absolute, filter, locale, strict, exec)); + results.addAll(renameSeries(it.getValue(), action, conflict, output, format, TheTVDB, query, SortOrder.Absolute, filter, mapper, locale, strict, exec)); break; case Music: results.addAll(renameMusic(it.getValue(), action, conflict, output, format, asList(MediaInfoID3, AcoustID), exec)); // prefer existing ID3 tags and use acoustid only when necessary @@ -145,7 +145,7 @@ public class CmdlineOperations implements CmdlineInterface { @Override public List renameLinear(List files, EpisodeListProvider db, String query, SortOrder order, Locale locale, ExpressionFilter filter, ExpressionMapper mapper, ExpressionFileFormat format, File output, RenameAction action, ConflictAction conflict, ExecCommand exec) throws Exception { // match files and episodes in linear order - List episodes = fetchEpisodeList(db, query, filter, order, locale, false); + List episodes = fetchEpisodeList(db, query, filter, mapper, order, locale, false); List> matches = new ArrayList>(); for (int i = 0; i < files.size() && i < episodes.size(); i++) { @@ -162,7 +162,7 @@ public class CmdlineOperations implements CmdlineInterface { return renameAll(renameMap, renameAction, conflict, null, null); } - public List renameSeries(Collection files, RenameAction renameAction, ConflictAction conflictAction, File outputDir, ExpressionFileFormat format, EpisodeListProvider db, String query, SortOrder sortOrder, ExpressionFilter filter, Locale locale, boolean strict, ExecCommand exec) throws Exception { + public List renameSeries(Collection files, RenameAction renameAction, ConflictAction conflictAction, File outputDir, ExpressionFileFormat format, EpisodeListProvider db, String query, SortOrder sortOrder, ExpressionFilter filter, ExpressionMapper mapper, Locale locale, boolean strict, ExecCommand exec) throws Exception { log.config(format("Rename episodes using [%s] with [%s]", db.getName(), db.vetoRequestParameter(sortOrder))); // ignore sample files @@ -218,8 +218,9 @@ public class CmdlineOperations implements CmdlineInterface { continue; } - // filter episodes + // filter episodes and apply custom mappings episodes = applyExpressionFilter(episodes, filter); + episodes = applyExpressionMapper(episodes, mapper, Episode.class); for (List filesPerType : mapByMediaExtension(filter(batch, VIDEO_FILES, SUBTITLE_FILES)).values()) { matches.addAll(matchEpisodes(filesPerType, episodes, strict)); @@ -890,6 +891,25 @@ public class CmdlineOperations implements CmdlineInterface { }).collect(toList()); } + protected List applyExpressionMapper(List input, ExpressionMapper mapper, Class type) { + if (mapper == null) { + return input; + } + + log.fine(format("Apply mapper [%s] on [%d] items", mapper.getExpression(), input.size())); + + return input.stream().map(it -> { + try { + T result = (T) mapper.map(new MediaBindingBean(it, null, new EntryList(null, input)), type); + log.finest(format("Map [%s] to [%s]", it, result)); + return result; + } catch (Exception e) { + debug.warning(format("Exclude [%s] due to map failure: %s", it, e)); + return null; + } + }).filter(Objects::nonNull).distinct().collect(toList()); + } + protected T selectSearchResult(String query, Collection options) throws Exception { List matches = selectSearchResult(query, options, false, false, false, 1); return matches.size() > 0 ? matches.get(0) : null; @@ -1029,7 +1049,7 @@ public class CmdlineOperations implements CmdlineInterface { } } - private List fetchEpisodeList(EpisodeListProvider db, String query, ExpressionFilter filter, SortOrder order, Locale locale, boolean strict) throws Exception { + private List fetchEpisodeList(EpisodeListProvider db, String query, ExpressionFilter filter, ExpressionMapper mapper, SortOrder order, Locale locale, boolean strict) throws Exception { // sanity check if (query == null) { throw new CmdlineException(String.format("%s: query parameter is required", db.getName())); @@ -1056,8 +1076,11 @@ public class CmdlineOperations implements CmdlineInterface { throw new CmdlineException(String.format("%s: no results", db.getName())); } - // apply filter - return applyExpressionFilter(episodes, filter); + // filter episodes and apply custom mappings + episodes = applyExpressionFilter(episodes, filter); + episodes = applyExpressionMapper(episodes, mapper, Episode.class); + + return episodes; } private boolean isSeriesID(String query) { @@ -1065,9 +1088,9 @@ public class CmdlineOperations implements CmdlineInterface { } @Override - public Stream fetchEpisodeList(EpisodeListProvider db, String query, SortOrder order, Locale locale, ExpressionFilter filter, ExpressionFormat format, boolean strict) throws Exception { + public Stream fetchEpisodeList(EpisodeListProvider db, String query, SortOrder order, Locale locale, ExpressionFilter filter, ExpressionMapper mapper, ExpressionFormat format, boolean strict) throws Exception { // collect all episode objects first - List episodes = fetchEpisodeList(db, query, filter, order, locale, strict); + List episodes = fetchEpisodeList(db, query, filter, mapper, order, locale, strict); // instant format if (format == null) { diff --git a/source/net/filebot/cli/ScriptShellBaseClass.java b/source/net/filebot/cli/ScriptShellBaseClass.java index 92cef041..0b4d37e0 100644 --- a/source/net/filebot/cli/ScriptShellBaseClass.java +++ b/source/net/filebot/cli/ScriptShellBaseClass.java @@ -444,7 +444,7 @@ public abstract class ScriptShellBaseClass extends Script { ArgumentBean args = getArgumentBean(parameters); try { - return getCLI().fetchEpisodeList(args.getEpisodeListProvider(), args.getSearchQuery(), args.getSortOrder(), args.getLanguage().getLocale(), args.getExpressionFilter(), args.getExpressionFormat(), args.isStrict()).collect(toList()); + return getCLI().fetchEpisodeList(args.getEpisodeListProvider(), args.getSearchQuery(), args.getSortOrder(), args.getLanguage().getLocale(), args.getExpressionFilter(), args.getExpressionMapper(), args.getExpressionFormat(), args.isStrict()).collect(toList()); } catch (Exception e) { printException(e); }