PSFAudioExtractor/AT3merge.java

103 lines
2.7 KiB
Java
Raw Permalink Normal View History

2024-11-20 14:44:25 -08:00
package goblincave.gitea.nes;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.io.FilenameUtils;
import io.github.jacksonbrienen.jwfd.JWindowsFileDialog;
public class AT3merge {
public static void main(String[] args) throws IOException {
String[] selection = JWindowsFileDialog.showMultiDialog(null, "Select AT3 files to merge");
boolean[] merged = new boolean[selection.length];
// identify AT3 part files: name_01.at3, name_02.at3
for(int a = 0; a < selection.length; a++) {
if(merged[a])
continue;
File fileA = new File(selection[a]);
String filenameA = FilenameUtils.removeExtension(fileA.getName());
String partnameA = filenameA.substring(filenameA.length() - 3);
filenameA = filenameA.substring(0, filenameA.length() - 3);
if(partnameA.equals("_01")) {
for(int b = 0; b < selection.length; b++) {
if(merged[b] || selection[a].equals(selection[b]))
continue;
File fileB = new File(selection[b]);
String filenameB = FilenameUtils.removeExtension(fileB.getName());
String partnameB = filenameB.substring(filenameB.length() - 3);
filenameB = filenameB.substring(0, filenameB.length() - 3);
if(filenameA.equals(filenameB) && partnameB.equals("_02")) {
// MERGE parts into one file
System.out.println("Merging " + fileA.getName() + " and " + fileB.getName());
merge(fileA, fileB);
merged[b] = true;
break;
}
}
// REMOVE suffix from processed file
System.out.println("Renaming to " + filenameA + ".at3");
if(fileA.renameTo(new File(fileA.getParent(), filenameA + ".at3")));
else System.out.println("Failed to rename " + fileA);
merged[a] = true;
} else continue;
}
// merge matching parts into a single file
// remove part suffixes from files
}
/**
* Appends fileB to the end of fileA. FileB is then deleted.
*
* @param fileA
* @param fileB
* @throws IOException
*/
private static void merge(File fileA, File fileB) throws IOException {
try (
FileInputStream input = new FileInputStream(fileB);
FileOutputStream output = new FileOutputStream(fileA, true);
) {
// append fileB
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
// delete fileB
if(fileB.delete());
else System.out.println("Failed to delete " + fileB);
}
}