From 363f9b40b57516dff3278379a9a5ac0729add99f Mon Sep 17 00:00:00 2001
From: dfurrer <none@none>
Date: Thu, 24 Mar 2016 16:44:07 +0100
Subject: [PATCH] OO-725: update

---
 .../modules/video/managers/VideoManager.java  |  5 +-
 .../video/managers/VideoManagerImpl.java      | 66 ++++++++++++-------
 .../video/models/VideoQualityVersion.java     | 59 +++++++++++++++++
 .../video/service/TranscoderService.java      | 12 +++-
 .../ui/VideoQualityTableFormController.java   |  8 +++
 .../repository/handlers/VideoHandler.java     |  2 -
 .../resources/serviceconfig/olat.properties   |  4 +-
 7 files changed, 126 insertions(+), 30 deletions(-)
 create mode 100644 src/main/java/org/olat/modules/video/models/VideoQualityVersion.java

diff --git a/src/main/java/org/olat/modules/video/managers/VideoManager.java b/src/main/java/org/olat/modules/video/managers/VideoManager.java
index a19f47d8fea..918b0d94fd1 100644
--- a/src/main/java/org/olat/modules/video/managers/VideoManager.java
+++ b/src/main/java/org/olat/modules/video/managers/VideoManager.java
@@ -22,10 +22,12 @@ package org.olat.modules.video.managers;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 
 import org.olat.core.commons.services.image.Size;
 import org.olat.core.manager.BasicManager;
 import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.modules.video.models.VideoQualityVersion;
 import org.olat.resource.OLATResource;
 
 /**
@@ -76,5 +78,6 @@ public abstract class VideoManager extends BasicManager {
 	public abstract String getDescription(OLATResource video);
 
 	public abstract boolean optimizeVideoRessource(OLATResource video);
-
+	
+	public abstract List<VideoQualityVersion> getQualityVersions(OLATResource video);
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/managers/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/managers/VideoManagerImpl.java
index 1b1c6481f58..8d51498daa8 100644
--- a/src/main/java/org/olat/modules/video/managers/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/managers/VideoManagerImpl.java
@@ -8,10 +8,12 @@ import java.io.RandomAccessFile;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map.Entry;
 
 import javax.imageio.ImageIO;
 
+import org.apache.commons.io.FileUtils;
 import org.jcodec.api.FrameGrab;
 import org.jcodec.common.FileChannelWrapper;
 import org.olat.core.commons.services.image.Size;
@@ -21,6 +23,7 @@ import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.modules.video.models.VideoMetadata;
+import org.olat.modules.video.models.VideoQualityVersion;
 import org.olat.resource.OLATResource;
 import org.springframework.stereotype.Service;
 
@@ -162,7 +165,7 @@ public class VideoManagerImpl extends VideoManager {
 		}catch(	Exception e){
 			return false;
 		}
-		//TODO: throw right exception
+		//TODO: throw correct exception
 	}
 
 	@Override
@@ -213,15 +216,23 @@ public class VideoManagerImpl extends VideoManager {
 		File file = getVideoFile(video);
 		File videoResourceFileroot = fileResourceManager.getFileResourceRoot(video);
 		File optimizedFolder = new File(videoResourceFileroot, "optimizedVideoData");
+		File metaDataFile = new File(optimizedFolder,"optimizedVideo_metadata.xml");
 		optimizedFolder.mkdirs();
 
 		ArrayList<String> cmd = new ArrayList<String>();
 
+		//create Metadata
+		List<VideoQualityVersion> versions = getQualityVersions(video);
+		versions.add(new VideoQualityVersion("normal", FileUtils.byteCountToDisplaySize(file.length()), getVideoSize(video), "mp4"));
+		XStreamHelper.writeObject(XStreamHelper.createXStreamInstance(), metaDataFile, versions);
+		
+		//start transcoding with handbrake
 		cmd.add("HandBrakeCLI");
-		cmd.add("-i "+file.getAbsolutePath());
-		cmd.add("-o "+optimizedFolder.getAbsolutePath()+"/optimized_"+file.getName());
+		cmd.add("-i"+file.getAbsolutePath());
+		cmd.add("-o"+optimizedFolder.getAbsolutePath()+"/optimized_"+file.getName());
 		cmd.add("--optimize");
-		cmd.add("--preset Normal");
+		cmd.add("--preset");
+		cmd.add("Normal");
 
 		ProcessBuilder pb = new ProcessBuilder(cmd);
 		pb.directory(optimizedFolder);
@@ -230,27 +241,36 @@ public class VideoManagerImpl extends VideoManager {
 		pb.inheritIO();
 
 
-		 try {
-				logInfo("+--------------------------HANDBRAKE STARTS TRANSCODING------------------------------------+");
-	            Runtime.getRuntime().exec("HandBrakeCLI "+" -i "+file.getAbsolutePath()+" -o "+optimizedFolder.getAbsolutePath()+"/optimized_"+file.getName()+" --optimize"+" --preset Normal");
-				logInfo("+---------------------------HANDBRAKE TRANSCODING DONE-------------------------------------+");
-				return true;
-		 } catch (Exception e) {
-	            System.err.println("Unable to do videotranscoding");
-				return false;
-	     }
-
 		 
-//		try {
-//			logInfo("+--------------------------HANDBRAKE STARTS TRANSCODING------------------------------------+");
-//			Process process = pb.start();
-//			process.waitFor();
-//			logInfo("+---------------------------HANDBRAKE TRANSCODING DONE-------------------------------------+");
-//			return true;
-//		} catch (Exception e) {
-//			return false;
-//		}
+		try {
+			logInfo("+--------------------------HANDBRAKE STARTS TRANSCODING------------------------------------+");
+			Process process = pb.start();
+			return true;
+		} catch (Exception e) {
+			return false;
+		}
 
 	}
+	
+	@Override
+	public List<VideoQualityVersion> getQualityVersions(OLATResource video){
+		File videoResourceFileroot = fileResourceManager.getFileResourceRoot(video);
+		File optimizedFolder = new File(videoResourceFileroot, "optimizedVideoData");
+		File metaDataFile = new File(optimizedFolder,"optimizedVideo_metadata.xml");
+		List<VideoQualityVersion> versions;
+		
+		if(!metaDataFile.exists()){
+			try {
+				metaDataFile.createNewFile();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			versions = new ArrayList<VideoQualityVersion>();
+		}else{
+			Object fileContent = XStreamHelper.readObject(XStreamHelper.createXStreamInstance(), metaDataFile);
+			versions = (List<VideoQualityVersion>) fileContent;
+		}
+		return versions;
+	}
 
 }
diff --git a/src/main/java/org/olat/modules/video/models/VideoQualityVersion.java b/src/main/java/org/olat/modules/video/models/VideoQualityVersion.java
new file mode 100644
index 00000000000..15740f4b6dc
--- /dev/null
+++ b/src/main/java/org/olat/modules/video/models/VideoQualityVersion.java
@@ -0,0 +1,59 @@
+package org.olat.modules.video.models;
+
+import org.olat.core.commons.services.image.Size;
+
+public class VideoQualityVersion{
+	// Properties
+	String type;
+	String fileSize;
+	Size dimension;
+	String format;
+	boolean isTransforming;
+	
+	public VideoQualityVersion(String type, String fileSize, Size dimension, String format){
+		this.type = type;
+		this.fileSize = fileSize;
+		this.dimension = dimension;
+		this.format = format;
+	}
+	
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getFileSize() {
+		return fileSize;
+	}
+
+	public void setFileSize(String fileSize) {
+		this.fileSize = fileSize;
+	}
+
+	public Size getDimension() {
+		return dimension;
+	}
+
+	public void setDimension(Size dimension) {
+		this.dimension = dimension;
+	}
+
+	public String getFormat() {
+		return format;
+	}
+
+	public void setFormat(String format) {
+		this.format = format;
+	}
+	
+	public boolean getIsTransforming() {
+		return isTransforming;
+	}
+
+	public void setIsTransforming(boolean isTranscoding) {
+		this.isTransforming = isTranscoding;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/service/TranscoderService.java b/src/main/java/org/olat/modules/video/service/TranscoderService.java
index 3983288c4c7..fcefed9019b 100644
--- a/src/main/java/org/olat/modules/video/service/TranscoderService.java
+++ b/src/main/java/org/olat/modules/video/service/TranscoderService.java
@@ -12,10 +12,10 @@ public class TranscoderService{
 	private static String transcodingProvider;
 
     private static TranscoderService service;
-    private ServiceLoader<Transcoder> loader;
+    private static ServiceLoader<Transcoder> loader;
 
     private TranscoderService() {
-        loader = ServiceLoader.load(Transcoder.class);
+    		loader = ServiceLoader.load(Transcoder.class);
     }
 
     public static synchronized TranscoderService getInstance() {
@@ -24,4 +24,12 @@ public class TranscoderService{
         }
         return service;
     }
+    
+//    public static Transcoder getTrascoder(){
+//    	
+//        for (Transcoder transcoder : loader) {
+//        	return transcoder;
+//        }
+//        
+//    }
 }
diff --git a/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java b/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java
index 84bf50fed3d..16bfed07885 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java
@@ -19,6 +19,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.modules.video.managers.VideoManager;
 import org.olat.modules.video.models.VideoQualityTableModel;
+import org.olat.modules.video.models.VideoQualityVersion;
 import org.olat.modules.video.models.VideoQualityTableModel.QualityTableCols;
 import org.olat.resource.OLATResource;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,7 +62,14 @@ public class VideoQualityTableFormController extends FormBasicController {
 		Size origSize = videoManager.getVideoSize(videoResource);
 
 		FormLink viewButton = uifactory.addFormLink("view", "viewQuality", "quality.view", "qulaity.view", null, Link.LINK);
+		
 		rows.add(new QualityTableRow("original", origSize.getWidth() +"x"+ origSize.getHeight(),  FileUtils.byteCountToDisplaySize(videoManager.getVideoFile(videoResource).length()), "mp4",viewButton));
+		
+		List<VideoQualityVersion> versions = videoManager.getQualityVersions(videoResource);
+		for(VideoQualityVersion version:versions){
+			rows.add(new QualityTableRow(version.getType(), version.getDimension().getWidth() +"x"+ version.getDimension().getHeight(),  version.getFileSize(), version.getFormat(),viewButton));
+		}
+		
 		tableModel.setObjects(rows);
 		tableEl = uifactory.addTableElement(getWindowControl(), "qualities", tableModel, getTranslator(), generalCont);
 		tableEl.setCustomizeColumns(false);
diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java
index d6465e105fd..e887c2275a0 100644
--- a/src/main/java/org/olat/repository/handlers/VideoHandler.java
+++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java
@@ -182,8 +182,6 @@ public class VideoHandler extends FileHandler {
 		return re;
 	}
 
-
-
 	@Override
 	public MediaResource getAsMediaResource(OLATResourceable res, boolean backwardsCompatible) {
 		return FileResourceManager.getInstance().getAsDownloadeableMediaResource(res);
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 814c34f664a..9721bfb2ca1 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -1156,5 +1156,5 @@ monitored.probes=Runtime,System,Database,Memory,OpenOLAT,Release,Environment,Ind
 monitoring.dependency.server=myserver
 
 
-
-
+#
+video.transcoding.provider=handbrake
-- 
GitLab