From 4a676b01e1bb9b4e06ae07a4374792307a96435d Mon Sep 17 00:00:00 2001 From: Benjamin Gamard Date: Fri, 2 Mar 2018 19:05:20 +0100 Subject: [PATCH] Closes #140: video file support --- .travis.yml | 2 +- Dockerfile | 2 +- README.md | 3 +- .../async/FileCreatedAsyncListener.java | 6 +- .../com/sismics/docs/core/util/FileUtil.java | 13 ++- .../main/java/com/sismics/util/ImageUtil.java | 26 ++++-- .../main/java/com/sismics/util/VideoUtil.java | 84 ++++++++++++++++++ .../util/io/InputStreamReaderThread.java | 49 ++++++++++ .../java/com/sismics/util/mime/MimeType.java | 4 + .../com/sismics/util/mime/MimeTypeUtil.java | 20 +++-- .../src/main/resources/messages.properties.fr | 10 +++ .../main/resources/messages.properties.zh_CN | 10 +++ .../main/resources/messages.properties.zh_TW | 10 +++ .../java/com/sismics/util/TestImageUtil.java | 2 +- .../webapp/src/partial/docs/file.view.html | 9 +- docs-web/src/main/webapp/src/style/main.less | 27 ++++++ .../docs/rest/TestDocumentResource.java | 59 ++++++++++++ docs-web/src/test/resources/file/video.webm | Bin 0 -> 71397 bytes 18 files changed, 312 insertions(+), 24 deletions(-) create mode 100644 docs-core/src/main/java/com/sismics/util/VideoUtil.java create mode 100644 docs-core/src/main/java/com/sismics/util/io/InputStreamReaderThread.java create mode 100644 docs-core/src/main/resources/messages.properties.fr create mode 100644 docs-core/src/main/resources/messages.properties.zh_CN create mode 100644 docs-core/src/main/resources/messages.properties.zh_TW create mode 100644 docs-web/src/test/resources/file/video.webm diff --git a/.travis.yml b/.travis.yml index 6d4f395f..75ab2199 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ dist: trusty language: java before_install: - sudo apt-get -qq update - - sudo apt-get -y -q install tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra + - sudo apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra - sudo apt-get -y -q install haveged && sudo service haveged start after_success: - mvn -Pprod -DskipTests clean install diff --git a/Dockerfile b/Dockerfile index d9c9a2d4..fef4e570 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM sismics/jetty:9.2.20-jdk7 MAINTAINER b.gamard@sismics.com -RUN apt-get update && apt-get -y -q install tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra && \ +RUN apt-get update && apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra && \ apt-get clean && rm -rf /var/lib/apt/lists/* ENV TESSDATA_PREFIX /usr/share/tesseract-ocr diff --git a/README.md b/README.md index ea2c6987..64345a0b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Features - Responsive user interface - Optical character recognition - Support image, PDF, ODT and DOCX files +- Video file support ![New!](https://www.sismics.com/public/img/new.png) - Flexible search engine - Full text search in all supported files - All [Dublin Core](http://dublincore.org/) metadata @@ -47,7 +48,7 @@ Features - Document sharing by URL - RESTful Web API - Fully featured Android client -- [Mass files importer](https://github.com/sismics/docs/tree/master/docs-importer) (single or scan mode) ![New!](https://www.sismics.com/public/img/new.png) +- [Bulk files importer](https://github.com/sismics/docs/tree/master/docs-importer) (single or scan mode) ![New!](https://www.sismics.com/public/img/new.png) - Tested to 100k documents Download diff --git a/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java b/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java index b2992de4..b476d1c1 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java +++ b/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java @@ -30,15 +30,13 @@ public class FileCreatedAsyncListener { * @throws Exception e */ @Subscribe - public void on(final FileCreatedAsyncEvent fileCreatedAsyncEvent) throws Exception { + public void on(final FileCreatedAsyncEvent fileCreatedAsyncEvent) { if (log.isInfoEnabled()) { log.info("File created event: " + fileCreatedAsyncEvent.toString()); } - // Guess the mime type a second time, for open document format (first detected as simple ZIP file) - final File file = fileCreatedAsyncEvent.getFile(); - // Extract text content from the file + final File file = fileCreatedAsyncEvent.getFile(); long startTime = System.currentTimeMillis(); final String content = FileUtil.extractContent(fileCreatedAsyncEvent.getLanguage(), file, fileCreatedAsyncEvent.getUnencryptedFile(), fileCreatedAsyncEvent.getUnencryptedPdfFile()); diff --git a/docs-core/src/main/java/com/sismics/docs/core/util/FileUtil.java b/docs-core/src/main/java/com/sismics/docs/core/util/FileUtil.java index 8d6db868..3da17017 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/util/FileUtil.java +++ b/docs-core/src/main/java/com/sismics/docs/core/util/FileUtil.java @@ -12,6 +12,7 @@ import com.sismics.tess4j.Tesseract; import com.sismics.util.ImageDeskew; import com.sismics.util.ImageUtil; import com.sismics.util.Scalr; +import com.sismics.util.VideoUtil; import com.sismics.util.context.ThreadLocalContext; import com.sismics.util.mime.MimeTypeUtil; import org.apache.commons.lang.StringUtils; @@ -54,6 +55,8 @@ public class FileUtil { if (ImageUtil.isImage(file.getMimeType())) { content = ocrFile(unencryptedFile, language); + } else if (VideoUtil.isVideo(file.getMimeType())) { + content = VideoUtil.getMetadata(unencryptedFile); } else if (unencryptedPdfFile != null) { content = PdfUtil.extractPdf(unencryptedPdfFile); } @@ -114,8 +117,12 @@ public class FileUtil { Files.copy(new CipherInputStream(inputStream, cipher), path); } - // Generate file variations - saveVariations(file, unencryptedFile, unencryptedPdfFile, cipher); + // Generate file variations (errors non-blocking) + try { + saveVariations(file, unencryptedFile, unencryptedPdfFile, cipher); + } catch (Exception e) { + log.error("Unable to generate thumbnails", e); + } } /** @@ -132,6 +139,8 @@ public class FileUtil { try (InputStream inputStream = Files.newInputStream(unencryptedFile)) { image = ImageIO.read(inputStream); } + } else if (VideoUtil.isVideo(file.getMimeType())) { + image = VideoUtil.getThumbnail(unencryptedFile); } else if (unencryptedPdfFile != null) { // Generate preview from the first page of the PDF image = PdfUtil.renderFirstPage(unencryptedPdfFile); diff --git a/docs-core/src/main/java/com/sismics/util/ImageUtil.java b/docs-core/src/main/java/com/sismics/util/ImageUtil.java index edc4efa2..33a6ddee 100644 --- a/docs-core/src/main/java/com/sismics/util/ImageUtil.java +++ b/docs-core/src/main/java/com/sismics/util/ImageUtil.java @@ -22,13 +22,12 @@ import java.util.Iterator; * @author jtremeaux */ public class ImageUtil { - /** * Write a high quality JPEG. * - * @param image + * @param image Image * @param outputStream Output stream - * @throws IOException + * @throws IOException e */ public static void writeJpeg(BufferedImage image, OutputStream outputStream) throws IOException { Iterator iter = ImageIO.getImageWritersByFormatName("jpeg"); @@ -94,6 +93,14 @@ public class ImageUtil { .toString(); } + /** + * Return true if a pixel is black. + * + * @param image Image + * @param x X + * @param y Y + * @return True if black + */ public static boolean isBlack(BufferedImage image, int x, int y) { if (image.getType() == BufferedImage.TYPE_BYTE_BINARY) { WritableRaster raster = image.getRaster(); @@ -105,7 +112,16 @@ public class ImageUtil { return isBlack(image, x, y, luminanceValue); } - public static boolean isBlack(BufferedImage image, int x, int y, int luminanceCutOff) { + /** + * Return true if a pixel is black. + * + * @param image Image + * @param x X + * @param y Y + * @param luminanceCutOff Luminance cutoff + * @return True if black + */ + private static boolean isBlack(BufferedImage image, int x, int y, int luminanceCutOff) { int pixelRGBValue; int r; int g; @@ -124,7 +140,7 @@ public class ImageUtil { b = (pixelRGBValue) & 0xff; luminance = (r * 0.299) + (g * 0.587) + (b * 0.114); } catch (Exception e) { - // ignore. + // NOP } return luminance < luminanceCutOff; diff --git a/docs-core/src/main/java/com/sismics/util/VideoUtil.java b/docs-core/src/main/java/com/sismics/util/VideoUtil.java new file mode 100644 index 00000000..b1cd34d2 --- /dev/null +++ b/docs-core/src/main/java/com/sismics/util/VideoUtil.java @@ -0,0 +1,84 @@ +package com.sismics.util; + +import com.google.common.base.Charsets; +import com.google.common.collect.Lists; +import com.google.common.io.ByteStreams; +import com.sismics.util.io.InputStreamReaderThread; +import com.sismics.util.mime.MimeType; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +/** + * Video processing utilities. + * + * @author bgamard + */ +public class VideoUtil { + /** + * Returns true if this MIME type is a video. + * @param mimeType MIME type + * @return True if video + */ + public static boolean isVideo(String mimeType) { + return mimeType.equals(MimeType.VIDEO_MP4) || mimeType.equals(MimeType.VIDEO_WEBM); + } + + /** + * Generate a thumbnail from a video file. + * + * @param file Video file + * @return Thumbnail + */ + public static BufferedImage getThumbnail(Path file) throws Exception { + List result = Lists.newLinkedList(Arrays.asList("ffmpeg", "-i")); + result.add(file.toAbsolutePath().toString()); + result.addAll(Arrays.asList("-vf", "\"thumbnail\"", "-frames:v", "1", "-f", "mjpeg", "-")); + ProcessBuilder pb = new ProcessBuilder(result); + Process process = pb.start(); + + // Consume the process error stream + final String commandName = pb.command().get(0); + new InputStreamReaderThread(process.getErrorStream(), commandName).start(); + + // Consume the data as an image + try (InputStream is = process.getInputStream()) { + return ImageIO.read(is); + } + } + + /** + * Extract metadata from a video file. + * + * @param file Video file + * @return Metadata + */ + public static String getMetadata(Path file) { + List result = Lists.newLinkedList(); + result.add("mediainfo"); + result.add(file.toAbsolutePath().toString()); + ProcessBuilder pb = new ProcessBuilder(result); + Process process; + try { + process = pb.start(); + } catch (IOException e) { + return null; + } + + // Consume the process error stream + final String commandName = pb.command().get(0); + new InputStreamReaderThread(process.getErrorStream(), commandName).start(); + + // Consume the data as a string + try (InputStream is = process.getInputStream()) { + return new String(ByteStreams.toByteArray(is), Charsets.UTF_8); + } catch (Exception e) { + return null; + } + } +} diff --git a/docs-core/src/main/java/com/sismics/util/io/InputStreamReaderThread.java b/docs-core/src/main/java/com/sismics/util/io/InputStreamReaderThread.java new file mode 100644 index 00000000..23c3819b --- /dev/null +++ b/docs-core/src/main/java/com/sismics/util/io/InputStreamReaderThread.java @@ -0,0 +1,49 @@ +package com.sismics.util.io; + +import com.google.common.io.Closer; +import org.apache.log4j.Logger; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * Thread that consumes data from an input stream and logs it. + * + * @author jtremeaux + */ +public class InputStreamReaderThread extends Thread { + + private static final Logger logger = Logger.getLogger(InputStreamReaderThread.class); + + private InputStream is; + + private String name; + + private Closer closer = Closer.create(); + + public InputStreamReaderThread(InputStream input, String name) { + super(name + " InputStreamReader thread"); + this.is = closer.register(input); + this.name = name; + } + + @Override + public void run() { + try { + BufferedReader reader = closer.register(new BufferedReader(new InputStreamReader(is))); + for (String line = reader.readLine(); line != null; line = reader.readLine()) { + logger.info(String.format(name + ": %s", line)); + } + } catch (IOException x) { + // NOP + } finally { + try { + closer.close(); + } catch (Exception e) { + // NOP + } + } + } +} diff --git a/docs-core/src/main/java/com/sismics/util/mime/MimeType.java b/docs-core/src/main/java/com/sismics/util/mime/MimeType.java index 8e77180a..a97f7807 100644 --- a/docs-core/src/main/java/com/sismics/util/mime/MimeType.java +++ b/docs-core/src/main/java/com/sismics/util/mime/MimeType.java @@ -24,5 +24,9 @@ public class MimeType { public static final String TEXT_CSV = "text/csv"; + public static final String VIDEO_WEBM = "video/webm"; + + public static final String VIDEO_MP4 = "video/mp4"; + public static final String DEFAULT = "application/octet-stream"; } diff --git a/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java b/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java index 52d5e1df..b08b471f 100644 --- a/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java +++ b/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java @@ -1,5 +1,9 @@ package com.sismics.util.mime; +import com.google.common.base.Charsets; +import com.sismics.docs.core.model.jpa.File; +import org.apache.commons.compress.utils.IOUtils; + import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -8,13 +12,6 @@ import java.nio.file.Path; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import org.apache.commons.compress.archivers.ArchiveEntry; -import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -import org.apache.commons.compress.utils.IOUtils; - -import com.google.common.base.Charsets; -import com.sismics.docs.core.model.jpa.File; - /** * Utility to check MIME types. * @@ -60,6 +57,11 @@ public class MimeTypeUtil { return MimeType.IMAGE_PNG; } else if (headerBytes[0] == ((byte) 0x25) && headerBytes[1] == ((byte) 0x50) && headerBytes[2] == ((byte) 0x44) && headerBytes[3] == ((byte) 0x46)) { return MimeType.APPLICATION_PDF; + } else if (headerBytes[0] == ((byte) 0x00) && headerBytes[1] == ((byte) 0x00) && headerBytes[2] == ((byte) 0x00) && (headerBytes[3] == ((byte) 0x14) || headerBytes[3] == ((byte) 0x18)) + && headerBytes[4] == ((byte) 0x66) && headerBytes[5] == ((byte) 0x74) && headerBytes[6] == ((byte) 0x79) && headerBytes[7] == ((byte) 0x70)) { + return MimeType.VIDEO_MP4; + } else if (headerBytes[0] == ((byte) 0x1a) && headerBytes[1] == ((byte) 0x45) && headerBytes[2] == ((byte) 0xdf) && headerBytes[3] == ((byte) 0xa3)) { + return MimeType.VIDEO_WEBM; } // Detect by file extension @@ -100,6 +102,10 @@ public class MimeTypeUtil { return "txt"; case MimeType.TEXT_CSV: return "csv"; + case MimeType.VIDEO_MP4: + return "mp4"; + case MimeType.VIDEO_WEBM: + return "webm"; default: return "bin"; } diff --git a/docs-core/src/main/resources/messages.properties.fr b/docs-core/src/main/resources/messages.properties.fr new file mode 100644 index 00000000..e80dd012 --- /dev/null +++ b/docs-core/src/main/resources/messages.properties.fr @@ -0,0 +1,10 @@ +email.template.password_recovery.subject=R\u00E9initialiser votre mot de passe +email.template.password_recovery.hello=Bonjour {0}. +email.template.password_recovery.instruction1=Nous avons re\u00E7u une demande de r\u00E9initialisation de mot de passe.
Si vous n'avez rien demand\u00E9, vous pouvez ignorer cet mail. +email.template.password_recovery.instruction2=Pour r\u00E9initialiser votre mot de passe, cliquez sur le lien ci-dessous : +email.template.password_recovery.click_here=Cliquez ici pour r\u00E9initialiser votre mot de passe. +email.template.route_step_validate.subject=Un document n\u00E9cessite votre attention +email.template.route_step_validate.hello=Bonjour {0}. +email.template.route_step_validate.instruction1=Une \u00E9tape de workflow vous a \u00E9t\u00E9 attribu\u00E9e et n\u00E9cessite votre attention. +email.template.route_step_validate.instruction2=Pour voir le document et valider le workflow, veuillez visiter le lien ci-dessous : +email.no_html.error=Votre client mail ne supporte pas les messages HTML diff --git a/docs-core/src/main/resources/messages.properties.zh_CN b/docs-core/src/main/resources/messages.properties.zh_CN new file mode 100644 index 00000000..a0627b0d --- /dev/null +++ b/docs-core/src/main/resources/messages.properties.zh_CN @@ -0,0 +1,10 @@ +email.template.password_recovery.subject=\u8BF7\u91CD\u7F6E\u60A8\u7684\u5BC6\u7801 +email.template.password_recovery.hello=\u60A8\u597D {0}. +email.template.password_recovery.instruction1=\u6211\u4EEC\u6536\u5230\u4E86\u4E00\u4E2A\u91CD\u7F6E\u60A8\u7684\u5BC6\u7801\u7684\u8BF7\u6C42\u3002
\u5982\u679C\u60A8\u6CA1\u6709\u53D1\u9001\u8BE5\u8BF7\u6C42\uFF0C\u8BF7\u5FFD\u7565\u6B64\u7535\u5B50\u90AE\u4EF6 +email.template.password_recovery.instruction2=\u8981\u91CD\u7F6E\u60A8\u7684\u5BC6\u7801\uFF0C\u8BF7\u8BBF\u95EE\u4EE5\u4E0B\u94FE\u63A5\uFF1A +email.template.password_recovery.click_here=\u8BF7\u70B9\u51FB\u6B64\u5904\u91CD\u7F6E\u60A8\u7684\u5BC6\u7801 +email.template.route_step_validate.subject=\u4E00\u4EFD\u6587\u4EF6\u9700\u8981\u4F60\u7684\u5173\u6CE8 +email.template.route_step_validate.hello={0}\uFF0C\u60A8\u597D. +email.template.route_step_validate.instruction1=\u5DE5\u4F5C\u6D41\u6B65\u9AA4\u5DF2\u7ECF\u5206\u914D\u7ED9\u60A8\uFF0C\u9700\u8981\u60A8\u7684\u5173\u6CE8\u3002 +email.template.route_step_validate.instruction2=\u8981\u67E5\u770B\u6587\u6863\u5E76\u9A8C\u8BC1\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u8BF7\u8BBF\u95EE\u4EE5\u4E0B\u94FE\u63A5\uFF1A +email.no_html.error=\u60A8\u7684\u7535\u5B50\u90AE\u4EF6\u5BA2\u6237\u7AEF\u4E0D\u652F\u6301HTML\u683C\u5F0F\u90AE\u4EF6 diff --git a/docs-core/src/main/resources/messages.properties.zh_TW b/docs-core/src/main/resources/messages.properties.zh_TW new file mode 100644 index 00000000..da961212 --- /dev/null +++ b/docs-core/src/main/resources/messages.properties.zh_TW @@ -0,0 +1,10 @@ +email.template.password_recovery.subject=\u8ACB\u91CD\u65B0\u8A2D\u7F6E\u60A8\u7684\u5BC6\u78BC +email.template.password_recovery.hello=\u60A8\u597D{0}\uFF01 +email.template.password_recovery.instruction1=\u6211\u5011\u6536\u5230\u4E86\u91CD\u7F6E\u5BC6\u78BC\u7684\u8ACB\u6C42\u3002
\u5982\u679C\u60A8\u6C92\u6709\u8ACB\u6C42\u5E6B\u52A9\uFF0C\u8ACB\u5FFD\u7565\u6B64\u96FB\u5B50\u90F5\u4EF6\u3002 +email.template.password_recovery.instruction2=\u8981\u91CD\u7F6E\u60A8\u7684\u5BC6\u78BC\uFF0C\u8ACB\u8A2A\u554F\u4EE5\u4E0B\u93C8\u63A5\uFF1A +email.template.password_recovery.click_here=\u9EDE\u64CA\u9019\u88E1\u91CD\u7F6E\u60A8\u7684\u5BC6\u78BC +email.template.route_step_validate.subject=\u4E00\u4EFD\u6587\u4EF6\u9700\u8981\u4F60\u7684\u95DC\u6CE8 +email.template.route_step_validate.hello={0}\uFF0C\u60A8\u597D. +email.template.route_step_validate.instruction1=\u5DE5\u4F5C\u6D41\u6B65\u9A5F\u5DF2\u7D93\u5206\u914D\u7D66\u60A8\uFF0C\u9700\u8981\u60A8\u7684\u95DC\u6CE8\u3002 +email.template.route_step_validate.instruction2=\u8981\u67E5\u770B\u6587\u6A94\u4E26\u9A57\u8B49\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u8ACB\u8A2A\u554F\u4EE5\u4E0B\u93C8\u63A5\uFF1A +email.no_html.error=\u60A8\u7684\u96FB\u5B50\u90F5\u4EF6\u5BA2\u6236\u7AEF\u4E0D\u652F\u6301HTML\u683C\u5F0F\u90F5\u4EF6 diff --git a/docs-core/src/test/java/com/sismics/util/TestImageUtil.java b/docs-core/src/test/java/com/sismics/util/TestImageUtil.java index 6d980aaa..ffe0928f 100644 --- a/docs-core/src/test/java/com/sismics/util/TestImageUtil.java +++ b/docs-core/src/test/java/com/sismics/util/TestImageUtil.java @@ -11,7 +11,7 @@ import org.junit.Test; public class TestImageUtil { @Test - public void computeGravatarTest() throws Exception { + public void computeGravatarTest() { Assert.assertEquals("0bc83cb571cd1c50ba6f3e8a78ef1346", ImageUtil.computeGravatar("MyEmailAddress@example.com ")); } } diff --git a/docs-web/src/main/webapp/src/partial/docs/file.view.html b/docs-web/src/main/webapp/src/partial/docs/file.view.html index c78062f7..c7f35feb 100644 --- a/docs-web/src/main/webapp/src/partial/docs/file.view.html +++ b/docs-web/src/main/webapp/src/partial/docs/file.view.html @@ -20,12 +20,17 @@ - -
+
+ + + +

{{ 'file.view.not_found' | translate }} diff --git a/docs-web/src/main/webapp/src/style/main.less b/docs-web/src/main/webapp/src/style/main.less index f86e92a1..06970606 100644 --- a/docs-web/src/main/webapp/src/style/main.less +++ b/docs-web/src/main/webapp/src/style/main.less @@ -392,6 +392,33 @@ input[readonly].share-link { } } +// Video player +.video-overlay { + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + font-size: 500%; + color: #242424; + + .glyphicon { + text-shadow: 0 0 20px #fff; + top: 50%; + transform: translateY(-50%); + } + + &:hover { + color: #444; + } + + video { + cursor: default; + width: 100%; + } +} + // Vertical alignment .vertical-center { min-height: 100vh; diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java index a38cf032..8c61e591 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java @@ -603,6 +603,65 @@ public class TestDocumentResource extends BaseJerseyTest { Assert.assertEquals(MimeType.IMAGE_JPEG, MimeTypeUtil.guessMimeType(fileBytes, null)); } + /** + * Test video extraction. + * + * @throws Exception e + */ + @Test + public void testVideoExtraction() throws Exception { + // Login document_video + clientUtil.createUser("document_video"); + String documentPlainToken = clientUtil.login("document_video"); + + // Create a document + long create1Date = new Date().getTime(); + JsonObject json = target().path("/document").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, documentPlainToken) + .put(Entity.form(new Form() + .param("title", "My super title document 1") + .param("description", "My super description for document 1") + .param("language", "eng") + .param("create_date", Long.toString(create1Date))), JsonObject.class); + String document1Id = json.getString("id"); + Assert.assertNotNull(document1Id); + + // Add a video file + String file1Id; + try (InputStream is = Resources.getResource("file/video.webm").openStream()) { + StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart("file", is, "video.webm"); + try (FormDataMultiPart multiPart = new FormDataMultiPart()) { + json = target() + .register(MultiPartFeature.class) + .path("/file").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, documentPlainToken) + .put(Entity.entity(multiPart.field("id", document1Id).bodyPart(streamDataBodyPart), + MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); + file1Id = json.getString("id"); + Assert.assertNotNull(file1Id); + } + } + + // Search documents by query in full content + json = target().path("/document/list") + .queryParam("search", "full:vp9") + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, documentPlainToken) + .get(JsonObject.class); + Assert.assertTrue(json.getJsonArray("documents").size() == 1); + + // Get the file thumbnail data + Response response = target().path("/file/" + file1Id + "/data") + .queryParam("size", "thumb") + .request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, documentPlainToken) + .get(); + InputStream is = (InputStream) response.getEntity(); + byte[] fileBytes = ByteStreams.toByteArray(is); + Assert.assertTrue(fileBytes.length > 0); // Images rendered from PDF differ in size from OS to OS due to font issues + Assert.assertEquals(MimeType.IMAGE_JPEG, MimeTypeUtil.guessMimeType(fileBytes, null)); + } + /** * Test EML import. * diff --git a/docs-web/src/test/resources/file/video.webm b/docs-web/src/test/resources/file/video.webm new file mode 100644 index 0000000000000000000000000000000000000000..0757a9754caec2845eea6f7ed74f8187ae681227 GIT binary patch literal 71397 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