package org.lodder.subtools.multisubdownloader.cli.actions;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.lodder.subtools.multisubdownloader.CLI;
import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.actions.ActionException;
import org.lodder.subtools.multisubdownloader.actions.FileListAction;
import org.lodder.subtools.multisubdownloader.actions.SearchAction;
import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException;
import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory;
import org.lodder.subtools.multisubdownloader.lib.control.subtitles.Filtering;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.Subtitle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CliSearchAction extends SearchAction {
private static final Logger LOGGER = LoggerFactory.getLogger(CliSearchAction.class);
private CLI cmd;
private FileListAction filelistAction;
private List<File> folders;
private boolean isRecursive;
private String languageCode;
private boolean overwriteSubtitles;
private ReleaseFactory releaseFactory;
private Filtering filtering;
public void setCommandLine(CLI cmd) {
this.cmd = cmd;
}
public void setFileListAction(FileListAction filelistAction) {
this.filelistAction = filelistAction;
}
public void setFolders(List<File> folders) {
this.folders = folders;
}
public void setRecursive(boolean recursive) {
this.isRecursive = recursive;
}
public void setOverwriteSubtitles(boolean overwrite) {
this.overwriteSubtitles = overwrite;
}
public void setReleaseFactory(ReleaseFactory releaseFactory) {
this.releaseFactory = releaseFactory;
}
public void setFiltering(Filtering filtering) {
this.filtering = filtering;
}
@Override
protected List<Release> createReleases() throws ActionException {
filelistAction.setIndexingProgressListener(this.indexingProgressListener);
List<File> files = new ArrayList<>();
for (File folder : this.folders) {
files.addAll(filelistAction.getFileListing(folder, this.isRecursive, this.languageCode,
this.overwriteSubtitles));
}
/* fix: remove carriage return from progressbar */
System.out.println("");
LOGGER.debug("# Files found to process [{}] ", files.size());
int total = files.size();
int index = 0;
int progress = 0;
System.out.println(Messages.getString("CliSearchAction.ParsingFoundFiles"));
this.indexingProgressListener.progress(progress);
List<Release> releases = new ArrayList<>();
for (File file : files) {
index++;
progress = (int) Math.floor((float) index / total * 100);
/* Tell progressListener which file we are processing */
this.indexingProgressListener.progress(file.getName());
Release release = this.releaseFactory.createRelease(file);
if (release == null) {
continue;
}
releases.add(release);
/* Update progressListener */
this.indexingProgressListener.progress(progress);
}
return releases;
}
@Override
protected String getLanguageCode() {
return this.languageCode;
}
public void setLanguageCode(String languageCode) {
this.languageCode = languageCode;
}
@Override
public void onFound(Release release, List<Subtitle> subtitles) {
if (filtering != null) {
subtitles = filtering.getFiltered(subtitles, release);
}
release.getMatchingSubs().addAll(subtitles);
if (searchManager.getProgress() < 100) {
return;
}
LOGGER.debug("found files for doDownload [{}]", releases.size());
/* stop printing progress */
this.searchProgressListener.completed();
this.cmd.download(releases);
}
@Override
protected void validate() throws SearchSetupException {
if (this.cmd == null) {
throw new SearchSetupException("Cmd must be set.");
}
if (this.languageCode == null) {
throw new SearchSetupException("LanguageCode must be set.");
}
if (this.filelistAction == null) {
throw new SearchSetupException("Actions must be set.");
}
if (this.folders == null || this.folders.size() <= 0) {
throw new SearchSetupException("Folders must be set.");
}
if (this.releaseFactory == null) {
throw new SearchSetupException("releaseFactory must be set.");
}
if (this.filtering == null) {
throw new SearchSetupException("Filtering must be set.");
}
super.validate();
}
@Override
protected String getLanguageCode(String language) {
/* Already provided and validated as code in cli */
return language;
}
}