|
From: <fn...@us...> - 2013-09-26 14:20:30
|
Revision: 4344
http://openutils.svn.sourceforge.net/openutils/?rev=4344&view=rev
Author: fnecci
Date: 2013-09-26 14:20:25 +0000 (Thu, 26 Sep 2013)
Log Message:
-----------
Included external video provider to integrate with a video service
Modified Paths:
--------------
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/pom.xml
Added Paths:
-----------
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadExternalVideoProvider.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadThread.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseExternalVideoProvider.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseVideoTypeHandler.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoProvider.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoTypeHandler.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoUtil.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAccount.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAsyncUploadExternalVideoProvider.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpUtil.java
magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/TrascodingExternalVideoProvider.java
Modified: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/pom.xml
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/pom.xml 2013-09-26 13:23:38 UTC (rev 4343)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/pom.xml 2013-09-26 14:20:25 UTC (rev 4344)
@@ -251,6 +251,11 @@
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>commons-net</groupId>
+ <artifactId>commons-net</artifactId>
+ <version>2.2</version>
+ </dependency>
</dependencies>
<properties>
<magnolia.version>4.4.7</magnolia.version>
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadExternalVideoProvider.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadExternalVideoProvider.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadExternalVideoProvider.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,76 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import info.magnolia.cms.core.Content;
+
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public abstract class AsyncUploadExternalVideoProvider extends BaseExternalVideoProvider
+{
+
+ public final static String STATUS_TO_UPLOAD = "to_upload";
+
+ public final static String STATUS_UPLOADING = "uploading";
+
+ public final static String STATUS_UPLOADED = "uploaded";
+
+ public static final String ND_PROGRESS = "uploadedBytes";
+
+ public static final String ND_ASYNC = "processingAsyncVideo";
+
+ private int numTries = 3;
+
+ /**
+ * {@inheritDoc}
+ */
+ public void processVideo(Content media)
+ {
+ ExternalVideoUtil.setProperty(media.getUUID(), ND_ASYNC, true);
+ // new AsyncUploadThread(this, media.getUUID()).start();
+ uploadedVideo( media.getUUID() );
+ }
+
+ public abstract void uploadVideo(String mediaUUID) throws IOException, RepositoryException;
+
+ public abstract void uploadedVideo(String mediaUUID);
+
+ public void endProcess(String mediaUUID)
+ {
+ ExternalVideoUtil.removeProperty(mediaUUID, ND_ASYNC);
+ ExternalVideoUtil.removeProperty(mediaUUID, ExternalVideoUtil.ND_STATUS);
+ ExternalVideoUtil.removeProperty(mediaUUID, ExternalVideoUtil.ND_STATUS_CHANGE);
+ ExternalVideoUtil.removeProperty(mediaUUID, ExternalVideoUtil.ND_PROGRESS);
+ }
+
+ /**
+ * Returns the nTries.
+ * @return the nTries
+ */
+ public int getNumTries()
+ {
+ return numTries;
+ }
+
+ /**
+ * Sets the nTries.
+ * @param nTries the nTries to set
+ */
+ public void setNumTries(int nTries)
+ {
+ this.numTries = nTries;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isAsyncUpload()
+ {
+ return true;
+ }
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadThread.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadThread.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/AsyncUploadThread.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,56 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.lang.StringUtils;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class AsyncUploadThread extends Thread
+{
+
+ private AsyncUploadExternalVideoProvider externalVideoProvider;
+
+ private String mediaUUID;
+
+ public AsyncUploadThread(AsyncUploadExternalVideoProvider externalVideoProvider, String mediaUUID)
+ {
+ this.externalVideoProvider = externalVideoProvider;
+ this.mediaUUID = mediaUUID;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run()
+ {
+ ExternalVideoUtil.setStatus(mediaUUID, AsyncUploadExternalVideoProvider.STATUS_UPLOADING);
+ Exception lastException = null;
+ for (int nTry = 0; nTry < externalVideoProvider.getNumTries(); nTry++)
+ {
+ try
+ {
+ externalVideoProvider.uploadVideo(mediaUUID);
+ ExternalVideoUtil.setStatus(mediaUUID, AsyncUploadExternalVideoProvider.STATUS_UPLOADED);
+ externalVideoProvider.uploadedVideo(mediaUUID);
+ return;
+ }
+ catch (IOException e)
+ {
+ lastException = e;
+ }
+ catch (RepositoryException e)
+ {
+ lastException = e;
+ }
+ }
+ ExternalVideoUtil.setError(mediaUUID, null, lastException != null ? lastException.getMessage() : StringUtils.EMPTY);
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseExternalVideoProvider.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseExternalVideoProvider.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseExternalVideoProvider.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,29 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public abstract class BaseExternalVideoProvider implements ExternalVideoProvider
+{
+
+ private String name;
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName()
+ {
+ return this.name;
+ }
+
+ /**
+ * Sets the name.
+ * @param name the name to set
+ */
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseVideoTypeHandler.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseVideoTypeHandler.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/BaseVideoTypeHandler.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,41 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import info.magnolia.cms.core.Content;
+
+import java.util.Map;
+
+import net.sourceforge.openutils.mgnlmedia.media.types.impl.MediaWithPreviewImageTypeHandler;
+import net.sourceforge.openutils.mgnlmedia.media.utils.MediaMetadataFormatUtils;
+
+
+/**
+ * @author dschivo
+ */
+public abstract class BaseVideoTypeHandler extends MediaWithPreviewImageTypeHandler
+{
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<String, String> getMediaInfo(Content media)
+ {
+
+ Map<String, String> info = super.getMediaInfo(media);
+
+ long duration = media.getNodeData(METADATA_DURATION).getLong();
+ if (duration > 0)
+ {
+ info.put(METADATA_DURATION, MediaMetadataFormatUtils.formatDuration(duration));
+ }
+
+ long framerate = media.getNodeData(METADATA_FRAMERATE).getLong();
+ if (framerate > 0)
+ {
+ info.put(METADATA_FRAMERATE, Long.toString(framerate));
+ }
+
+ return info;
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoProvider.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoProvider.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoProvider.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,39 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import info.magnolia.cms.beans.runtime.MultipartForm;
+import info.magnolia.cms.core.Content;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public interface ExternalVideoProvider
+{
+
+ void processVideo(Content media);
+
+ boolean isAsyncUpload();
+
+ String getUrl(Content media, Map<String, String> options);
+
+ String getNewNodeName(MultipartForm form, HttpServletRequest request);
+
+ String getName();
+
+ String getUploadFileName(Content media);
+
+ String getMediaUUIDFromFileName(String filename);
+
+ void stop();
+
+ String getThumbnailUrl(Content media);
+
+ String getPreviewUrl(Content media);
+
+ String getFilename(Content media);
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoTypeHandler.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoTypeHandler.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoTypeHandler.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,233 @@
+/**
+ *
+ * Magnolia SimpleMedia Module (http://www.openmindlab.com/lab/products/media.html)
+ * Copyright (C)2008 - 2010, Openmind S.r.l. http://www.openmindonline.it
+ *
+ * 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 net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import info.magnolia.cms.beans.runtime.MultipartForm;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.util.NodeDataUtil;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.AccessDeniedException;
+import javax.jcr.RepositoryException;
+import javax.servlet.http.HttpServletRequest;
+
+import net.sourceforge.openutils.mgnlmedia.media.configuration.MediaConfigurationManager;
+import net.sourceforge.openutils.mgnlmedia.media.types.MediaTypeHandler;
+
+
+/*
+ *
+ */
+public class ExternalVideoTypeHandler extends BaseVideoTypeHandler
+{
+
+ public static final String ND_PROVIDER = "provider";
+
+ public static ExternalVideoProvider getExternalVideoProvider(Content media)
+ {
+ MediaTypeHandler mth = MediaConfigurationManager
+ .getInstance()
+ .getMediaTypeConfigurationFromMedia(media)
+ .getHandler();
+ if (mth.getClass().isAssignableFrom(ExternalVideoTypeHandler.class))
+ {
+ return ((ExternalVideoTypeHandler) mth).getVideoProvider(media);
+ }
+ return null;
+ }
+
+ /**
+ * External video support, will be made configurable in future versions.
+ */
+ private Map<String, ExternalVideoProvider> videoProviders = new HashMap<String, ExternalVideoProvider>();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void init(Content typeDefinitionNode)
+ {
+ super.init(typeDefinitionNode);
+ }
+
+ /**
+ * Returns the videoProviders.
+ * @return the videoProviders
+ */
+ public Map<String, ExternalVideoProvider> getVideoProviders()
+ {
+ return videoProviders;
+ }
+
+ /**
+ * Sets the videoProviders.
+ * @param videoProviders the videoProviders to set
+ */
+ public void setVideoProviders(Map<String, ExternalVideoProvider> videoProviders)
+ {
+ this.videoProviders = videoProviders;
+ }
+
+ /**
+ * Adds a video support handler.
+ * @param videoSupportHandler ExternalVideoSupport implementation
+ */
+ public void addVideoProvider(String name, ExternalVideoProvider videoProvider)
+ {
+ videoProviders.put(name, videoProvider);
+ }
+
+ public ExternalVideoProvider getVideoProvider(Content media)
+ {
+ return videoProviders.get(NodeDataUtil.getString(media, ND_PROVIDER));
+ }
+
+ @Override
+ public void saveFromZipFile(Content media, File f, String cleanFileName, String extension)
+ throws AccessDeniedException, RepositoryException
+ {
+ NodeDataUtil.getOrCreateAndSet(media, "provider", "weebo");
+ ExternalVideoUtil.setStatus(media.getUUID(), AsyncUploadExternalVideoProvider.STATUS_TO_UPLOAD);
+ super.saveFromZipFile(media, f, cleanFileName, extension);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getUrl(Content media, Map<String, String> options)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider == null)
+ {
+ return null;
+ }
+ return provider.getUrl(media, options);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getNewNodeName(MultipartForm form, HttpServletRequest request)
+ {
+ return videoProviders.get(request.getParameter(ND_PROVIDER)).getNewNodeName(form, request);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getUrl(Content media)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider == null)
+ {
+ return null;
+ }
+ return provider.getUrl(media, null);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onPostSave(Content media)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider != null)
+ {
+ provider.processVideo(media);
+ }
+
+ return super.onPostSave(media);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getFilename(Content media)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider != null)
+ {
+ return provider.getFilename(media);
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getThumbnailUrl(Content media)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider == null)
+ {
+ return null;
+ }
+ return provider.getThumbnailUrl(media);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getPreviewUrl(Content media)
+ {
+ ExternalVideoProvider provider = getVideoProvider(media);
+ if (provider == null)
+ {
+ return null;
+ }
+ return provider.getPreviewUrl(media);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void stop()
+ {
+ Map<String, ExternalVideoProvider> providers = this.getVideoProviders();
+ if (providers != null)
+ {
+ for (ExternalVideoProvider provider : providers.values())
+ {
+ provider.stop();
+ }
+ }
+ super.stop();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getReplacementThumbnail()
+ {
+ return "/.resources/media/icons/thumb-video.png";
+ }
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoUtil.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoUtil.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/ExternalVideoUtil.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,244 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import info.magnolia.cms.beans.runtime.Document;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.util.ContentUtil;
+import info.magnolia.cms.util.NodeDataUtil;
+import info.magnolia.context.MgnlContext;
+import info.magnolia.module.admininterface.SaveHandlerImpl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
+
+import net.sourceforge.openutils.mgnlmedia.media.lifecycle.MediaModule;
+import net.sourceforge.openutils.mgnlmedia.media.types.impl.MediaWithPreviewImageTypeHandler;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class ExternalVideoUtil
+{
+
+ public static final String ND_STATUS = "status";
+
+ public static final String ND_STATUS_CHANGE = "statusLastModified";
+
+ public static final String ND_ERROR = "error";
+
+ public static final String ND_ERROR_MESSAGE = "errorMessage";
+
+ public static final String ND_PROGRESS = "uploadProgress";
+
+ public static Logger log = LoggerFactory.getLogger(ExternalVideoUtil.class);
+
+ public static boolean setProperty(final String mediaUUID, final String property, final Object value)
+ {
+ try
+ {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, RepositoryException>()
+ {
+
+ public Boolean exec() throws RepositoryException
+ {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ if (media != null)
+ {
+ NodeDataUtil.getOrCreateAndSet(media, property, value);
+ media.save();
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+ catch (RepositoryException e)
+ {
+ return false;
+ }
+ }
+
+ public static boolean removeProperty(final String mediaUUID, final String property)
+ {
+ try
+ {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, RepositoryException>()
+ {
+
+ public Boolean exec() throws RepositoryException
+ {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ if (media != null)
+ {
+ media.deleteNodeData(property);
+ media.save();
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+ catch (RepositoryException e)
+ {
+ return false;
+ }
+ }
+
+ public static String getStatusProperty( String statusSuffix ) {
+ return StringUtils.join(new String[]{ND_STATUS, statusSuffix != null ? "-" : null , statusSuffix});
+ }
+
+ public static String getErrorProperty(String suffix) {
+ return StringUtils.join(new String[]{ND_ERROR, suffix != null ? "-" : null , suffix});
+ }
+
+ public static String getStatus( final Content mediaNode, String statusSuffix ) {
+ return NodeDataUtil.getString(mediaNode, getStatusProperty( statusSuffix ) );
+ }
+
+ public static boolean setStatus(final String mediaUUID, final String statusSuffix, final String status) {
+ try {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, RepositoryException>() {
+ public Boolean exec() throws RepositoryException {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ if (media != null) {
+ String statusProperty = getStatusProperty( statusSuffix );
+ if ( ! media.hasNodeData(statusProperty)
+ || !StringUtils.equals(NodeDataUtil.getString(media, statusProperty), status)) {
+ NodeDataUtil.getOrCreateAndSet(media, statusProperty, status);
+ NodeDataUtil.getOrCreateAndSet(media, statusProperty + "LastModified", Calendar.getInstance());
+ media.save();
+ }
+ return true;
+ }
+ return false;
+ }
+ });
+ } catch (RepositoryException e) {
+ return false;
+ }
+ }
+
+ public static boolean hasStatus(final Content mediaNode, final String statusSuffix, final String status) {
+ String statusProperty = getStatusProperty( statusSuffix );
+ return StringUtils.equals( NodeDataUtil.getString( mediaNode, statusProperty ), status );
+ }
+
+ public static boolean hasStatus(final String mediaUUID, final String statusSuffix, final String status) {
+ try {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, RepositoryException>() {
+ public Boolean exec() throws RepositoryException {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ return media != null && hasStatus( media, statusSuffix, status );
+ }
+ });
+ } catch (RepositoryException e) {
+ return false;
+ }
+ }
+
+ public static boolean setStatus(final String mediaUUID, final String status) {
+ return setStatus(mediaUUID, null, status);
+ }
+
+
+ public static boolean setError(final String mediaUUID, final String suffix, final String message) {
+ try {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, RepositoryException>() {
+ public Boolean exec() throws RepositoryException {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ if (media != null) {
+ NodeDataUtil.getOrCreateAndSet(media, getErrorProperty(suffix), true);
+ NodeDataUtil.getOrCreateAndSet(media, getErrorProperty(suffix) + "-" + ND_ERROR_MESSAGE, message);
+ media.save();
+ return true;
+ }
+ return false;
+ }
+ });
+ } catch (RepositoryException e) {
+ return false;
+ }
+ }
+
+ public static boolean copyPreviewImageToRepository(Content media, final String previewUrl) throws IOException {
+ if ( StringUtils.isNotBlank(previewUrl) ) {
+ InputStream is = null;
+ URL url = new URL(previewUrl);
+ HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+ httpConn.setConnectTimeout(5000);
+ if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
+ is = httpConn.getInputStream();
+ File file = File.createTempFile("external-video", "preview");
+ FileOutputStream fout = null;
+ try
+ {
+ fout = new FileOutputStream(file);
+ IOUtils.copy(is, fout);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(fout);
+ }
+ String contentType = httpConn.getContentType();
+ Document doc = new Document(file, contentType);
+ try
+ {
+ SaveHandlerImpl.saveDocument(
+ media,
+ doc,
+ MediaWithPreviewImageTypeHandler.PREVIEW_NODEDATA_NAME,
+ "preview",
+ null);
+ media.save();
+ return true;
+ }
+ catch (RepositoryException e)
+ {
+ log.error(e.getMessage(), e);
+ }
+ finally
+ {
+ doc.delete();
+ }
+ }
+ else
+ {
+ log.warn("Problem establishing connection with {}: {}", url, httpConn.getResponseCode());
+ }
+ }
+ return false;
+ }
+
+ public static boolean copyPreviewImageToRepository(final String mediaUUID, final String previewUrl)
+ throws IOException
+ {
+ return MgnlContext.doInSystemContext(new MgnlContext.Op<Boolean, IOException>()
+ {
+
+ public Boolean exec() throws IOException
+ {
+ Content media = ContentUtil.getContentByUUID(MediaModule.REPO, mediaUUID);
+ if (media != null)
+ {
+ return copyPreviewImageToRepository(media, previewUrl);
+ }
+ return false;
+ }
+ });
+
+ }
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAccount.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAccount.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAccount.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,90 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class FtpAccount
+{
+
+ private String username;
+
+ private String password;
+
+ private String url;
+
+ private boolean passive;
+
+ /**
+ * Returns the username.
+ * @return the username
+ */
+ public String getUsername()
+ {
+ return username;
+ }
+
+ /**
+ * Sets the username.
+ * @param username the username to set
+ */
+ public void setUsername(String username)
+ {
+ this.username = username;
+ }
+
+ /**
+ * Returns the password.
+ * @return the password
+ */
+ public String getPassword()
+ {
+ return password;
+ }
+
+ /**
+ * Sets the password.
+ * @param password the password to set
+ */
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ /**
+ * Returns the url.
+ * @return the url
+ */
+ public String getUrl()
+ {
+ return url;
+ }
+
+ /**
+ * Sets the url.
+ * @param url the url to set
+ */
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+
+ /**
+ * Returns the passive.
+ * @return the passive
+ */
+ public boolean isPassive()
+ {
+ return passive;
+ }
+
+ /**
+ * Sets the passive.
+ * @param passive the passive to set
+ */
+ public void setPassive(boolean passive)
+ {
+ this.passive = passive;
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAsyncUploadExternalVideoProvider.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAsyncUploadExternalVideoProvider.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpAsyncUploadExternalVideoProvider.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,69 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import java.io.IOException;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.lang.math.NumberUtils;
+
+import info.magnolia.cms.beans.runtime.FileProperties;
+import info.magnolia.cms.core.Content;
+import info.magnolia.cms.core.NodeData;
+import info.magnolia.context.MgnlContext;
+import net.sourceforge.openutils.mgnlmedia.media.lifecycle.MediaModule;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public abstract class FtpAsyncUploadExternalVideoProvider extends AsyncUploadExternalVideoProvider
+{
+
+ private FtpAccount account = new FtpAccount();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void uploadVideo(final String mediaUUID) throws IOException, RepositoryException
+ {
+ Content media = MgnlContext
+ .getSystemContext()
+ .getHierarchyManager(MediaModule.REPO)
+ .getContentByUUID(mediaUUID);
+ NodeData file = media.getNodeData(BaseVideoTypeHandler.ORGINAL_NODEDATA_NAME);
+ long size = NumberUtils.toLong(file.getAttribute(FileProperties.PROPERTY_SIZE), -1);
+ FtpUtil.upload(account, media.getNodeData(BaseVideoTypeHandler.ORGINAL_NODEDATA_NAME).getStream(), size, this
+ .getUploadFileName(media), new FtpUtil.UploadProgress()
+ {
+
+ public void updateProgress(long totalBytesTransferred)
+ {
+ ExternalVideoUtil.setProperty(
+ mediaUUID,
+ AsyncUploadExternalVideoProvider.ND_PROGRESS,
+ totalBytesTransferred);
+ }
+ });
+ }
+
+ /**
+ * Returns the account.
+ * @return the account
+ */
+ public FtpAccount getAccount()
+ {
+ return account;
+ }
+
+ /**
+ * Sets the account.
+ * @param account the account to set
+ */
+ public void setAccount(FtpAccount account)
+ {
+ this.account = account;
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpUtil.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpUtil.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/FtpUtil.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,106 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public class FtpUtil
+{
+
+ /**
+ * Logger.
+ */
+ private static Logger log = LoggerFactory.getLogger(FtpUtil.class);
+
+ public static void upload(FtpAccount account, InputStream inputStream, long size, final String fileName,
+ final UploadProgress progress) throws IOException
+ {
+ FTPClient f = new FTPClient();
+ log.debug("Connection to {}", account.getUrl());
+ f.connect(account.getUrl());
+ log.debug("Login with {}", account.getUsername());
+ if (f.login(account.getUsername(), account.getPassword()))
+ {
+
+ String paths[] = StringUtils.split(fileName, "/");
+ String path = "/";
+ for (int i = 0; i < paths.length - 1; i++)
+ {
+ path += paths[i] + "/";
+ if (f.listNames(path) == null)
+ {
+ log.debug("Creating folder {}", path);
+ f.mkd(path);
+ }
+ }
+ if (!"/".equals(path))
+ {
+ log.debug("Moving to folder {}", path);
+ f.cwd(path);
+ }
+
+ String relativeFileName = paths[paths.length - 1];
+
+ if (account.isPassive())
+ {
+ log.debug("Entering passive mode");
+ f.enterLocalPassiveMode();
+ }
+
+ log.debug("Storing file {} in {}", new Object[]{relativeFileName, path });
+ f.setFileType(FTP.BINARY_FILE_TYPE);
+ if (progress != null && size > 0)
+ {
+ OutputStream os = f.storeFileStream(relativeFileName);
+ org.apache.commons.net.io.Util.copyStream(
+ inputStream,
+ os,
+ f.getBufferSize(),
+ size,
+ new org.apache.commons.net.io.CopyStreamAdapter()
+ {
+
+ @Override
+ public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize)
+ {
+ log.debug("File {} upload: {} / {}", new Object[]{
+ fileName,
+ totalBytesTransferred,
+ streamSize });
+ progress.updateProgress((int) (100 * totalBytesTransferred / streamSize));
+ }
+ });
+ os.flush();
+ IOUtils.closeQuietly(os);
+ IOUtils.closeQuietly(inputStream);
+
+ f.completePendingCommand();
+ }
+ else
+ {
+ f.storeFile(relativeFileName, inputStream);
+ }
+ log.debug("Done, disconnecting");
+ }
+ f.disconnect();
+ }
+
+ public interface UploadProgress
+ {
+
+ void updateProgress(long totalBytesTransferred);
+ }
+
+}
Added: magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/TrascodingExternalVideoProvider.java
===================================================================
--- magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/TrascodingExternalVideoProvider.java (rev 0)
+++ magnoliamodules/branches/magnolia44/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/externalvideo/TrascodingExternalVideoProvider.java 2013-09-26 14:20:25 UTC (rev 4344)
@@ -0,0 +1,21 @@
+package net.sourceforge.openutils.mgnlmedia.externalvideo;
+
+/**
+ * @author molaschi
+ * @version $Id: $
+ */
+public interface TrascodingExternalVideoProvider extends ExternalVideoProvider
+{
+
+ public final static String STATUS_TO_TRASCODE = "to_trascode";
+
+ public final static String STATUS_TRASCODING = "trascoding";
+
+ public final static String STATUS_TRASCODED = "trascoded";
+
+ void startTrascoding(String mediaUUID);
+
+ void updateTrascodingProgress(String mediaUUID, double progress);
+
+ void trascoded(String mediaUUID);
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|