Adds a new type of anime converter and stuff
Some checks failed
KnarCraft/FFmpegConvert/pipeline/head There was a failure building this commit

Adds a new type of anime converter that retains all streams, but converts the video to hevc, and re-orders the streams
Adds support for several types of encoding hardware acceleration that are automatically disabled if not available on the system.
Adds automatic hardware decoding acceleration.
Automatically removes empty files if ffmpeg fails.
This commit is contained in:
2024-04-17 04:39:42 +02:00
parent 461c7552b3
commit f0e75eb440
24 changed files with 647 additions and 193 deletions

View File

@@ -0,0 +1,88 @@
package net.knarcraft.ffmpegconverter.handler;
import net.knarcraft.ffmpegconverter.utility.OutputUtil;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Configurations;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* A handler for keeping track of which hardware acceleration methods are available on the current system
*/
public record AvailableHardwareEncoderHandler(@NotNull List<String> availableHardwareEncodings) {
private static final File configFolder = new File("conf").getAbsoluteFile();
private static final Configurations configurations = new Configurations();
/**
* Gets all hardware encodings
*
* @return <p>All hardware encodings</p>
*/
@Override
@NotNull
public List<String> availableHardwareEncodings() {
return new ArrayList<>(this.availableHardwareEncodings);
}
/**
* Removes the specified hardware encoding
*
* @param encoding <p>The hardware encoding to remove</p>
*/
public void removeHardwareEncoding(@NotNull String encoding) {
this.availableHardwareEncodings.remove(encoding);
}
/**
* Saves settings fro this available hardware encoder handler
*
* @throws ConfigurationException <p>If the configuration file cannot be saved</p>
*/
public void save() throws ConfigurationException {
OutputUtil.printDebug("Preparing to save config");
if (!configFolder.exists() && !configFolder.mkdir()) {
throw new RuntimeException("Unable to create config folder. Make sure to run this .jar file from a " +
"writable directory!");
}
File settingsFile = new File(configFolder, "config.properties");
try {
if (!settingsFile.exists() && !settingsFile.createNewFile()) {
OutputUtil.println("Failed to create configuration file.");
}
} catch (IOException e) {
OutputUtil.println("Failed to create configuration file.");
}
FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
configurations.propertiesBuilder(settingsFile);
PropertiesConfiguration config = builder.getConfiguration();
config.setProperty("encoder.hardware", this.availableHardwareEncodings);
builder.save();
OutputUtil.printDebug("Saved available hardware encoder handler");
}
/**
* Loads saved settings for an available hardware encoder handler
*
* @return <p>The loaded available hardware encoder handler, or a new one if no data has been saved</p>
* @throws ConfigurationException <p>If the configuration file cannot be loaded</p>
*/
public static AvailableHardwareEncoderHandler load() throws ConfigurationException {
File settingsFile = new File(configFolder, "config.properties");
if (!settingsFile.exists()) {
return new AvailableHardwareEncoderHandler(new ArrayList<>());
}
Configuration configuration = configurations.properties(settingsFile);
List<String> getEncodings = configuration.getList(String.class, "encoder.hardware");
return new AvailableHardwareEncoderHandler(getEncodings);
}
}