/**
* AccessTasks.java
* Author: Francesco Rosso (rosso@eurix.it)
*
* This file is part of PrestoPRIME Preservation Platform (P4).
*
* Copyright (C) 2009-2012 EURIX Srl, Torino, Italy
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.prestoprime.plugin.p4;
import it.eurix.archtools.data.DataException;
import it.eurix.archtools.data.model.DIP;
import it.eurix.archtools.data.model.IPException;
import it.eurix.archtools.data.model.DIP.DCField;
import it.eurix.archtools.tool.ToolException;
import it.eurix.archtools.workflow.exceptions.TaskExecutionFailedException;
import it.eurix.archtools.workflow.plugin.WfPlugin;
import it.eurix.archtools.workflow.plugin.WfPlugin.WfService;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.prestoprime.conf.ConfigurationManager;
import eu.prestoprime.conf.P4PropertyManager.P4Property;
import eu.prestoprime.datamanagement.P4DataManager;
import eu.prestoprime.plugin.p4.tools.FFmbc;
@WfPlugin(name = "P4Plugin")
public class AccessTasks {
private static final Logger logger = LoggerFactory.getLogger(AccessTasks.class);
@WfService(name = "make_consumer_segment", version = "2.2.0")
public void execute(Map<String, String> sParams, Map<String, String> dParamsString, Map<String, File> dParamFile) throws TaskExecutionFailedException {
if (!Boolean.parseBoolean(dParamsString.get("isSegmented"))) {
// retrieve static params
String destVolume = sParams.get("dest.path.volume").trim();
String destFolder = sParams.get("dest.path.folder").trim();
// retrieve dynamic params
String dipID = dParamsString.get("dipID");
String inputFilePath = dParamsString.get("source.file.path");
String mimeType = dParamsString.get("source.file.mimetype");
int startFrame = Integer.parseInt(dParamsString.get("start.frame"));
int stopFrame = Integer.parseInt(dParamsString.get("stop.frame"));
String outputFolder = destVolume + File.separator + destFolder;
try {
if (dipID == null)
throw new TaskExecutionFailedException("Missing AIP ID to extract fragment");
if (mimeType == null)
throw new TaskExecutionFailedException("Missing MIME Type to extract fragment");
DIP dip = P4DataManager.getInstance().getDIPByID(dipID);
if (inputFilePath == null) {
// trying to retrieve file path from DIP, last chance...
List<String> videoFileList = dip.getAVMaterial(mimeType, "FILE");
if (videoFileList.size() == 0) {
throw new TaskExecutionFailedException("Missing input file path to extract fragment");
} else {
inputFilePath = videoFileList.get(0);
}
}
File targetDir = new File(outputFolder);
targetDir.mkdirs();
if (!targetDir.canWrite())
throw new TaskExecutionFailedException("Unable to write to output dir " + outputFolder);
String targetFileName = dipID + "." + startFrame + "." + stopFrame + "." + FilenameUtils.getExtension(inputFilePath);
File targetFile = new File(targetDir, targetFileName);
int startSec = startFrame / 25;
int endSec = stopFrame / 25;
int durationSec = endSec - startSec;
String start = Integer.toString(startSec);
String duration = Integer.toString(durationSec);
List<String> formats = dip.getDCField(DCField.format);
StringBuilder formatSB = new StringBuilder();
for (String format : formats) {
formatSB.append(format + "\t");
}
// extract fragment using ffmbc
FFmbc ffmbc = new FFmbc();
ffmbc.extractSegment(inputFilePath, targetFile.getAbsolutePath(), start, duration, mimeType, formatSB.toString(), "2");
dParamsString.put("isSegmented", "true");
dParamsString.put("segment.file.path", targetFileName);
logger.debug("Consumer copy available at: " + targetFile.getAbsolutePath());
} catch (DataException e) {
e.printStackTrace();
throw new TaskExecutionFailedException("Unable to retrieve DIP with id: " + dipID);
} catch (IPException e) {
e.printStackTrace();
throw new TaskExecutionFailedException("Unable to retrieve MQ file");
} catch (ToolException e) {
e.printStackTrace();
throw new TaskExecutionFailedException("Unable to extract segment with FFMBC");
}
}
}
@WfService(name = "check_consumer_segment", version = "2.0.0")
public void checkConsumerSegment(Map<String, String> sParams, Map<String, String> dParamsString, Map<String, File> dParamsFile) throws TaskExecutionFailedException {
if (Boolean.parseBoolean(dParamsString.get("isSegmented"))) {
String p4url = ConfigurationManager.getPropertyInstance().getProperty(P4Property.P4_URL);
String mimeType = dParamsString.get("source.file.mimetype");
String targetFileName = dParamsString.get("segment.file.path");
String destVolume = sParams.get("dest.path.volume").trim();
String destFolder = sParams.get("dest.path.folder").trim();
String outputFolder = destVolume + File.separator + destFolder;
try {
JSONObject json = new JSONObject();
json.put("file", outputFolder + File.separator + targetFileName);
json.put("CIFS", "//" + new URL(p4url).getHost() + "/" + destFolder);
json.put("URL", p4url + "/" + destFolder + "/" + targetFileName);
json.put("mimetype", mimeType);
dParamsString.put("result", json.toString());
} catch (JSONException e) {
dParamsString.put("result", "Unable to print output file information...");
} catch (MalformedURLException e) {
throw new TaskExecutionFailedException("Malformed URL...");
}
} else {
throw new TaskExecutionFailedException("Unable to find any file with requested mimetype...");
}
}
}