From 74a7961799ee1a1d63e7195105677c6f24162fc3 Mon Sep 17 00:00:00 2001 From: RhiobeT Date: Tue, 25 May 2021 20:53:20 +0200 Subject: [PATCH] Add thumbnails generator for zip files --- .../rhiobet/lalafin/file/FileInfoService.java | 6 +- .../lalafin/file/ThumbnailService.java | 71 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/sh/rhiobet/lalafin/file/ThumbnailService.java diff --git a/src/main/java/sh/rhiobet/lalafin/file/FileInfoService.java b/src/main/java/sh/rhiobet/lalafin/file/FileInfoService.java index e3a13c1..d5c30c7 100644 --- a/src/main/java/sh/rhiobet/lalafin/file/FileInfoService.java +++ b/src/main/java/sh/rhiobet/lalafin/file/FileInfoService.java @@ -22,6 +22,9 @@ public class FileInfoService { @Inject FileApiConfiguration fileApiConfiguration; + @Inject + ThumbnailService thumbnailService; + public FileInfoBase getInfo(List names, FileTokenProvider fileTokenProvider) { String requestedPath = ""; String requestedFilename = ""; @@ -128,7 +131,8 @@ public class FileInfoService { contentInfo.viewUrl = "/view" + requestedUri + "/" + fileUri + "/0"; } } - if (thumbPath != null && Files.exists(thumbPath)) { + if ((thumbPath != null && Files.exists(thumbPath)) + || thumbnailService.generateThumbnail(contentInfo, thumbPath)) { contentInfo.thumbnailUrl = "/file" + requestedUri + "/.thumbnails/" + fileUri + ".jpg"; } diff --git a/src/main/java/sh/rhiobet/lalafin/file/ThumbnailService.java b/src/main/java/sh/rhiobet/lalafin/file/ThumbnailService.java new file mode 100644 index 0000000..a470fc2 --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/file/ThumbnailService.java @@ -0,0 +1,71 @@ +package sh.rhiobet.lalafin.file; + +import java.io.IOException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.NoSuchElementException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import org.im4java.core.ConvertCmd; +import org.im4java.core.IM4JavaException; +import org.im4java.core.IMOperation; +import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration; +import sh.rhiobet.lalafin.api.model.FileInfo; +import sh.rhiobet.lalafin.api.model.FileInfoBase; + +@ApplicationScoped +public class ThumbnailService { + @Inject + FileApiConfiguration fileApiConfiguration; + + public boolean generateThumbnail(FileInfoBase fileInfoBase, Path thumbPath) { + if (fileInfoBase instanceof FileInfo) { + FileInfo fileInfo = (FileInfo) fileInfoBase; + if (fileInfo.filename.endsWith(".zip")) { + return this.generateThumbnailFromZip(fileInfo, thumbPath); + } + } + return false; + } + + public boolean generateThumbnailFromZip(FileInfo fileInfo, Path thumbPath) { + Path zipPath = Paths.get(fileApiConfiguration.directory() + + URLDecoder.decode(fileInfo.directUrl, StandardCharsets.UTF_8)); + + Path tmpPath = null; + try { + ZipFile zipFile = new ZipFile(zipPath.toFile()); + ZipEntry entry = zipFile.stream().filter(e -> !e.isDirectory()).findFirst().get(); + tmpPath = Paths + .get("/tmp/" + fileInfo.filename + "_" + entry.getName().replace("/", "_")); + Files.copy(zipFile.getInputStream(entry), tmpPath); + thumbPath.getParent().toFile().mkdirs(); + + ConvertCmd convert = new ConvertCmd(); + IMOperation op = new IMOperation(); + op.addImage(tmpPath.toString()); + op.resize(200, null); + op.addImage(thumbPath.toString()); + convert.run(op); + + return true; + } catch (NoSuchElementException | IOException | InterruptedException | IM4JavaException e) { + e.printStackTrace(); + } finally { + if (tmpPath != null) { + try { + Files.delete(tmpPath); + } catch (IOException ignored) { + } + } + } + + return false; + } + +}