package io.lumify.gpw.video; import com.google.inject.Inject; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkerPrepareData; import io.lumify.core.ingest.graphProperty.PostMimeTypeWorker; import io.lumify.core.model.ontology.OntologyRepository; import io.lumify.core.util.ProcessRunner; import io.lumify.gpw.util.*; import org.json.JSONObject; import org.securegraph.Authorizations; import org.securegraph.Metadata; import org.securegraph.Vertex; import org.securegraph.Visibility; import org.securegraph.mutation.ExistingElementMutation; import java.io.File; import java.util.ArrayList; import java.util.List; public class VideoPostMimeTypeWorker extends PostMimeTypeWorker { public static final String MULTI_VALUE_PROPERTY_KEY = VideoPostMimeTypeWorker.class.getName(); private ProcessRunner processRunner; private OntologyRepository ontologyRepository; private String durationIri; private String geoLocationIri; private String dateTakenIri; private String deviceMakeIri; private String deviceModelIri; private String widthIri; private String heightIri; private String metadataIri; private String clockwiseRotationIri; private String fileSizeIri; @Override public void prepare(GraphPropertyWorkerPrepareData workerPrepareData) throws Exception { super.prepare(workerPrepareData); durationIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.duration"); geoLocationIri = ontologyRepository.getRequiredPropertyIRIByIntent("geoLocation"); dateTakenIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.dateTaken"); deviceMakeIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.deviceMake"); deviceModelIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.deviceModel"); widthIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.width"); heightIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.height"); metadataIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.metadata"); clockwiseRotationIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.clockwiseRotation"); fileSizeIri = ontologyRepository.getRequiredPropertyIRIByIntent("media.fileSize"); } @Override public void execute(String mimeType, GraphPropertyWorkData data, Authorizations authorizations) throws Exception { if (!mimeType.startsWith("video")) { return; } File localFile = getLocalFileForRaw(data.getElement()); JSONObject videoMetadata = FFprobeExecutor.getJson(processRunner, localFile.getAbsolutePath()); ExistingElementMutation<Vertex> m = data.getElement().prepareMutation(); List<String> properties = new ArrayList<String>(); Metadata metadata = data.createPropertyMetadata(); if (videoMetadata != null) { setProperty(durationIri, FFprobeDurationUtil.getDuration(videoMetadata), m, metadata, data, properties); setProperty(geoLocationIri, FFprobeGeoLocationUtil.getGeoPoint(videoMetadata), m, metadata, data, properties); setProperty(dateTakenIri, FFprobeDateUtil.getDateTaken(videoMetadata), m, metadata, data, properties); setProperty(deviceMakeIri, FFprobeMakeAndModelUtil.getMake(videoMetadata), m, metadata, data, properties); setProperty(deviceModelIri, FFprobeMakeAndModelUtil.getModel(videoMetadata), m, metadata, data, properties); setProperty(widthIri, FFprobeDimensionsUtil.getWidth(videoMetadata), m, metadata, data, properties); setProperty(heightIri, FFprobeDimensionsUtil.getHeight(videoMetadata), m, metadata, data, properties); setProperty(metadataIri, videoMetadata.toString(), m, metadata, data, properties); setProperty(clockwiseRotationIri, FFprobeRotationUtil.getRotation(videoMetadata), m, metadata, data, properties); } setProperty(fileSizeIri, FileSizeUtil.getSize(localFile), m, metadata, data, properties); m.save(authorizations); getGraph().flush(); for (String propertyName : properties) { getWorkQueueRepository().pushGraphPropertyQueue(data.getElement(), MULTI_VALUE_PROPERTY_KEY, propertyName); } getGraph().flush(); } private void setProperty(String iri, Object value, ExistingElementMutation<Vertex> mutation, Metadata metadata, GraphPropertyWorkData data, List<String> properties) { if (iri != null && value != null) { mutation.addPropertyValue(MULTI_VALUE_PROPERTY_KEY, iri, value, metadata, new Visibility(data.getVisibilitySource())); properties.add(iri); } } @Inject public void setProcessRunner(ProcessRunner processRunner) { this.processRunner = processRunner; } @Inject public void setOntologyRepository(OntologyRepository ontologyRepository) { this.ontologyRepository = ontologyRepository; } }