* added CLI for specifically fetching missing subtitles
This commit is contained in:
parent
5d5f52da69
commit
98349be576
|
@ -37,6 +37,9 @@ public class ArgumentBean {
|
||||||
@Option(name = "-get-subtitles", usage = "Fetch subtitles", metaVar = "fileset")
|
@Option(name = "-get-subtitles", usage = "Fetch subtitles", metaVar = "fileset")
|
||||||
public boolean getSubtitles;
|
public boolean getSubtitles;
|
||||||
|
|
||||||
|
@Option(name = "-get-missing-subtitles", usage = "Fetch missing subtitles", metaVar = "fileset")
|
||||||
|
public boolean getMissingSubtitles;
|
||||||
|
|
||||||
@Option(name = "--q", usage = "Search query", metaVar = "title")
|
@Option(name = "--q", usage = "Search query", metaVar = "title")
|
||||||
public String query;
|
public String query;
|
||||||
|
|
||||||
|
@ -84,7 +87,7 @@ public class ArgumentBean {
|
||||||
|
|
||||||
|
|
||||||
public boolean runCLI() {
|
public boolean runCLI() {
|
||||||
return rename || getSubtitles || check || list || mediaInfo || script != null;
|
return rename || getSubtitles || getMissingSubtitles || check || list || mediaInfo || script != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ import java.io.File;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.security.AccessController;
|
import java.security.AccessController;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.script.Bindings;
|
import javax.script.Bindings;
|
||||||
|
@ -63,8 +62,9 @@ public class ArgumentProcessor {
|
||||||
Set<File> files = new LinkedHashSet<File>(args.getFiles(true));
|
Set<File> files = new LinkedHashSet<File>(args.getFiles(true));
|
||||||
|
|
||||||
if (args.getSubtitles) {
|
if (args.getSubtitles) {
|
||||||
List<File> subtitles = cli.getSubtitles(files, args.query, args.lang, args.output, args.encoding, !args.nonStrict);
|
files.addAll(cli.getSubtitles(files, args.query, args.lang, args.output, args.encoding, !args.nonStrict));
|
||||||
files.addAll(subtitles);
|
} else if (args.getMissingSubtitles) {
|
||||||
|
files.addAll(cli.getMissingSubtitles(files, args.query, args.lang, args.output, args.encoding, !args.nonStrict));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.rename) {
|
if (args.rename) {
|
||||||
|
|
|
@ -15,6 +15,9 @@ public interface CmdlineInterface {
|
||||||
List<File> getSubtitles(Collection<File> files, String query, String lang, String output, String encoding, boolean strict) throws Exception;
|
List<File> getSubtitles(Collection<File> files, String query, String lang, String output, String encoding, boolean strict) throws Exception;
|
||||||
|
|
||||||
|
|
||||||
|
List<File> getMissingSubtitles(Collection<File> files, String query, String lang, String output, String encoding, boolean strict) throws Exception;
|
||||||
|
|
||||||
|
|
||||||
boolean check(Collection<File> files) throws Exception;
|
boolean check(Collection<File> files) throws Exception;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import static net.sourceforge.filebot.subtitle.SubtitleUtilities.*;
|
||||||
import static net.sourceforge.tuned.FileUtilities.*;
|
import static net.sourceforge.tuned.FileUtilities.*;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
@ -451,6 +452,40 @@ public class CmdlineOperations implements CmdlineInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<File> getMissingSubtitles(Collection<File> files, String query, String languageName, String output, String csn, boolean strict) throws Exception {
|
||||||
|
List<File> videoFiles = filter(filter(files, VIDEO_FILES), new FileFilter() {
|
||||||
|
|
||||||
|
// save time on repeating filesystem calls
|
||||||
|
private final Map<File, File[]> cache = new HashMap<File, File[]>();
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean accept(File video) {
|
||||||
|
File[] subtitlesByFolder = cache.get(video.getParentFile());
|
||||||
|
if (subtitlesByFolder == null) {
|
||||||
|
subtitlesByFolder = video.getParentFile().listFiles(SUBTITLE_FILES);
|
||||||
|
cache.put(video.getParentFile(), subtitlesByFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (File subtitle : subtitlesByFolder) {
|
||||||
|
if (isDerived(subtitle, video))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (videoFiles.isEmpty()) {
|
||||||
|
CLILogger.info("No missing subtitles");
|
||||||
|
return emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
CLILogger.finest(format("Missing subtitles for %d video files", videoFiles.size()));
|
||||||
|
return getSubtitles(videoFiles, query, languageName, output, csn, strict);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private File downloadSubtitle(SubtitleDescriptor descriptor, File movieFile, SubtitleFormat outputFormat, Charset outputEncoding) throws Exception {
|
private File downloadSubtitle(SubtitleDescriptor descriptor, File movieFile, SubtitleFormat outputFormat, Charset outputEncoding) throws Exception {
|
||||||
// fetch subtitle archive
|
// fetch subtitle archive
|
||||||
CLILogger.info(format("Fetching [%s]", descriptor.getPath()));
|
CLILogger.info(format("Fetching [%s]", descriptor.getPath()));
|
||||||
|
|
Loading…
Reference in New Issue