From 986ec8958a46335baa75c6095efa29b0276c2674 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Thu, 18 Dec 2025 01:00:03 +0100 Subject: [PATCH] Enabled deprication warnings, fixed some of the warnings --- build.gradle | 4 + src/zutil/db/DBConnection.java | 7 +- src/zutil/image/ImageFilterProcessor.java | 7 +- src/zutil/net/acme/AcmeFileDataStore.java | 27 ++++ src/zutil/net/http/HttpURL.java | 4 +- .../page/oauth/OAuth2AuthorizationPage.java | 5 +- .../http/servlet/HttpServletRequestImpl.java | 4 +- .../http/servlet/HttpServletResponseImpl.java | 5 +- .../net/http/servlet/HttpSessionImpl.java | 7 +- src/zutil/net/ws/WebServiceDef.java | 7 +- src/zutil/osal/app/ffmpeg/FFmpeg.java | 51 ++++++-- src/zutil/osal/app/ffmpeg/FFmpegInput.java | 49 ++++--- src/zutil/osal/app/ffmpeg/FFmpegOutput.java | 122 +++++++++++------- src/zutil/plugin/PluginData.java | 4 +- .../osal/app/ffmpeg/FFmpegInputTest.java | 15 ++- .../osal/app/ffmpeg/FFmpegOutputTest.java | 16 ++- test/zutil/osal/app/ffmpeg/FFmpegTest.java | 10 +- 17 files changed, 235 insertions(+), 109 deletions(-) diff --git a/build.gradle b/build.gradle index 16cb29e..18d5f62 100644 --- a/build.gradle +++ b/build.gradle @@ -80,6 +80,10 @@ java { withJavadocJar() } +tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:deprecation" +} + sourceSets { main { java { diff --git a/src/zutil/db/DBConnection.java b/src/zutil/db/DBConnection.java index 9a3ecc0..3c5bde1 100755 --- a/src/zutil/db/DBConnection.java +++ b/src/zutil/db/DBConnection.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -31,6 +31,7 @@ import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import java.io.Closeable; +import java.lang.reflect.InvocationTargetException; import java.sql.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -110,10 +111,10 @@ public class DBConnection implements Closeable{ * @param db is the DB type * @return the protocol name of the DBMS */ - public static String initDriver(DBMS db) throws InstantiationException, IllegalAccessException, ClassNotFoundException{ + public static String initDriver(DBMS db) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { switch(db) { case MySQL: - Class.forName("com.mysql.jdbc.Driver").newInstance(); + Class.forName("com.mysql.jdbc.Driver").getDeclaredConstructor().newInstance(); DriverManager.setLoginTimeout(10); return "mysql"; case SQLite: diff --git a/src/zutil/image/ImageFilterProcessor.java b/src/zutil/image/ImageFilterProcessor.java index 8151e16..318aaf6 100644 --- a/src/zutil/image/ImageFilterProcessor.java +++ b/src/zutil/image/ImageFilterProcessor.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,6 +27,7 @@ package zutil.image; import zutil.ProgressListener; import java.awt.image.BufferedImage; +import java.lang.reflect.InvocationTargetException; /** * This is a abstract class for all the effects @@ -74,8 +75,8 @@ public abstract class ImageFilterProcessor { * @param img The image to process * @return The processed image */ - public static ImageFilterProcessor getProcessor(String effect, BufferedImage img) throws InstantiationException, IllegalAccessException, ClassNotFoundException { - ImageFilterProcessor processor = (ImageFilterProcessor)Class.forName(effect).newInstance(); + public static ImageFilterProcessor getProcessor(String effect, BufferedImage img) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { + ImageFilterProcessor processor = (ImageFilterProcessor)Class.forName(effect).getDeclaredConstructor().newInstance(); processor.img = img; return processor; } diff --git a/src/zutil/net/acme/AcmeFileDataStore.java b/src/zutil/net/acme/AcmeFileDataStore.java index 77fde8b..e17fc2f 100644 --- a/src/zutil/net/acme/AcmeFileDataStore.java +++ b/src/zutil/net/acme/AcmeFileDataStore.java @@ -1,3 +1,27 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2025 Ziver Koc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + package zutil.net.acme; import org.shredzone.acme4j.toolbox.AcmeUtils; @@ -12,6 +36,9 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +/** + * A file based datastore for storing ACME protocol needed data. + */ public class AcmeFileDataStore implements AcmeDataStore { private final File accountLocationFile; diff --git a/src/zutil/net/http/HttpURL.java b/src/zutil/net/http/HttpURL.java index 3afe3db..0450d31 100755 --- a/src/zutil/net/http/HttpURL.java +++ b/src/zutil/net/http/HttpURL.java @@ -189,9 +189,9 @@ public class HttpURL { for (String key : parameters.keySet()) { if (param.length() > 0) param.append('&'); - param.append(URLEncoder.encode(key)); + param.append(URLEncoder.encode(key, StandardCharsets.UTF_8)); param.append('='); - param.append(URLEncoder.encode(parameters.get(key))); + param.append(URLEncoder.encode(parameters.get(key), StandardCharsets.UTF_8)); } return param.toString(); } diff --git a/src/zutil/net/http/page/oauth/OAuth2AuthorizationPage.java b/src/zutil/net/http/page/oauth/OAuth2AuthorizationPage.java index a63fec3..7a73b37 100644 --- a/src/zutil/net/http/page/oauth/OAuth2AuthorizationPage.java +++ b/src/zutil/net/http/page/oauth/OAuth2AuthorizationPage.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -32,6 +32,7 @@ import zutil.net.http.HttpPrintStream; import zutil.net.http.HttpURL; import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Random; import java.util.logging.Logger; @@ -111,7 +112,7 @@ public class OAuth2AuthorizationPage implements HttpPage { } try { - url = new HttpURL(URLDecoder.decode(request.get("redirect_uri"))); + url = new HttpURL(URLDecoder.decode(request.get("redirect_uri"), StandardCharsets.UTF_8)); } catch(Exception e) {} if (url == null || !"HTTPS".equalsIgnoreCase(url.getProtocol())) { diff --git a/src/zutil/net/http/servlet/HttpServletRequestImpl.java b/src/zutil/net/http/servlet/HttpServletRequestImpl.java index aab5b3c..2f4203d 100644 --- a/src/zutil/net/http/servlet/HttpServletRequestImpl.java +++ b/src/zutil/net/http/servlet/HttpServletRequestImpl.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -165,6 +165,7 @@ public class HttpServletRequestImpl implements HttpServletRequest { } @Override + @Deprecated public boolean isRequestedSessionIdFromUrl() { return false; } @@ -325,6 +326,7 @@ public class HttpServletRequestImpl implements HttpServletRequest { } @Override + @Deprecated public String getRealPath(String s) { return null; } diff --git a/src/zutil/net/http/servlet/HttpServletResponseImpl.java b/src/zutil/net/http/servlet/HttpServletResponseImpl.java index f8077cc..f192268 100644 --- a/src/zutil/net/http/servlet/HttpServletResponseImpl.java +++ b/src/zutil/net/http/servlet/HttpServletResponseImpl.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -56,11 +56,13 @@ public class HttpServletResponseImpl implements HttpServletResponse { } @Override + @Deprecated public String encodeUrl(String s) { return null; } @Override + @Deprecated public String encodeRedirectUrl(String s) { return null; } @@ -116,6 +118,7 @@ public class HttpServletResponseImpl implements HttpServletResponse { } @Override + @Deprecated public void setStatus(int i, String s) { } diff --git a/src/zutil/net/http/servlet/HttpSessionImpl.java b/src/zutil/net/http/servlet/HttpSessionImpl.java index 5223eeb..d8d1023 100644 --- a/src/zutil/net/http/servlet/HttpSessionImpl.java +++ b/src/zutil/net/http/servlet/HttpSessionImpl.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -63,6 +63,7 @@ public class HttpSessionImpl implements HttpSession { } @Override + @Deprecated public HttpSessionContext getSessionContext() { throw new UnsupportedOperationException(); } @@ -73,6 +74,7 @@ public class HttpSessionImpl implements HttpSession { } @Override + @Deprecated public Object getValue(String name) { return null; } @@ -83,6 +85,7 @@ public class HttpSessionImpl implements HttpSession { } @Override + @Deprecated public String[] getValueNames() { return new String[0]; } @@ -93,6 +96,7 @@ public class HttpSessionImpl implements HttpSession { } @Override + @Deprecated public void putValue(String name, Object value) { } @@ -103,6 +107,7 @@ public class HttpSessionImpl implements HttpSession { } @Override + @Deprecated public void removeValue(String name) { } diff --git a/src/zutil/net/ws/WebServiceDef.java b/src/zutil/net/ws/WebServiceDef.java index 95e0b74..7daa166 100755 --- a/src/zutil/net/ws/WebServiceDef.java +++ b/src/zutil/net/ws/WebServiceDef.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,7 @@ package zutil.net.ws; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Collection; @@ -132,7 +133,7 @@ public class WebServiceDef { return path; } - public WSInterface newInstance() throws InstantiationException, IllegalAccessException { - return intf.newInstance(); + public WSInterface newInstance() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { + return intf.getDeclaredConstructor().newInstance(); } } diff --git a/src/zutil/osal/app/ffmpeg/FFmpeg.java b/src/zutil/osal/app/ffmpeg/FFmpeg.java index fceff9f..cba1dd4 100644 --- a/src/zutil/osal/app/ffmpeg/FFmpeg.java +++ b/src/zutil/osal/app/ffmpeg/FFmpeg.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,12 +24,15 @@ package zutil.osal.app.ffmpeg; +import zutil.log.LogUtil; import zutil.osal.app.ffmpeg.FFmpegConstants.*; import zutil.osal.app.ffmpeg.FFmpegProgressManager.FFmpegProgressListener; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.logging.Logger; /** * Class for building a ffmpeg commandline for execution @@ -37,6 +40,8 @@ import java.util.List; * @see FFmpeg Commandline Documentation */ public class FFmpeg { + private Logger logger = LogUtil.getLogger(); + private FFmpegLogLevel logLevel; private boolean overwriteOutput = false; private List inputs = new ArrayList<>(); @@ -81,22 +86,28 @@ public class FFmpeg { } - public String buildCommand() { - StringBuilder command = new StringBuilder(); - command.append("ffmpeg"); + /** + * Will generate a parameter list that will be supplied to ffmpeg binary based on the Object configuration. + * + * @return a list of parameter that should be supplied to FFmpeg + */ + public List buildCommand() { + List command = new ArrayList<>(); // General inputs if (logLevel != null) { - command.append(" -loglevel ").append(logLevel.toString().toLowerCase()); + command.add("-loglevel"); + command.add(logLevel.toString().toLowerCase()); } if (progressManager != null) { - command.append(" -progress ").append(progressManager.getAddress()); + command.add("-progress"); + command.add(progressManager.getAddress()); } if (overwriteOutput) { - command.append(" -y"); + command.add("-y"); } // TODO: -stdin Enable interaction on standard input @@ -104,15 +115,35 @@ public class FFmpeg { // Inputs for (FFmpegInput input : inputs) { - command.append(" ").append(input.buildCommand()); + command.addAll(input.buildCommand()); } // Outputs for (FFmpegOutput output : outputs) { - command.append(" ").append(output.buildCommand()); + command.addAll(output.buildCommand()); } - return command.toString(); + return command; + } + + /** + * Will execute the ffmpeg binary with the configured parameters. + * Recommended to use {@see OSALBinaryManager} to select correct FFmpeg binary depending on OS. + * + * @param ffmpegPath The path to the FFmpeg binary. (OS dependent) + * @return a Process object containing the execution of FFmpeg. + */ + public Process execute(File ffmpegPath) throws IOException { + List cmd = new ArrayList<>(); + cmd.add(ffmpegPath.getAbsolutePath()); + cmd.addAll(buildCommand()); + + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.redirectErrorStream(true); + + logger.finest("Executing FFmpeg: " + String.join(" ", cmd)); + + return pb.start(); } } diff --git a/src/zutil/osal/app/ffmpeg/FFmpegInput.java b/src/zutil/osal/app/ffmpeg/FFmpegInput.java index 5fcf597..833d3eb 100644 --- a/src/zutil/osal/app/ffmpeg/FFmpegInput.java +++ b/src/zutil/osal/app/ffmpeg/FFmpegInput.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,8 +24,6 @@ package zutil.osal.app.ffmpeg; -import zutil.StringUtil; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -88,6 +86,7 @@ public class FFmpegInput { /** * Add additional args that may not be supported by the API, these values will be inserted to the command line as is. + * Each argument must be a separate String in the list. * * @param args a list of additional commands */ @@ -102,7 +101,7 @@ public class FFmpegInput { /** * Enable or Blocks audio from input file. (enabled by default) * - * @param enabled Set to false to disable audio + * @param enabled Set too false to disable audio */ public void setAudioEnabled(boolean enabled) { this.audioEnabled = enabled; @@ -115,7 +114,7 @@ public class FFmpegInput { /** * Enable or Blocks subtitles from input file. (enabled by default) * - * @param enabled Set to false to disable subtitles + * @param enabled Set too false to disable subtitles */ public void setSubtitleEnabled(boolean enabled) { this.subtitleEnabled = enabled; @@ -125,36 +124,46 @@ public class FFmpegInput { // Command Generation // ---------------------------------------------------- - protected String buildCommand() { - StringBuilder command = new StringBuilder(); + protected List buildCommand() { + List command = new ArrayList<>(); // ---------------------------------------------------- // General Options // ---------------------------------------------------- - if (positionStart != null) - command.append(" -ss ").append(positionStart); - if (positionEnd != null) - command.append(" -to ").append(positionEnd); - if (duration != null) - command.append(" -t ").append(duration); + if (positionStart != null) { + command.add("-ss"); + command.add(String.valueOf(positionStart)); + } + if (positionEnd != null) { + command.add("-to"); + command.add(String.valueOf(positionEnd)); + } + if (duration != null) { + command.add("-t"); + command.add(String.valueOf(duration)); + } // ---------------------------------------------------- // Audio Options // ---------------------------------------------------- - if (!audioEnabled) - command.append(" -an"); + if (!audioEnabled) { + command.add("-an"); + } // ---------------------------------------------------- // Subtitle Options // ---------------------------------------------------- - if (!subtitleEnabled) - command.append(" -sn"); + if (!subtitleEnabled) { + command.add("-sn"); + } - command.append(StringUtil.join(" ", additionalArgs)); - command.append(" -i \"").append(input).append("\""); - return command.toString().trim(); + command.addAll(additionalArgs); + + command.add("-i"); + command.add(input); + return command; } } \ No newline at end of file diff --git a/src/zutil/osal/app/ffmpeg/FFmpegOutput.java b/src/zutil/osal/app/ffmpeg/FFmpegOutput.java index 5ac997f..7132ccd 100644 --- a/src/zutil/osal/app/ffmpeg/FFmpegOutput.java +++ b/src/zutil/osal/app/ffmpeg/FFmpegOutput.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,7 +24,6 @@ package zutil.osal.app.ffmpeg; -import zutil.StringUtil; import zutil.osal.app.ffmpeg.FFmpegConstants.FFmpegAudioCodec; import zutil.osal.app.ffmpeg.FFmpegConstants.FFmpegSubtitleCodec; import zutil.osal.app.ffmpeg.FFmpegConstants.FFmpegVideoCodec; @@ -126,6 +125,7 @@ public class FFmpegOutput { /** * Add additional args that may not be supported by the API, these values will be inserted to the command line as is. + * Each argument must be a separate String in the list. * * @param args a list of FFmpeg arguments */ @@ -282,7 +282,7 @@ public class FFmpegOutput { /** * Enable or Disables subtitles in output file. (enabled by default) * - * @param enabled Set to false to disable subtitles + * @param enabled Set too false to disable subtitles */ public void setSubtitleEnabled(boolean enabled) { this.subtitleEnabled = enabled; @@ -292,70 +292,104 @@ public class FFmpegOutput { // Command Generation // ---------------------------------------------------- - protected String buildCommand() { - StringBuilder command = new StringBuilder(); + protected List buildCommand() { + List command = new ArrayList<>(); // ---------------------------------------------------- // General Options // ---------------------------------------------------- - if (positionStart != null) - command.append(" -ss ").append(positionStart); - if (positionEnd != null) - command.append(" -to ").append(positionEnd); - if (duration != null) - command.append(" -t ").append(duration); - if (fileSize != null) - command.append(" -fs ").append(fileSize); + if (positionStart != null) { + command.add("-ss"); + command.add(String.valueOf(positionStart)); + } + if (positionEnd != null) { + command.add("-to"); + command.add(String.valueOf(positionEnd)); + } + if (duration != null) { + command.add("-t"); + command.add(String.valueOf(duration)); + } + if (fileSize != null) { + command.add("-fs"); + command.add(String.valueOf(fileSize)); + } - if (encodingPass != null) - command.append(" -pass ").append(encodingPass); + if (encodingPass != null) { + command.add("-pass"); + command.add(String.valueOf(encodingPass)); + } // ---------------------------------------------------- // Video Options // ---------------------------------------------------- - if (videoCodec != null) - command.append(" -codec:v ").append(videoCodec); - if (videoFrameRate != null) - command.append(" -frames ").append(videoFrameRate); - if (videoWidth != null && videoHeight != null) - command.append(" -filter:v scale=").append(videoWidth).append(':').append(videoHeight); - if (videoBitRate != null) - command.append(" -b:v ").append(videoBitRate); - if (videoQuality != null) - command.append(" -qscale:v ").append(videoQuality); + if (videoCodec != null) { + command.add("-codec:v"); + command.add(videoCodec); + } + if (videoFrameRate != null) { + command.add("-frames"); + command.add(String.valueOf(videoFrameRate)); + } + if (videoWidth != null && videoHeight != null) { + command.add("-filter:v"); + command.add("scale=" + videoWidth + ":" + videoHeight); + } + if (videoBitRate != null) { + command.add("-b:v"); + command.add(String.valueOf(videoBitRate)); + } + if (videoQuality != null) { + command.add("-qscale:v"); + command.add(String.valueOf(videoQuality)); + } // ---------------------------------------------------- // Audio Options // ---------------------------------------------------- - if (audioCodec != null) - command.append(" -codec:a ").append(audioCodec); - if (audioSampleRate != null) - command.append(" -ar ").append(audioSampleRate); - if (audioChannels != null) - command.append(" -ac ").append(audioChannels); - if (audioBitRate != null) - command.append(" -b:a ").append(audioBitRate); - if (audioQuality != null) - command.append(" -qscale:a ").append(audioQuality); + if (audioCodec != null) { + command.add("-codec:a"); + command.add(audioCodec); + } + if (audioSampleRate != null) { + command.add("-ar"); + command.add(String.valueOf(audioSampleRate)); + } + if (audioChannels != null) { + command.add("-ac"); + command.add(String.valueOf(audioChannels)); + } + if (audioBitRate != null) { + command.add("-b:a"); + command.add(String.valueOf(audioBitRate)); + } + if (audioQuality != null) { + command.add("-qscale:a"); + command.add(String.valueOf(audioQuality)); + } - if (!audioEnabled) - command.append(" -an"); + if (!audioEnabled) { + command.add("-an"); + } // ---------------------------------------------------- // Subtitle Options // ---------------------------------------------------- - if (subtitleCodec != null) - command.append(" -codec:s ").append(subtitleCodec); + if (subtitleCodec != null) { + command.add("-codec:s"); + command.add(subtitleCodec); + } - if (!subtitleEnabled) - command.append(" -sn"); + if (!subtitleEnabled) { + command.add("-sn"); + } - command.append(StringUtil.join(" ", additionalArgs)); - command.append(" \"").append(output).append("\""); - return command.toString().trim(); + command.addAll(additionalArgs); + command.add(output); + return command; } } \ No newline at end of file diff --git a/src/zutil/plugin/PluginData.java b/src/zutil/plugin/PluginData.java index 7f0a297..d6abc55 100755 --- a/src/zutil/plugin/PluginData.java +++ b/src/zutil/plugin/PluginData.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2020 Ziver Koc + * Copyright (c) 2020-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -152,7 +152,7 @@ public class PluginData { private T getObject(Class objClass) { try { if (!objectMap.containsKey(objClass)) - objectMap.put(objClass, objClass.newInstance()); + objectMap.put(objClass, objClass.getDeclaredConstructor().newInstance()); return (T) objectMap.get(objClass); } catch (Exception e) { log.log(Level.WARNING, "Unable to instantiate plugin class: " + objClass, e); diff --git a/test/zutil/osal/app/ffmpeg/FFmpegInputTest.java b/test/zutil/osal/app/ffmpeg/FFmpegInputTest.java index 7bf4d9c..b4e30fe 100644 --- a/test/zutil/osal/app/ffmpeg/FFmpegInputTest.java +++ b/test/zutil/osal/app/ffmpeg/FFmpegInputTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,6 +26,8 @@ package zutil.osal.app.ffmpeg; import org.junit.Test; +import java.util.Arrays; + import static org.junit.Assert.*; public class FFmpegInputTest { @@ -34,7 +36,7 @@ public class FFmpegInputTest { public void onlyInput() { FFmpegInput ffmpegInput = new FFmpegInput("iTest.mp4"); - assertEquals("-i \"iTest.mp4\"", ffmpegInput.buildCommand()); + assertEquals(Arrays.asList("-i", "iTest.mp4"), ffmpegInput.buildCommand()); } @Test @@ -48,9 +50,10 @@ public class FFmpegInputTest { ffmpegInput.setSubtitleEnabled(false); - assertEquals("-ss 9.1 -to 20.1 -t 10.1" + - " -an" + - " -sn" + - " -i \"iTest.mp4\"", ffmpegInput.buildCommand()); + assertEquals(Arrays.asList("-ss", "9.1", "-to", "20.1", "-t", "10.1", + "-an", + "-sn", + "-i", "iTest.mp4"), + ffmpegInput.buildCommand()); } } \ No newline at end of file diff --git a/test/zutil/osal/app/ffmpeg/FFmpegOutputTest.java b/test/zutil/osal/app/ffmpeg/FFmpegOutputTest.java index 5c35324..033ba13 100644 --- a/test/zutil/osal/app/ffmpeg/FFmpegOutputTest.java +++ b/test/zutil/osal/app/ffmpeg/FFmpegOutputTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,6 +26,8 @@ package zutil.osal.app.ffmpeg; import org.junit.Test; +import java.util.Arrays; + import static org.junit.Assert.*; public class FFmpegOutputTest { @@ -34,7 +36,7 @@ public class FFmpegOutputTest { public void onlyOutput() { FFmpegOutput ffmpegOutput = new FFmpegOutput("oTest.mp4"); - assertEquals("\"oTest.mp4\"", ffmpegOutput.buildCommand()); + assertEquals(Arrays.asList("oTest.mp4"), ffmpegOutput.buildCommand()); } @@ -63,11 +65,11 @@ public class FFmpegOutputTest { ffmpegOutput.setSubtitleCodec(FFmpegConstants.FFmpegSubtitleCodec.subrip); ffmpegOutput.setSubtitleEnabled(false); - assertEquals("-ss 9.1 -to 20.1 -t 10.1 -fs 1000 -pass 2" + - " -codec:v libx264 -frames 29.8 -filter:v scale=320:240 -b:v 300000 -qscale:v 22" + - " -codec:a libmp3lame -ar 48000 -ac 6 -b:a 360000 -qscale:a 23 -an" + - " -codec:s subrip -sn" + - " \"oTest.mp4\"", + assertEquals(Arrays.asList("-ss", "9.1", "-to", "20.1", "-t", "10.1", "-fs", "1000", "-pass", "2", + "-codec:v", "libx264", "-frames", "29.8", "-filter:v", "scale=320:240", "-b:v", "300000", "-qscale:v", "22", + "-codec:a", "libmp3lame", "-ar", "48000", "-ac", "6", "-b:a", "360000", "-qscale:a", "23", "-an", + "-codec:s", "subrip", "-sn", + "oTest.mp4"), ffmpegOutput.buildCommand()); } diff --git a/test/zutil/osal/app/ffmpeg/FFmpegTest.java b/test/zutil/osal/app/ffmpeg/FFmpegTest.java index 5829bfc..8cd4e28 100644 --- a/test/zutil/osal/app/ffmpeg/FFmpegTest.java +++ b/test/zutil/osal/app/ffmpeg/FFmpegTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2021 Ziver Koc + * Copyright (c) 2021-2025 Ziver Koc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,6 +27,8 @@ package zutil.osal.app.ffmpeg; import org.junit.Test; import zutil.osal.app.ffmpeg.FFmpegConstants.*; +import java.util.Arrays; + import static org.junit.Assert.*; @@ -38,7 +40,7 @@ public class FFmpegTest { ffmpeg.addInput(new FFmpegInput("iTest.mp4")); ffmpeg.addOutput(new FFmpegOutput("oTest.mp4")); - assertEquals("ffmpeg -i \"iTest.mp4\" \"oTest.mp4\"", ffmpeg.buildCommand()); + assertEquals(Arrays.asList("-i", "iTest.mp4", "oTest.mp4"), ffmpeg.buildCommand()); } @Test @@ -48,7 +50,7 @@ public class FFmpegTest { ffmpeg.addInput(new FFmpegInput("iTest.mp4")); ffmpeg.addOutput(new FFmpegOutput("oTest.mp4")); - assertEquals("ffmpeg -loglevel error -i \"iTest.mp4\" \"oTest.mp4\"", ffmpeg.buildCommand()); + assertEquals(Arrays.asList("-loglevel", "error", "-i", "iTest.mp4", "oTest.mp4"), ffmpeg.buildCommand()); } @Test @@ -58,6 +60,6 @@ public class FFmpegTest { ffmpeg.addInput(new FFmpegInput("iTest.mp4")); ffmpeg.addOutput(new FFmpegOutput("oTest.mp4")); - assertEquals("ffmpeg -y -i \"iTest.mp4\" \"oTest.mp4\"", ffmpeg.buildCommand()); + assertEquals(Arrays.asList("-y", "-i", "iTest.mp4", "oTest.mp4"), ffmpeg.buildCommand()); } } \ No newline at end of file