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