Adds handling of external subtitles for anime
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good
All checks were successful
KnarCraft/FFmpegConvert/pipeline/head This commit looks good
This commit is contained in:
parent
3335d70930
commit
405c94789b
@ -57,8 +57,10 @@ public class AnimeConverter extends Converter {
|
|||||||
}
|
}
|
||||||
String newPath = fileCollisionPrevention(folder.getAbsolutePath() + File.separator +
|
String newPath = fileCollisionPrevention(folder.getAbsolutePath() + File.separator +
|
||||||
stripExtension(file) + ".mp4", "mp4");
|
stripExtension(file) + ".mp4", "mp4");
|
||||||
|
printl();
|
||||||
printl("Preparing to start process...");
|
printl("Preparing to start process...");
|
||||||
String[] command = builderCommand(ffmpegPath, file.getName(), streams, newPath);
|
printl("Converting " + file);
|
||||||
|
String[] command = builderCommand(ffmpegPath, file.getName(), streams, newPath, file);
|
||||||
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
||||||
convertProcess(processBuilder, folder);
|
convertProcess(processBuilder, folder);
|
||||||
}
|
}
|
||||||
@ -71,7 +73,8 @@ public class AnimeConverter extends Converter {
|
|||||||
* @param outFile <p>The output file.</p>
|
* @param outFile <p>The output file.</p>
|
||||||
* @return <p>A list of commands</p>
|
* @return <p>A list of commands</p>
|
||||||
*/
|
*/
|
||||||
private String[] builderCommand(String executable, String fileName, List<StreamObject> streams, String outFile) {
|
private String[] builderCommand(String executable, String fileName, List<StreamObject> streams, String outFile,
|
||||||
|
File file) {
|
||||||
List<String> command = ffmpegWebVideo(executable, fileName);
|
List<String> command = ffmpegWebVideo(executable, fileName);
|
||||||
|
|
||||||
if (this.DEBUG) {
|
if (this.DEBUG) {
|
||||||
@ -100,7 +103,7 @@ public class AnimeConverter extends Converter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addAudioStreams(command, audioStream);
|
addAudioStreams(command, audioStream);
|
||||||
addSubtitles(command, subtitleStream, videoStream, fileName);
|
addSubtitles(command, subtitleStream, videoStream, fileName, file);
|
||||||
|
|
||||||
command.add(outFile);
|
command.add(outFile);
|
||||||
return command.toArray(new String[0]);
|
return command.toArray(new String[0]);
|
||||||
@ -128,9 +131,13 @@ public class AnimeConverter extends Converter {
|
|||||||
* @param subtitleStream <p>The subtitle stream to be used.</p>
|
* @param subtitleStream <p>The subtitle stream to be used.</p>
|
||||||
* @param videoStream <p>The video stream to be used.</p>
|
* @param videoStream <p>The video stream to be used.</p>
|
||||||
* @param fileName <p>The name of the file which is converted.</p>
|
* @param fileName <p>The name of the file which is converted.</p>
|
||||||
|
* @param file <p>The file to convert.</p>
|
||||||
*/
|
*/
|
||||||
private void addSubtitles(List<String> command, SubtitleStream subtitleStream, VideoStream videoStream,
|
private void addSubtitles(List<String> command, SubtitleStream subtitleStream, VideoStream videoStream,
|
||||||
String fileName) {
|
String fileName, File file) {
|
||||||
|
File folder = file.getParentFile();
|
||||||
|
String externalImageSubtitle = hasExternalImageSubtitle(folder.getAbsolutePath(), fileName);
|
||||||
|
String externalSubtitle = hasExternalSubtitle(folder.getAbsolutePath(), fileName);
|
||||||
if (subtitleStream != null && subtitleStream.getIsImageSubtitle()) {
|
if (subtitleStream != null && subtitleStream.getIsImageSubtitle()) {
|
||||||
command.add("-filter_complex");
|
command.add("-filter_complex");
|
||||||
String filter = String.format("[0:v:%d][0:%d]overlay", videoStream.getAbsoluteIndex(),
|
String filter = String.format("[0:v:%d][0:%d]overlay", videoStream.getAbsoluteIndex(),
|
||||||
@ -144,6 +151,20 @@ public class AnimeConverter extends Converter {
|
|||||||
String subtitleCommand = String.format("subtitles='%s':si=%d", safeFileName,
|
String subtitleCommand = String.format("subtitles='%s':si=%d", safeFileName,
|
||||||
subtitleStream.getRelativeIndex());
|
subtitleStream.getRelativeIndex());
|
||||||
command.add(subtitleCommand);
|
command.add(subtitleCommand);
|
||||||
|
} else if (!externalSubtitle.equals("")) {
|
||||||
|
command.add("-map");
|
||||||
|
command.add(String.format("0:%d", videoStream.getAbsoluteIndex()));
|
||||||
|
command.add("-vf");
|
||||||
|
String subtitleCommand = String.format("subtitles='%s'", escapeSpecialCharactersInFileName(externalSubtitle));
|
||||||
|
command.add(subtitleCommand);
|
||||||
|
} else if (!externalImageSubtitle.equals("")) {
|
||||||
|
command.add("-i");
|
||||||
|
command.add(stripExtension(fileName) + externalImageSubtitle);
|
||||||
|
command.add("-filter_complex");
|
||||||
|
command.add(String.format("[1:s]scale=width=1272:height=720,crop=w=1272:h=720:x=0:y=out_h[sub];[%d:v]" +
|
||||||
|
"[sub]overlay", videoStream.getAbsoluteIndex()));
|
||||||
|
command.add("-profile:v");
|
||||||
|
command.add("baseline");
|
||||||
} else {
|
} else {
|
||||||
command.add("-map");
|
command.add("-map");
|
||||||
command.add(String.format("0:%d", videoStream.getAbsoluteIndex()));
|
command.add(String.format("0:%d", videoStream.getAbsoluteIndex()));
|
||||||
|
@ -452,7 +452,7 @@ public abstract class Converter {
|
|||||||
* @param input <p>The text to print.</p>
|
* @param input <p>The text to print.</p>
|
||||||
* @throws IOException <p>If a write is not possible.</p>
|
* @throws IOException <p>If a write is not possible.</p>
|
||||||
*/
|
*/
|
||||||
static void print(String input) throws IOException {
|
private static void print(String input) throws IOException {
|
||||||
if (!input.equals("")) {
|
if (!input.equals("")) {
|
||||||
writer.write(input);
|
writer.write(input);
|
||||||
writer.flush();
|
writer.flush();
|
||||||
@ -479,4 +479,37 @@ public abstract class Converter {
|
|||||||
writer.newLine();
|
writer.newLine();
|
||||||
writer.flush();
|
writer.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether there exists an external image subtitle with the same filename as the file
|
||||||
|
* @param directory <p>The directory containing the file.</p>
|
||||||
|
* @param file <p>The file to be converted.</p>
|
||||||
|
* @return <p>The extension of the subtitle or empty if no subtitle was found.</p>
|
||||||
|
*/
|
||||||
|
String hasExternalImageSubtitle(String directory, String file) {
|
||||||
|
String path = stripExtension(file);
|
||||||
|
for (String subtitleExtension : new String[] {".idx", ".sub"}) {
|
||||||
|
if (new File(directory + File.separator + path + subtitleExtension).exists()) {
|
||||||
|
return path + subtitleExtension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether there exists an external subtitle with the same filename as the file
|
||||||
|
* @param directory <p>The directory containing the file.</p>
|
||||||
|
* @param file <p>The file to be converted.</p>
|
||||||
|
* @return <p>The extension of the subtitle or empty if no subtitle was found.</p>
|
||||||
|
*/
|
||||||
|
String hasExternalSubtitle(String directory, String file) {
|
||||||
|
String path = stripExtension(file);
|
||||||
|
for (String subtitleExtension : new String[] {".srt", ".ass"}) {
|
||||||
|
System.out.println(directory + File.separator + path + subtitleExtension);
|
||||||
|
if (new File(directory + File.separator + path + subtitleExtension).exists()) {
|
||||||
|
return path + subtitleExtension;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,10 +95,10 @@ public class VideoConverter extends Converter {
|
|||||||
String externalImageSubtitle = hasExternalImageSubtitle(folder.getAbsolutePath(), fileName);
|
String externalImageSubtitle = hasExternalImageSubtitle(folder.getAbsolutePath(), fileName);
|
||||||
if (!externalSubtitle.equals("")) {
|
if (!externalSubtitle.equals("")) {
|
||||||
command.add("-vf");
|
command.add("-vf");
|
||||||
command.add("subtitles=" + stripExtension(fileName) + externalSubtitle);
|
command.add("subtitles=" + externalSubtitle);
|
||||||
} else if (!externalImageSubtitle.equals("")) {
|
} else if (!externalImageSubtitle.equals("")) {
|
||||||
command.add("-i");
|
command.add("-i");
|
||||||
command.add(stripExtension(fileName) + externalImageSubtitle);
|
command.add(externalImageSubtitle);
|
||||||
if (this.DEBUG) {
|
if (this.DEBUG) {
|
||||||
addDebug(command, 50, 120);
|
addDebug(command, 50, 120);
|
||||||
}
|
}
|
||||||
@ -122,38 +122,6 @@ public class VideoConverter extends Converter {
|
|||||||
command.add("pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR");
|
command.add("pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether there exists an external image subtitle with the same filename as the file
|
|
||||||
* @param directory <p>The directory containing the file.</p>
|
|
||||||
* @param file <p>The file to be converted.</p>
|
|
||||||
* @return <p>The extension of the subtitle or empty if no subtitle was found.</p>
|
|
||||||
*/
|
|
||||||
private String hasExternalImageSubtitle(String directory, String file) {
|
|
||||||
String path = stripExtension(file);
|
|
||||||
for (String subtitleExtension : new String[] {".idx", ".sub"}) {
|
|
||||||
if (new File(directory + File.separator + path + subtitleExtension).exists()) {
|
|
||||||
return subtitleExtension;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether there exists an external subtitle with the same filename as the file
|
|
||||||
* @param directory <p>The directory containing the file.</p>
|
|
||||||
* @param file <p>The file to be converted.</p>
|
|
||||||
* @return <p>The extension of the subtitle or empty if no subtitle was found.</p>
|
|
||||||
*/
|
|
||||||
private String hasExternalSubtitle(String directory, String file) {
|
|
||||||
String path = stripExtension(file);
|
|
||||||
for (String subtitleExtension : new String[] {".srt", ".ass"}) {
|
|
||||||
if (new File(directory + File.separator + path + subtitleExtension).exists()) {
|
|
||||||
return subtitleExtension;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getValidFormats() {
|
public String[] getValidFormats() {
|
||||||
return VIDEO_FORMATS;
|
return VIDEO_FORMATS;
|
||||||
|
Loading…
Reference in New Issue
Block a user