package org.lodder.subtools.multisubdownloader.actions;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings;
import org.lodder.subtools.sublibrary.control.ReleaseParser;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.util.FilenameContainsFilter;
import org.lodder.subtools.sublibrary.util.FilenameExtensionFilter;
import org.lodder.subtools.sublibrary.util.Files;
import org.lodder.subtools.sublibrary.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CleanAction {
private static final Logger LOGGER = LoggerFactory.getLogger(CleanAction.class);
private LibrarySettings librarySettings;
private final String[] fileFilters = new String[] {"nfo", "jpg", "sfv", "srr", "srs", "nzb",
"torrent", "txt"};
private final String[] folderFilters = new String[] {"sample", "Sample"};
private final static String sampleDirName = "sample";
public CleanAction(LibrarySettings librarySettings) {
this.librarySettings = librarySettings;
}
public void cleanUpFiles(Release release, File path, String videoFileName) throws IOException {
LOGGER.trace("cleanUpFiles: LibraryOtherFileAction", librarySettings.getLibraryOtherFileAction());
String[] files = release.getPath().list(new FilenameExtensionFilter(fileFilters));
if (files == null) files = new String[] {};
String[] folders = release.getPath().list(new FilenameContainsFilter(folderFilters));
if (folders == null) folders = new String[] {};
// remove duplicates using set
final Set<String> list =
new LinkedHashSet<String>(Arrays.asList(StringUtils.join(files, folders)));
switch (librarySettings.getLibraryOtherFileAction()) {
case MOVE:
doMove(release, list, path);
break;
case MOVEANDRENAME:
doMoveAndRename(release, list, path, videoFileName);
break;
case NOTHING:
break;
case REMOVE:
doRemove(release, list);
break;
case RENAME:
doRename(release, path, videoFileName, files);
break;
default:
break;
}
}
private void doRename(Release release, File path, String videoFileName, String[] files)
throws IOException {
for (String s : files) {
String extension = ReleaseParser.extractFileNameExtension(s);
File f = new File(release.getPath(), s);
if (s.contains(sampleDirName) && !f.isDirectory()) {
extension = sampleDirName + "." + extension;
}
if (f.isFile()) {
final String filename =
videoFileName.substring(0, videoFileName.lastIndexOf(".")).concat("." + extension);
Files.move(f, new File(release.getPath(), filename));
} else {
Files.move(f, new File(path, s));
}
}
}
private void doRemove(Release release, Set<String> list) throws IOException {
for (String s : list) {
final File file = new File(release.getPath(), s);
if (file.isDirectory()) {
FileUtils.deleteDirectory(file);
} else {
@SuppressWarnings("unused")
boolean isDelete = file.delete();
}
}
}
private void doMoveAndRename(Release release, Set<String> list, File path, String videoFileName)
throws IOException {
for (String s : list) {
String extension = ReleaseParser.extractFileNameExtension(s);
File f = new File(release.getPath(), s);
if (s.contains(sampleDirName) && !f.isDirectory()) {
extension = sampleDirName + "." + extension;
}
if (f.isFile()) {
final String filename =
videoFileName.substring(0, videoFileName.lastIndexOf(".")).concat("." + extension);
Files.move(f, new File(path, filename));
} else {
Files.move(f, new File(path, s));
}
}
}
private void doMove(Release release, Set<String> list, File path) throws IOException {
for (String s : list) {
Files.move(new File(release.getPath(), s), new File(path, s));
}
}
}