removeffmpeg (#6053)

This commit is contained in:
Anthony Stirling
2026-04-02 17:40:02 +01:00
committed by GitHub
parent 0adcbeedf1
commit c9a70f3754
9 changed files with 17 additions and 190 deletions
@@ -73,7 +73,8 @@ public class ExternalAppDepConfig {
tmp.put("tesseract", List.of("tesseract"));
tmp.put("rar", List.of("rar")); // Required for real CBR output
tmp.put(calibrePath, List.of("Calibre"));
tmp.put("ffmpeg", List.of("FFmpeg"));
// ffmpeg disabled due to raised CVEs
// tmp.put("ffmpeg", List.of("FFmpeg"));
tmp.put("magick", List.of("ImageMagick"));
this.commandToGroupMapping = Collections.unmodifiableMap(tmp);
}
@@ -8,10 +8,7 @@ import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -23,31 +20,17 @@ import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.converters.PdfToVideoRequest;
import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.ConvertApi;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.CheckProgramInstall;
import stirling.software.common.util.ExceptionUtils;
import stirling.software.common.util.ProcessExecutor;
import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult;
import stirling.software.common.util.TempDirectory;
import stirling.software.common.util.TempFile;
import stirling.software.common.util.TempFileManager;
import stirling.software.common.util.WebResponseUtils;
@ConvertApi
@RequiredArgsConstructor
@@ -64,6 +47,8 @@ public class ConvertPdfToVideoController {
private final CustomPDFDocumentFactory pdfDocumentFactory;
private final TempFileManager tempFileManager;
// ffmpeg disabled due to raised CVEs
/*
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/video")
@Operation(
summary = "Convert PDF to Video Slideshow",
@@ -163,6 +148,7 @@ public class ConvertPdfToVideoController {
return WebResponseUtils.bytesToWebResponse(videoBytes, outputName, mediaType);
}
}
*/
private void generateFrames(
Path inputPdf,
@@ -1,164 +0,0 @@
package stirling.software.SPDF.controller.api.converters;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import stirling.software.SPDF.model.api.converters.PdfToVideoRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.CheckProgramInstall;
import stirling.software.common.util.TempFileManager;
@ExtendWith(MockitoExtension.class)
class ConvertPdfToVideoControllerTest {
@Mock private CustomPDFDocumentFactory pdfDocumentFactory;
@Mock private TempFileManager tempFileManager;
@InjectMocks private ConvertPdfToVideoController controller;
@Test
void convertPdfToVideo_ffmpegNotAvailableThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile pdfFile =
new MockMultipartFile(
"fileInput", "doc.pdf", "application/pdf", "content".getBytes());
request.setFileInput(pdfFile);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(false);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_nullFileThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
request.setFileInput(null);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_emptyFileThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile emptyFile =
new MockMultipartFile("fileInput", "doc.pdf", "application/pdf", new byte[0]);
request.setFileInput(emptyFile);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_nonPdfContentTypeReturnsBadRequest() throws Exception {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile txtFile =
new MockMultipartFile("fileInput", "doc.txt", "text/plain", "content".getBytes());
request.setFileInput(txtFile);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
ResponseEntity<byte[]> response = controller.convertPdfToVideo(request);
assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode());
}
}
@Test
void convertPdfToVideo_invalidOpacityThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile pdfFile =
new MockMultipartFile(
"fileInput", "doc.pdf", "application/pdf", "content".getBytes());
request.setFileInput(pdfFile);
request.setOpacity(1.5f);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_negativeOpacityThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile pdfFile =
new MockMultipartFile(
"fileInput", "doc.pdf", "application/pdf", "content".getBytes());
request.setFileInput(pdfFile);
request.setOpacity(-0.1f);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_negativeSecondsPerPageThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile pdfFile =
new MockMultipartFile(
"fileInput", "doc.pdf", "application/pdf", "content".getBytes());
request.setFileInput(pdfFile);
request.setSecondsPerPage(-1);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void convertPdfToVideo_zeroSecondsPerPageThrows() {
PdfToVideoRequest request = new PdfToVideoRequest();
MockMultipartFile pdfFile =
new MockMultipartFile(
"fileInput", "doc.pdf", "application/pdf", "content".getBytes());
request.setFileInput(pdfFile);
request.setSecondsPerPage(0);
try (MockedStatic<CheckProgramInstall> mock =
Mockito.mockStatic(CheckProgramInstall.class)) {
mock.when(CheckProgramInstall::isFfmpegAvailable).thenReturn(true);
assertThrows(Exception.class, () -> controller.convertPdfToVideo(request));
}
}
@Test
void controllerIsConstructed() {
assertNotNull(controller);
}
}