Skip to content
Snippets Groups Projects
Commit c3fbc879 authored by fkiefer's avatar fkiefer
Browse files

OO-2454 Upgrader 11_3_0 fixes

parent 650f6155
No related branches found
No related tags found
No related merge requests found
......@@ -45,6 +45,14 @@ import org.olat.resource.OLATResource;
*/
public interface VideoManager {
/**
* Checks for video file.
*
* @param videoResource the video resource
* @return true, if successful
*/
public abstract boolean hasVideoFile(OLATResource videoResource);
/**
* get Videofile as File representation
* @param videoResource
......@@ -158,6 +166,22 @@ public interface VideoManager {
* @return the all video transcodings
*/
public abstract List<TranscodingCount> getAllVideoTranscodingsCount();
/**
* Gets the all video transcodings count success.
*
* @param errorcode the errorcode
* @return the all video transcodings count success
*/
public List<TranscodingCount> getAllVideoTranscodingsCountSuccess(int errorcode);
/**
* Gets the all video transcodings count fails.
*
* @param errorcode the errorcode
* @return the all video transcodings count fails
*/
public List<TranscodingCount> getAllVideoTranscodingsCountFails(int errorcode);
/**
* Get a human readable aspect ratio from the given video size. Recognizes
......@@ -274,6 +298,13 @@ public interface VideoManager {
*/
public abstract List<VideoTranscoding> getVideoTranscodingsPendingAndInProgress();
/**
* Gets the failed video transcodings.
*
* @return list of failed VideoTranscoding
*/
public abstract List<VideoTranscoding> getFailedVideoTranscodings();
/**
* Returns a list with
* @param videoResource
......@@ -399,5 +430,29 @@ public interface VideoManager {
* @param video the video
*/
public void startTranscodingProcessIfEnabled(OLATResource video);
/**
* Retranscode failed video transcoding.
*
* @param videoTranscoding
* @return
*/
public VideoTranscoding retranscodeFailedVideoTranscoding(VideoTranscoding videoTranscoding);
/**
* Checks if is metadata file valid.
*
* @param videoResource
* @return true, if is metadata file valid
*/
public boolean isMetadataFileValid(OLATResource videoResource);
/**
* Checks for master container.
*
* @param videoResource
* @return true, if master container can be resolved
*/
boolean hasMasterContainer(OLATResource videoResource);
}
\ No newline at end of file
......@@ -324,10 +324,23 @@ public class VideoManagerImpl implements VideoManager {
// XStreamHelper.writeObject(XStreamHelper.createXStreamInstance(), metaDataFile, metaData);
// }
@Override
public boolean isMetadataFileValid(OLATResource videoResource) {
VFSContainer baseContainer = FileResourceManager.getInstance().getFileResourceRootImpl(videoResource);
VFSLeaf metaDataFile = (VFSLeaf) baseContainer.resolve(FILENAME_VIDEO_METADATA_XML);
try {
VideoMetadata meta = (VideoMetadata) XStreamHelper.readObject(XStreamHelper.createXStreamInstance(), metaDataFile);
return meta != null;
} catch (Exception e) {
log.error("Error while parsing XStream file for videoResource::" + videoResource, e);
return false;
}
}
@Override
public VideoMetadata readVideoMetadataFile(OLATResource videoResource){
VFSContainer baseContainer= FileResourceManager.getInstance().getFileResourceRootImpl(videoResource);
VFSLeaf metaDataFile = VFSManager.resolveOrCreateLeafFromPath(baseContainer, FILENAME_VIDEO_METADATA_XML);
VFSLeaf metaDataFile = (VFSLeaf) baseContainer.resolve(FILENAME_VIDEO_METADATA_XML);
try {
return (VideoMetadata) XStreamHelper.readObject(XStreamHelper.createXStreamInstance(), metaDataFile);
} catch (Exception e) {
......@@ -347,6 +360,11 @@ public class VideoManagerImpl implements VideoManager {
}
}
@Override
public VideoTranscoding retranscodeFailedVideoTranscoding(VideoTranscoding videoTranscoding) {
return videoTranscodingDao.updateTranscodingStatus(videoTranscoding);
}
@Override
public void startTranscodingProcess(OLATResource video) {
List<VideoTranscoding> existingTranscodings = getVideoTranscodings(video);
......@@ -412,6 +430,18 @@ public class VideoManagerImpl implements VideoManager {
return allVideoTranscodings;
}
@Override
public List<TranscodingCount> getAllVideoTranscodingsCountSuccess(int errorcode) {
List<TranscodingCount> allVideoTranscodings = videoTranscodingDao.getAllVideoTranscodingsCountSuccess(errorcode);
return allVideoTranscodings;
}
@Override
public List<TranscodingCount> getAllVideoTranscodingsCountFails(int errorcode) {
List<TranscodingCount> allVideoTranscodings = videoTranscodingDao.getAllVideoTranscodingsCountFails(errorcode);
return allVideoTranscodings;
}
@Override
public List<VideoTranscoding> getOneVideoResolution(int resolution) {
List<VideoTranscoding> oneResolution = videoTranscodingDao.getOneVideoResolution(resolution);
......@@ -489,6 +519,12 @@ public class VideoManagerImpl implements VideoManager {
return title;
}
@Override
public boolean hasMasterContainer (OLATResource videoResource) {
VFSContainer baseContainer = FileResourceManager.getInstance().getFileResourceRootImpl(videoResource);
VFSContainer masterContainer = (VFSContainer) baseContainer.resolve(DIRNAME_MASTER);
return masterContainer != null;
}
@Override
public VFSContainer getMasterContainer(OLATResource videoResource) {
......@@ -691,6 +727,11 @@ public class VideoManagerImpl implements VideoManager {
return videoTranscodingDao.getVideoTranscodingsPendingAndInProgress();
}
@Override
public List<VideoTranscoding> getFailedVideoTranscodings() {
return videoTranscodingDao.getFailedVideoTranscodings();
}
@Override
public void deleteVideoTranscoding(VideoTranscoding videoTranscoding) {
videoTranscodingDao.deleteVideoTranscoding(videoTranscoding);
......@@ -832,4 +873,18 @@ public class VideoManagerImpl implements VideoManager {
return videoMetadataDao.getAllVideoRepoEntries(typename);
}
@Override
public boolean hasVideoFile(OLATResource videoResource) {
try {
if (getVideoFile(videoResource) == null) {
return false;
} else {
return true;
}
} catch (Exception e) {
log.error("",e);
return false;
}
}
}
......@@ -174,7 +174,59 @@ public class VideoTranscodingDAO {
.createQuery(sb.toString(), Object[].class)
.getResultList();
List<TranscodingCount> allTranscodings = new ArrayList<>();
List<TranscodingCount> allTranscodings = new ArrayList<>();
for (Object[] data : rawData) {
Long count = (Long) data[0];
Integer resolution = (Integer) data[1];
allTranscodings.add(new TranscodingCount(count, resolution));
}
return allTranscodings;
}
/**
* Gets the all video transcodings count FAILS.
*
* @return FAILS count
*/
List<TranscodingCount> getAllVideoTranscodingsCountFails(int errorcode) {
StringBuilder sb = new StringBuilder();
//[0] count of a distinct [1] resolution
sb.append("select count(trans.key), trans.resolution from videotranscoding as trans")
.append(" where trans.status <= :errorcode")
.append(" group by trans.resolution");
List<Object[]> rawData = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), Object[].class)
.setParameter("errorcode", errorcode)
.getResultList();
List<TranscodingCount> allTranscodings = new ArrayList<>();
for (Object[] data : rawData) {
Long count = (Long) data[0];
Integer resolution = (Integer) data[1];
allTranscodings.add(new TranscodingCount(count, resolution));
}
return allTranscodings;
}
/**
* Gets the all video successful transcodings count.
*
* @return Success count
*/
List<TranscodingCount> getAllVideoTranscodingsCountSuccess(int errorcode) {
StringBuilder sb = new StringBuilder();
//[0] count of a distinct [1] resolution
sb.append("select count(trans.key), trans.resolution from videotranscoding as trans")
.append(" where trans.status > :errorcode")
.append(" group by trans.resolution");
List<Object[]> rawData = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), Object[].class)
.setParameter("errorcode", errorcode)
.getResultList();
List<TranscodingCount> allTranscodings = new ArrayList<>();
for (Object[] data : rawData) {
Long count = (Long) data[0];
Integer resolution = (Integer) data[1];
......@@ -193,9 +245,40 @@ public class VideoTranscodingDAO {
StringBuilder sb = new StringBuilder();
sb.append("select trans from videotranscoding as trans")
.append(" inner join fetch trans.videoResource as res")
.append(" where trans.status != 100")
.append(" where trans.status != 100 and trans.status > -2")//without error codes
.append(" order by trans.creationDate asc, trans.id asc");
return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), VideoTranscoding.class).getResultList();
}
/**
* Gets the failed video transcodings.
* currently error codes start at -2 until -4.
*
* @return the failed video transcodings
*/
List<VideoTranscoding> getFailedVideoTranscodings() {
StringBuilder sb = new StringBuilder();
sb.append("select trans from videotranscoding as trans")
.append(" inner join fetch trans.videoResource as res")
.append(" where trans.status <= -2")//error codes
.append(" order by trans.creationDate asc, trans.id asc");
return dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), VideoTranscoding.class)
.getResultList();
}
/**
* Update transcoding status so TranscodingJob can find the resource.
*
* @param videoTranscoding
* @return updated videoTranscoding
*/
VideoTranscoding updateTranscodingStatus (VideoTranscoding videoTranscoding) {
((VideoTranscodingImpl) videoTranscoding).setLastModified(new Date());
videoTranscoding.setStatus(-1);
VideoTranscoding trans = dbInstance.getCurrentEntityManager().merge(videoTranscoding);
return trans;
}
}
......@@ -114,38 +114,51 @@ public class OLATUpgrade_11_3_0 extends OLATUpgrade {
private boolean processVideoResource(RepositoryEntry entry) {
try {
OLATResource videoResource = entry.getOlatResource();
// update trackfiles on filesystem
if (!videoManager.hasMasterContainer(videoResource)) {
log.error("RepoEntry: " + entry.getKey() + " has no valid master container.");
//log error but return true to proceed
return true;
}
// update track files on file system
VFSContainer masterContainer = videoManager.getMasterContainer(videoResource);
VideoMetadata metafromXML = videoManager.readVideoMetadataFile(videoResource);
for (Entry<String, String> track : metafromXML.getAllTracks().entrySet()) {
VFSItem item = masterContainer.resolve(track.getValue());
if (item != null && item instanceof VFSLeaf) {
String path = VideoManagerImpl.TRACK + track.getKey() + VideoManagerImpl.DOT
+ FilenameUtils.getExtension(track.getValue());
//check if modified track file already exists
if (masterContainer.resolve(path) == null) {
VFSLeaf target = masterContainer.createChildLeaf(path);
VFSManager.copyContent((VFSLeaf) item, target);
if (videoManager.isMetadataFileValid(videoResource)) {
VideoMetadata metafromXML = videoManager.readVideoMetadataFile(videoResource);
for (Entry<String, String> track : metafromXML.getAllTracks().entrySet()) {
VFSItem item = masterContainer.resolve(track.getValue());
if (item != null && item instanceof VFSLeaf) {
String path = VideoManagerImpl.TRACK + track.getKey() + VideoManagerImpl.DOT
+ FilenameUtils.getExtension(track.getValue());
//check if modified track file already exists
if (masterContainer.resolve(path) == null) {
VFSLeaf target = masterContainer.createChildLeaf(path);
VFSManager.copyContent((VFSLeaf) item, target);
}
}
}
} else {
log.error("RepoEntry: " + entry.getKey() + " has no valid Video Metadata XML file.");
}
// create entries on database
File videoFile = videoManager.getVideoFile(videoResource);
String fileName = videoFile.getName();
long size = videoFile.length();
String format = FilenameUtils.getExtension(fileName);
if (videoManager.getVideoMetadata(videoResource) == null) {
VideoMetaImpl entity = new VideoMetaImpl();
entity.setVideoResource(videoResource);
entity.setFormat(format);
entity.setCreationDate(new Date());
entity.setLastModified(new Date());
Size resolution = videoManager.getVideoResolutionFromOLATResource(videoResource);
entity.setHeight(resolution.getHeight());
entity.setWidth(resolution.getWidth());
entity.setSize(size);
entity.setLength(entry.getExpenditureOfWork());
dbInstance.getCurrentEntityManager().persist(entity);
// create meta data entries on database
if (videoManager.hasVideoFile(videoResource)) {
File videoFile = videoManager.getVideoFile(videoResource);
String fileName = videoFile.getName();
long size = videoFile.length();
String format = FilenameUtils.getExtension(fileName);
if (videoManager.getVideoMetadata(videoResource) == null) {
VideoMetaImpl entity = new VideoMetaImpl();
entity.setVideoResource(videoResource);
entity.setFormat(format);
entity.setCreationDate(new Date());
entity.setLastModified(new Date());
Size resolution = videoManager.getVideoResolutionFromOLATResource(videoResource);
entity.setHeight(resolution.getHeight());
entity.setWidth(resolution.getWidth());
entity.setSize(size);
entity.setLength(entry.getExpenditureOfWork());
dbInstance.getCurrentEntityManager().persist(entity);
}
} else {
log.error("RepoEntry: " + entry.getKey() + " has no valid resource.");
}
return true;
} catch (Exception e) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment