package org.lodder.subtools.multisubdownloader; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.commons.cli.CommandLine; import org.lodder.subtools.multisubdownloader.actions.DownloadAction; import org.lodder.subtools.multisubdownloader.actions.FileListAction; import org.lodder.subtools.multisubdownloader.actions.SubtitleSelectionAction; import org.lodder.subtools.multisubdownloader.cli.actions.CliSearchAction; import org.lodder.subtools.multisubdownloader.cli.progress.CLIFileindexerProgress; import org.lodder.subtools.multisubdownloader.cli.progress.CLISearchProgress; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.lib.Info; import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory; import org.lodder.subtools.multisubdownloader.lib.SubtitleSelectionCLI; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.Filtering; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CLI { private static final Logger LOGGER = LoggerFactory.getLogger(CLI.class); private final Container app; private Settings settings; private boolean recursive = false; private String languagecode = ""; private boolean force = false; private List<File> folders = new ArrayList<>(); private boolean downloadall = false; private boolean subtitleSelection = false; private boolean verboseProgress = false; private DownloadAction downloadAction; private SubtitleSelectionAction subtitleSelectionAction; private boolean dryRun = false; public CLI(Settings settings, Container app) { this.app = app; this.settings = settings; checkUpdate((Manager) this.app.make("Manager")); downloadAction = new DownloadAction(settings, (Manager) this.app.make("Manager")); subtitleSelectionAction = new SubtitleSelectionAction(settings); subtitleSelectionAction.setSubtitleSelection(new SubtitleSelectionCLI(settings)); } private void checkUpdate(Manager manager) { UpdateAvailableDropbox u = new UpdateAvailableDropbox(manager); if (u.checkProgram(settings.getUpdateCheckPeriod())) { System.out.println(Messages.getString("UpdateAppAvailable") + ": " + u.getUpdateUrl()); } } public void setUp(CommandLine line) throws Exception { this.folders = getFolders(line); this.languagecode = getLanguageCode(line); this.force = line.hasOption("force"); this.downloadall = line.hasOption("downloadall"); this.recursive = line.hasOption("recursive"); this.subtitleSelection = line.hasOption("selection"); this.verboseProgress = line.hasOption("verboseprogress"); this.dryRun = line.hasOption("dryrun"); } public void run() { Info.subtitleSources(this.settings, true); Info.subtitleFiltering(this.settings, true); this.search(); } public void download(List<Release> releases) { Info.downloadOptions(this.settings, true); for (Release release : releases) { try { this.download(release); } catch (Exception e) { LOGGER.error("executeArgs: search", e); } } } public void search() { CliSearchAction searchAction = new CliSearchAction(); searchAction.setCommandLine(this); searchAction.setSettings(this.settings); searchAction.setProviderStore((SubtitleProviderStore) app.make("SubtitleProviderStore")); searchAction.setFolders(this.folders); searchAction.setRecursive(this.recursive); searchAction.setOverwriteSubtitles(this.force); searchAction.setLanguageCode(this.languagecode); searchAction.setFileListAction(new FileListAction(this.settings)); searchAction.setFiltering(new Filtering(this.settings)); searchAction .setReleaseFactory(new ReleaseFactory(this.settings, (Manager) app.make("Manager"))); CLIFileindexerProgress progressDialog = new CLIFileindexerProgress(); CLISearchProgress searchProgress = new CLISearchProgress(); progressDialog.setVerbose(this.verboseProgress); searchProgress.setVerbose(this.verboseProgress); searchAction.setIndexingProgressListener(progressDialog); searchAction.setSearchProgressListener(searchProgress); /* CLI has no benefit of running this in a separate Thread */ searchAction.run(); } private void download(Release release) throws Exception { int selection = subtitleSelectionAction.subtitleSelection(release, subtitleSelection, dryRun); if (selection >= 0) { if (downloadall) { System.out.println("Downloading ALL found subtitles for release: " + release.getFilename()); for (int j = 0; j < release.getMatchingSubs().size(); j++) { System.out.println("Downloading subtitle: " + release.getMatchingSubs().get(0).getFilename()); downloadAction.download(release, release.getMatchingSubs().get(j), j + 1); } } else { downloadAction.download(release, release.getMatchingSubs().get(selection)); } } else { if (dryRun && release.getMatchingSubs().size() == 0) System.out.println("No substitles found for: " + release.getFilename()); else if (selection == -1 && !dryRun) System.out.println("No substitles found for: " + release.getFilename()); } } private List<File> getFolders(CommandLine line) { List<File> folders = new ArrayList<>(); if (line.hasOption("folder")) { folders.add(new File(line.getOptionValue("folder"))); } else { folders.addAll(this.settings.getDefaultFolders()); } return folders; } private String getLanguageCode(CommandLine line) throws Exception { if (line.hasOption("language")) { String languagecode = line.getOptionValue("language").toLowerCase(); if (!isValidlanguageCode(languagecode)) { throw new Exception(Messages.getString("App.NoValidLanguage")); } return languagecode; } else { System.out.println(Messages.getString("App.NoLanguageUseDefault")); return "nl"; } } private boolean isValidlanguageCode(String languagecode) { return languagecode.equals("nl") || languagecode.equals("en"); } }