package io.lumify.ccextractor; import com.google.inject.Inject; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData; import io.lumify.core.ingest.graphProperty.GraphPropertyWorker; import io.lumify.core.ingest.video.VideoTranscript; import io.lumify.core.model.audit.AuditAction; import io.lumify.core.model.properties.LumifyProperties; import io.lumify.core.util.ProcessRunner; import io.lumify.gpw.video.SubRip; import org.securegraph.Element; import org.securegraph.Metadata; import org.securegraph.Property; import org.securegraph.Vertex; import org.securegraph.mutation.ExistingElementMutation; import java.io.File; import java.io.InputStream; public class CCExtractorGraphPropertyWorker extends GraphPropertyWorker { private static final String PROPERTY_KEY = CCExtractorGraphPropertyWorker.class.getName(); private ProcessRunner processRunner; @Override public void execute(InputStream in, GraphPropertyWorkData data) throws Exception { File ccFile = File.createTempFile("ccextract", "txt"); ccFile.delete(); try { processRunner.execute( "ccextractor", new String[]{ "-o", ccFile.getAbsolutePath(), "-in=mp4", data.getLocalFile().getAbsolutePath() }, null, data.getLocalFile().getAbsolutePath() + ": " ); VideoTranscript videoTranscript = SubRip.read(ccFile); if (videoTranscript.getEntries().size() == 0) { return; } ExistingElementMutation<Vertex> m = data.getElement().prepareMutation(); Metadata metadata = data.createPropertyMetadata(); LumifyProperties.META_DATA_TEXT_DESCRIPTION.setMetadata(metadata, "Close Caption", getVisibilityTranslator().getDefaultVisibility()); addVideoTranscriptAsTextPropertiesToMutation(m, PROPERTY_KEY, videoTranscript, metadata, data.getVisibility()); Vertex v = m.save(getAuthorizations()); getAuditRepository().auditVertexElementMutation(AuditAction.UPDATE, m, v, PROPERTY_KEY, getUser(), data.getVisibility()); getAuditRepository().auditAnalyzedBy(AuditAction.ANALYZED_BY, v, getClass().getSimpleName(), getUser(), data.getVisibility()); getGraph().flush(); pushVideoTranscriptTextPropertiesOnWorkQueue(data.getElement(), PROPERTY_KEY, videoTranscript); } finally { ccFile.delete(); } } @Override public boolean isHandled(Element element, Property property) { if (property == null) { return false; } if (!property.getName().equals(LumifyProperties.RAW.getPropertyName())) { return false; } String mimeType = LumifyProperties.MIME_TYPE.getMetadataValue(property.getMetadata(), null); if (mimeType == null || !mimeType.startsWith("video")) { return false; } return true; } @Override public boolean isLocalFileRequired() { return true; } @Inject public void setProcessRunner(ProcessRunner ffmpeg) { this.processRunner = ffmpeg; } }