/* MyMAM - Open Source Digital Media Asset Management.
* http://www.mymam.net
*
* Copyright 2013, MyMAM contributors as indicated by the @author tag.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.mymam.fileprocessor;
import net.mymam.data.json.FileProcessorTaskDataKeys;
import net.mymam.fileprocessor.exceptions.FileProcessingFailedException;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
/**
* @author fstab
*/
public class VideoFileGenerator {
private final Config config;
public VideoFileGenerator(Config config) {
this.config = config;
}
public Map<String, String> generateProxyVideos(String rootDir, String origFile) throws FileProcessingFailedException {
Path origPath = getOrigPath(rootDir, origFile);
Path generatedDir = makeGeneratedDir(origPath);
// The paremeters width and height are currently ignored when generating videos.
Path mp4 = generateFile(config.get(Config.Var.CLIENT_CMD_GENERATE_LOWRES_MP4), origPath, generatedDir, "lowRes.mp4", 0, 0);
Path webm = generateFile(config.get(Config.Var.CLIENT_CMD_GENERATE_LOWRES_WEBM), origPath, generatedDir, "lowRes.webm", 0, 0);
Map<String, String> result = new HashMap<>();
result.put(FileProcessorTaskDataKeys.LOW_RES_MP4, relPath(config, mp4, rootDir));
result.put(FileProcessorTaskDataKeys.LOW_RES_WEMB, relPath(config, webm, rootDir));
return result;
}
public Map<String, String> generateThumbnails(String rootDir, String origFile) throws FileProcessingFailedException {
Path origPath = getOrigPath(rootDir, origFile);
Path generatedDir = makeGeneratedDir(origPath);
Path small = generateFile(config.get(Config.Var.CLIENT_CMD_GENERATE_IMAGE), origPath, generatedDir, "small.jpg", 100, 75);
Path medium = generateFile(config.get(Config.Var.CLIENT_CMD_GENERATE_IMAGE), origPath, generatedDir, "medium.jpg", 200, 150);
Path large = generateFile(config.get(Config.Var.CLIENT_CMD_GENERATE_IMAGE), origPath, generatedDir, "large.jpg", 400, 300);
Map<String, String> result = new HashMap<>();
result.put(FileProcessorTaskDataKeys.SMALL_IMG, relPath(config, small, rootDir));
result.put(FileProcessorTaskDataKeys.MEDIUM_IMG, relPath(config, medium, rootDir));
result.put(FileProcessorTaskDataKeys.LARGE_IMG, relPath(config, large, rootDir));
result.put(FileProcessorTaskDataKeys.THUMBNAIL_OFFSET_MS, "" + 0L);
return result;
}
private Path getOrigPath(String rootDir, String origFile) throws FileProcessingFailedException {
Path origPath = Paths.get(config.get(Config.Var.CLIENT_MEDIAROOT), rootDir, origFile);
if ( ! Files.isRegularFile(origPath) ) {
throw new FileProcessingFailedException(origFile + " not found.");
}
return origPath;
}
private Path makeGeneratedDir(Path origPath) throws FileProcessingFailedException {
Path generatedDir = Paths.get(origPath.getParent().toString(), "generated");
try {
Files.createDirectory(generatedDir);
return generatedDir;
}
catch ( FileAlreadyExistsException e ) {
// ignore
return generatedDir;
}
catch ( Throwable t ) {
throw new FileProcessingFailedException(t);
}
}
private Path generateFile(String cmdLineTemplate, Path in, Path outDir, String outFile, int maxWidth, int maxHeight) throws FileProcessingFailedException {
try {
Path out = Paths.get(outDir.toString(), outFile);
// TODO: Make sure that weired file names cannot be used to inject shell scripts, like '"; rm -r *;'
String cmdLine = cmdLineTemplate
.replace("$INPUT_FILE", "\"" + in.toString() + "\"")
.replace("$OUTPUT_FILE", "\"" + out.toString() + "\"")
.replace("$MAX_WIDTH", Integer.toString(maxWidth))
.replace("$MAX_HEIGHT", Integer.toString(maxHeight));
CommandLine cmd = CommandLine.parse(cmdLine);
System.out.println("Executing " + cmd); // TODO: Use logging.
new DefaultExecutor().execute(cmd);
return out;
}
catch ( Throwable t ) {
throw new FileProcessingFailedException(t);
}
}
private String relPath(Config config, Path fullPath, String rootDir) {
// throws InvalidPathException, IllegalArgumentException
return Paths.get(config.get(Config.Var.CLIENT_MEDIAROOT), rootDir).relativize(fullPath).toString();
}
}