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 a19f47d8fea7c994d512c8354f7d0f27a61577e7..918b0d94fd1a519e2a24ec3ace2dd01971fab86d 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 1b1c6481f58b5833ac9ce6d5b370529f4c2216ff..8d51498daa862d9f6b118312f6777ea398f7190c 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 0000000000000000000000000000000000000000..15740f4b6dc7e6d6afdbe8c4c6dea8f3084d6740 --- /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 3983288c4c7e968d70ab6deb996f9af764ddcc6d..fcefed9019b4c39f6e8511af5b343be5c2228301 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 84bf50fed3d17d1f55713a2f3f9996909ff97769..16bfed07885b4fbe33606488e9efb700a8deecfa 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 d6465e105fd0a6d17bab9b11bdea365a2da67779..e887c2275a0f2f1deaf7d38f4ef12bbe4c536564 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 814c34f664adc4a74be90d0e7a58ce1c7c1fd184..9721bfb2ca160f81c1551bbaac7541d5755d6f12 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