From 9ba889f703212544deea18f0589a1ad40263a8ff Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Tue, 19 May 2020 13:17:14 +0200 Subject: [PATCH] OO-4698: create metadata by import of videos, upgrader to generate them --- .../org/olat/core/util/vfs/VFSManager.java | 8 +- .../org/olat/modules/video/VideoManager.java | 5 +- .../video/manager/VideoManagerImpl.java | 23 ++- .../repository/handlers/VideoHandler.java | 4 +- .../org/olat/upgrade/OLATUpgrade_14_2_10.java | 144 ++++++++++++++++++ .../olat/upgrade/_spring/upgradeContext.xml | 1 + 6 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java diff --git a/src/main/java/org/olat/core/util/vfs/VFSManager.java b/src/main/java/org/olat/core/util/vfs/VFSManager.java index 2cb16985534..987026ccb00 100644 --- a/src/main/java/org/olat/core/util/vfs/VFSManager.java +++ b/src/main/java/org/olat/core/util/vfs/VFSManager.java @@ -729,8 +729,12 @@ public class VFSManager { successful = false; } - if(withMetadata && source.canMeta() == VFSConstants.YES && target.canMeta() == VFSConstants.YES) { - CoreSpringFactory.getImpl(VFSRepositoryService.class).copyTo(source, target, target.getParentContainer()); + if(withMetadata) { + if(source.canMeta() == VFSConstants.YES && target.canMeta() == VFSConstants.YES) { + CoreSpringFactory.getImpl(VFSRepositoryService.class).copyTo(source, target, target.getParentContainer()); + } else if(target.canMeta() == VFSConstants.YES) { + CoreSpringFactory.getImpl(VFSRepositoryService.class).getMetadataFor(target); + } } } else { // source or target is null diff --git a/src/main/java/org/olat/modules/video/VideoManager.java b/src/main/java/org/olat/modules/video/VideoManager.java index 40278a8eab4..38fdc162308 100644 --- a/src/main/java/org/olat/modules/video/VideoManager.java +++ b/src/main/java/org/olat/modules/video/VideoManager.java @@ -26,6 +26,7 @@ import java.util.Map; import org.olat.core.commons.services.image.Size; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSLeaf; import org.olat.fileresource.types.ResourceEvaluation; @@ -249,7 +250,7 @@ public interface VideoManager { * The repository entry that represents the video in the repository * @param masterVideo The video file to be added to the repository. Must be an mp4 file. */ - public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo); + public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo, Identity initialAuthor); /** * Import the given export archive to the resource on disk @@ -260,7 +261,7 @@ public interface VideoManager { * The archive to be added to the repository. The archive must be * created by the video export feature. */ - public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive); + public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive, Identity initialAuthor); /** * Update video transcoding 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 8014041b254..ef6368e36bc 100644 --- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java +++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java @@ -56,8 +56,11 @@ import org.olat.core.commons.persistence.DB; import org.olat.core.commons.services.image.Crop; import org.olat.core.commons.services.image.ImageService; import org.olat.core.commons.services.image.Size; +import org.olat.core.commons.services.vfs.VFSMetadata; +import org.olat.core.commons.services.vfs.VFSRepositoryService; import org.olat.core.commons.services.video.MovieService; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.Formatter; @@ -152,6 +155,8 @@ public class VideoManagerImpl implements VideoManager { @Autowired private VideoMetadataDAO videoMetadataDao; @Autowired + private VFSRepositoryService vfsRepositoryService; + @Autowired private Scheduler scheduler; @Autowired private ImageService imageHelper; @@ -665,13 +670,13 @@ public class VideoManagerImpl implements VideoManager { } @Override - public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo) { + public VideoMeta importFromMasterFile(RepositoryEntry repoEntry, VFSLeaf masterVideo, Identity initialAuthor) { OLATResource videoResource = repoEntry.getOlatResource(); // 1) copy master video to final destination with standard name VFSContainer masterContainer = getMasterContainer(videoResource); VFSLeaf targetFile = VFSManager.resolveOrCreateLeafFromPath(masterContainer, FILENAME_VIDEO_MP4); - VFSManager.copyContent(masterVideo, targetFile, false); + VFSManager.copyContent(masterVideo, targetFile, true); masterVideo.delete(); // calculate video duration @@ -694,12 +699,18 @@ public class VideoManagerImpl implements VideoManager { createVideoMetadata(repoEntry, targetFile.getSize(), targetFile.getName()); dbInstance.commit(); meta = updateVideoMetadata(videoResource, targetFile); + + VFSMetadata vfsMetadata = targetFile.getMetaInfo(); + if(vfsMetadata != null) { + vfsMetadata.setAuthor(initialAuthor); + vfsRepositoryService.updateMetadata(vfsMetadata); + } } return meta; } @Override - public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive) { + public VideoMeta importFromExportArchive(RepositoryEntry repoEntry, VFSLeaf exportArchive, Identity initialAuthor) { OLATResource videoResource = repoEntry.getOlatResource(); // 1) unzip archive VFSContainer baseContainer= FileResourceManager.getInstance().getFileResourceRootImpl(videoResource); @@ -746,6 +757,12 @@ public class VideoManagerImpl implements VideoManager { if(meta != null && meta.getWidth() == 800 && meta.getHeight() == 600) { meta = updateVideoMetadata(videoResource, videoFile); } + + VFSMetadata vfsMetadata = videoFile.getMetaInfo(); + if(vfsMetadata != null) { + vfsMetadata.setAuthor(initialAuthor); + vfsRepositoryService.updateMetadata(vfsMetadata); + } } return meta; } diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java index 4ac2dafc982..a9367906f24 100644 --- a/src/main/java/org/olat/repository/handlers/VideoHandler.java +++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java @@ -172,10 +172,10 @@ public class VideoHandler extends FileHandler { VideoMeta videoMeta = null; if (fileName.endsWith(".mp4") || fileName.endsWith(".mov") || fileName.endsWith(".m4v")) { // 2a) import video from raw mp4 master video file - videoMeta = videoManager.importFromMasterFile(repoEntry, importFile); + videoMeta = videoManager.importFromMasterFile(repoEntry, importFile, initialAuthor); } else if (fileName.endsWith(".zip")) { // 2b) import video from archive from another OpenOLAT instance - videoMeta = videoManager.importFromExportArchive(repoEntry, importFile); + videoMeta = videoManager.importFromExportArchive(repoEntry, importFile, initialAuthor); } dbInstance.commit(); diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java b/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java new file mode 100644 index 00000000000..faf7c023ee1 --- /dev/null +++ b/src/main/java/org/olat/upgrade/OLATUpgrade_14_2_10.java @@ -0,0 +1,144 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.upgrade; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.apache.logging.log4j.Logger; +import org.olat.basesecurity.manager.IdentityDAO; +import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.vfs.VFSMetadata; +import org.olat.core.commons.services.vfs.manager.VFSRepositoryServiceImpl; +import org.olat.core.id.Identity; +import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.fileresource.FileResourceManager; +import org.olat.fileresource.types.VideoFileResource; +import org.olat.modules.video.VideoManager; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.olat.resource.OLATResource; +import org.olat.resource.OLATResourceManager; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 19 mai 2020<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class OLATUpgrade_14_2_10 extends OLATUpgrade { + + private static final Logger log = Tracing.createLoggerFor(OLATUpgrade_14_2_10.class); + + private static final String VERSION = "OLAT_14.2.10"; + private static final String VIDEO_VFS_METADATA = "VIDEO VFS METADATA"; + + @Autowired + private DB dbInstance; + @Autowired + private IdentityDAO identityDao; + @Autowired + private VideoManager videoManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private VFSRepositoryServiceImpl vfsRepositoryService; + + public OLATUpgrade_14_2_10() { + super(); + } + + @Override + public String getVersion() { + return VERSION; + } + + @Override + public boolean doPostSystemInitUpgrade(UpgradeManager upgradeManager) { + UpgradeHistoryData uhd = upgradeManager.getUpgradesHistory(VERSION); + if (uhd == null) { + // has never been called, initialize + uhd = new UpgradeHistoryData(); + } else if (uhd.isInstallationComplete()) { + return false; + } + + boolean allOk = true; + allOk &= createVideoVfsMetadata(upgradeManager, uhd); + + uhd.setInstallationComplete(allOk); + upgradeManager.setUpgradesHistory(uhd, VERSION); + if(allOk) { + log.info(Tracing.M_AUDIT, "Finished OLATUpgrade_14_2_10 successfully!"); + } else { + log.info(Tracing.M_AUDIT, "OLATUpgrade_14_2_10 not finished, try to restart OpenOlat!"); + } + return allOk; + } + + private boolean createVideoVfsMetadata(UpgradeManager upgradeManager, UpgradeHistoryData uhd) { + boolean allOk = true; + if (!uhd.getBooleanDataValue(VIDEO_VFS_METADATA)) { + + List<String> videoTypes = Arrays.asList(VideoFileResource.TYPE_NAME); + List<OLATResource> videos = OLATResourceManager.getInstance().findResourceByTypes(videoTypes); + log.info("Number of video to upgrade: {}", videos.size()); + for (OLATResource ores : videos) { + createVideoVfsMetadata(ores); + dbInstance.commitAndCloseSession(); + } + + uhd.setBooleanDataValue(VIDEO_VFS_METADATA, allOk); + upgradeManager.setUpgradesHistory(uhd, VERSION); + } + return allOk; + } + + private void createVideoVfsMetadata(OLATResource ores) { + try { + File resourceDir = FileResourceManager.getInstance().getFileResourceRoot(ores); + vfsRepositoryService.migrateDirectories(resourceDir); + + VFSLeaf masterFile = videoManager.getMasterVideoFile(ores); + if(masterFile == null) { + return; + } + + VFSMetadata vfsMetadata = masterFile.getMetaInfo(); + if(vfsMetadata != null && vfsMetadata.getAuthor() == null) { + RepositoryEntry entry = repositoryManager.lookupRepositoryEntry(ores, false); + if(entry != null && StringHelper.containsNonWhitespace(entry.getInitialAuthor())) { + Identity author = identityDao.findIdentityByName(entry.getInitialAuthor()); + if(author != null) { + vfsMetadata.setAuthor(author); + vfsRepositoryService.updateMetadata(vfsMetadata); + } + } + } + } catch (IOException e) { + log.error("", e); + } + } +} diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml index daca3a1c382..078ae91edc9 100644 --- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml +++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml @@ -56,6 +56,7 @@ <bean id="upgrade_14_2_0" class="org.olat.upgrade.OLATUpgrade_14_2_0"/> <bean id="upgrade_14_2_6" class="org.olat.upgrade.OLATUpgrade_14_2_6"/> <bean id="upgrade_14_2_7" class="org.olat.upgrade.OLATUpgrade_14_2_7"/> + <bean id="upgrade_14_2_10" class="org.olat.upgrade.OLATUpgrade_14_2_10"/> </list> </property> </bean> -- GitLab