From 626bc4f6e99eea3ce1a8add697eda302ceac260b Mon Sep 17 00:00:00 2001
From: fkiefer <none@none>
Date: Wed, 16 Nov 2016 16:17:26 +0100
Subject: [PATCH] OO-2361 disable transcoding on base of VideoModule Setting,
 only lesser resolution, update Metadata XML on resource change

---
 .../org/olat/modules/video/VideoManager.java  |  8 +++++++
 .../video/manager/VideoManagerImpl.java       | 21 +++++++++++++++++++
 .../olat/modules/video/ui/TranscodingRow.java |  4 ++--
 .../ui/VideoAdminTranscodingController.java   | 15 ++++++++++++-
 .../ui/VideoQualityTableFormController.java   | 20 ++++++++++--------
 .../video/ui/VideoResourceEditController.java | 13 +++++++-----
 6 files changed, 64 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/olat/modules/video/VideoManager.java b/src/main/java/org/olat/modules/video/VideoManager.java
index c144865fde4..affe3a378ec 100644
--- a/src/main/java/org/olat/modules/video/VideoManager.java
+++ b/src/main/java/org/olat/modules/video/VideoManager.java
@@ -297,4 +297,12 @@ public interface VideoManager {
 	 * @return the video duration
 	 */
 	public abstract long getVideoDuration(OLATResource videoResource);
+
+	/**
+	 * Gets the meta data from olat resource.
+	 *
+	 * @param OLATResource videoResource the video resource
+	 * @return the metadata from videoResource 
+	 */
+	public abstract VideoMetadata getMetaDataFromOLATResource(OLATResource videoResource);
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
index c73b6b6e3b0..d9e82d0cf57 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
@@ -551,6 +551,27 @@ public class VideoManagerImpl implements VideoManager {
 		
 		return true;
 	}
+	
+	@Override
+	public VideoMetadata getMetaDataFromOLATResource (OLATResource videoResource){
+		VFSContainer masterContainer = getMasterContainer(videoResource);
+		VFSLeaf targetFile = (VFSLeaf) masterContainer.resolve(FILENAME_VIDEO_MP4);
+		
+		// 1) generate Metadata file
+		VideoMetadata metaData = new VideoMetadataImpl();
+		// calculate video size
+		Size videoSize = movieService.getSize(targetFile, FILETYPE_MP4);
+		if (videoSize != null) {
+			metaData.setWidth(videoSize.getWidth());
+			metaData.setHeight(videoSize.getHeight());			
+		} else {
+			metaData.setWidth(800);
+			metaData.setHeight(600);						
+		}
+		// 2) update XML file
+		writeVideoMetadataFile(metaData, videoResource);
+		return metaData;
+	}
 
 	@Override
 	public boolean importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive) {
diff --git a/src/main/java/org/olat/modules/video/ui/TranscodingRow.java b/src/main/java/org/olat/modules/video/ui/TranscodingRow.java
index 1dc8a890911..bd81b47ea37 100644
--- a/src/main/java/org/olat/modules/video/ui/TranscodingRow.java
+++ b/src/main/java/org/olat/modules/video/ui/TranscodingRow.java
@@ -32,13 +32,13 @@ public class TranscodingRow {
 	private int numberTranscodings;
 	private boolean allTranscoded;
 
-	public TranscodingRow(int resolution, int numberTranscodings, int sumVideos) {
+	public TranscodingRow(int resolution, int numberTranscodings, int sumVideos, boolean mayTranscode) {
 		super();
 		this.resolution = resolution;
 		this.numberTranscodings = numberTranscodings;
 		this.sumVideos = sumVideos;
 		this.missingTranscodings = sumVideos - numberTranscodings;
-		this.allTranscoded = numberTranscodings != sumVideos;		
+		this.allTranscoded = numberTranscodings < sumVideos && mayTranscode;		
 	}
 
 	
diff --git a/src/main/java/org/olat/modules/video/ui/VideoAdminTranscodingController.java b/src/main/java/org/olat/modules/video/ui/VideoAdminTranscodingController.java
index 0065d7007c4..780b7421d7c 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoAdminTranscodingController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoAdminTranscodingController.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.modules.video.VideoManager;
 import org.olat.modules.video.VideoMetadata;
+import org.olat.modules.video.VideoModule;
 import org.olat.modules.video.VideoTranscoding;
 import org.olat.modules.video.ui.TranscodingTableModel.TranscodingCols;
 import org.olat.resource.OLATResource;
@@ -68,6 +69,8 @@ public class VideoAdminTranscodingController extends FormBasicController {
 	private OLATResourceManager olatresourceManager;
 	@Autowired 
 	private VideoManager videoManager;
+	@Autowired
+	private VideoModule videoModule;
 
 	public VideoAdminTranscodingController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, "transcoding_admin");
@@ -101,6 +104,16 @@ public class VideoAdminTranscodingController extends FormBasicController {
 		setChecks();
 	}
 	
+	private boolean mayTranscode(int resolution){
+		int[] transcodingRes = videoModule.getTranscodingResolutions();
+		for (int i = 0; i < transcodingRes.length; i++) {
+			if (resolution == transcodingRes[i] && videoModule.isTranscodingEnabled()){
+				return Boolean.TRUE;
+			}
+		}
+		return Boolean.FALSE;
+	}
+	
 	private void loadTable(){
 		//Hardcoded same as VideoAdminSetController
 		int[] resolution = {2160, 1080, 720, 480, 360, 240};
@@ -111,7 +124,7 @@ public class VideoAdminTranscodingController extends FormBasicController {
 				VideoMetadata videoMetadata = videoManager.readVideoMetadataFile(videoResource);
 				if (videoMetadata != null && videoMetadata.getHeight() >= resolution[i]) counter++;
 			}
-			resolutions.add(new TranscodingRow(resolution[i], sizeOfTranscodings, counter));
+			resolutions.add(new TranscodingRow(resolution[i], sizeOfTranscodings, counter, mayTranscode(resolution[i])));
 		}		
 		if (resolutions != null) tableModel.setObjects(resolutions);
 		transcodingTable.reset(true, true, true);	
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 299dd49ac28..e0a95042d37 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoQualityTableFormController.java
@@ -135,15 +135,17 @@ public class VideoQualityTableFormController extends FormBasicController {
 		}
 		List<Integer> missingResolutions = videoManager.getMissingTranscodings(videoResource);
 		if (videoModule.isTranscodingEnabled()) {
-		 	for(Integer missingRes: missingResolutions){
-				String title = videoManager.getDisplayTitleForResolution(missingRes, getTranslator());
-				FormLink transcodeLink = uifactory.addFormLink("res_" + count++, "startTranscoding", "quality.transcode", "quality.transcode", flc, Link.LINK);
-				transcodeLink.setUserObject(missingRes);
-				transcodeLink.setIconLeftCSS("o_icon o_icon_refresh o_icon-fw");
-				
-				FormLink previewMissingLink= uifactory.addFormLink("res_" + count++, "viewQuality", title, title, flc, Link.LINK + Link.NONTRANSLATED);
-				previewMissingLink.setEnabled(false);
-				rows.add(new QualityTableRow(previewMissingLink, missingRes.toString(),  "-", "mp4", transcodeLink));
+		 	for(Integer missingRes : missingResolutions){
+				if (missingRes <= videoMetadata.getHeight()) {
+					String title = videoManager.getDisplayTitleForResolution(missingRes, getTranslator());
+					FormLink transcodeLink = uifactory.addFormLink("res_" + count++, "startTranscoding", "quality.transcode", "quality.transcode", flc, Link.LINK);
+					transcodeLink.setUserObject(missingRes);
+					transcodeLink.setIconLeftCSS("o_icon o_icon_refresh o_icon-fw");
+					
+					FormLink previewMissingLink= uifactory.addFormLink("res_" + count++, "viewQuality", title, title, flc, Link.LINK + Link.NONTRANSLATED);
+					previewMissingLink.setEnabled(false);
+					rows.add(new QualityTableRow(previewMissingLink, missingRes.toString(),  "-", "mp4", transcodeLink));
+				}
 			}
 		}
 	 	rows.sort(new VideoComparator());
diff --git a/src/main/java/org/olat/modules/video/ui/VideoResourceEditController.java b/src/main/java/org/olat/modules/video/ui/VideoResourceEditController.java
index 1d4edda4201..40c6284bd44 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoResourceEditController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoResourceEditController.java
@@ -116,7 +116,7 @@ public class VideoResourceEditController extends FormBasicController {
 			VFSLeaf uploadVideo = vfsContainer.createChildLeaf(VIDEO_RESOURCE);
 			VFSManager.copyContent(uploadFile, uploadVideo);
 			// update video duration
-			long duration = movieService.getDuration(uploadVideo, "mp4");
+			long duration = movieService.getDuration(uploadVideo, VideoTranscoding.FORMAT_MP4);
 			if (duration != -1) {
 				entry.setExpenditureOfWork(Formatter.formatTimecode(duration));
 			}
@@ -132,12 +132,15 @@ public class VideoResourceEditController extends FormBasicController {
 	
 	private void queueCreateTranscoding() {
 		List<Integer> missingResolutions = videoManager.getMissingTranscodings(videoResource);
-		VideoMetadata videoMetadata = videoManager.readVideoMetadataFile(videoResource);
-
+		VideoMetadata videoMetadata = videoManager.getMetaDataFromOLATResource(videoResource);
+		int height = videoMetadata.getHeight();
 		if (videoModule.isTranscodingEnabled()) {
+			// 1) setup transcoding job for original file size
+			videoManager.createTranscoding(videoResource, height, VideoTranscoding.FORMAT_MP4);
+			// 2) setup transcoding jobs for all configured sizes below the original size
 			for (Integer missingRes : missingResolutions) {
-				if(videoMetadata.getHeight() >= missingRes){
-					videoManager.createTranscoding(videoResource, missingRes, "mp4");					
+				if(height > missingRes){
+					videoManager.createTranscoding(videoResource, missingRes, VideoTranscoding.FORMAT_MP4);					
 				}
 			}
 		}
-- 
GitLab