You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

125 lines
4.1 KiB

using McMaster.Extensions.CommandLineUtils;
using Newtonsoft.Json;
using System;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using VGMToolbox.format;
namespace UsmToolkit
{
[Command(Description = "Extract audio and video")]
public class ExtractCommand
{
[Required]
[FileOrDirectoryExists]
[Argument(0, Description = "File or folder containing usm files")]
public string InputPath { get; set; }
protected int OnExecute(CommandLineApplication app)
{
FileAttributes attr = File.GetAttributes(InputPath);
if (attr.HasFlag(FileAttributes.Directory))
{
foreach (var file in Directory.GetFiles(InputPath, "*.usm"))
Process(file);
}
else
Process(InputPath);
return 0;
}
private void Process(string fileName)
{
Console.WriteLine($"File: {fileName}");
var usmStream = new CriUsmStream(fileName);
Console.WriteLine("Demuxing...");
usmStream.DemultiplexStreams(new MpegStream.DemuxOptionsStruct()
{
AddHeader = false,
AddPlaybackHacks = false,
ExtractAudio = true,
ExtractVideo = true,
SplitAudioStreams = false
});
}
}
[Command(Description = "Convert according to the parameters in config.json")]
public class ConvertCommand
{
[Required]
[FileOrDirectoryExists]
[Argument(0, Description = "File or folder containing usm files")]
public string InputPath { get; set; }
[Option(CommandOptionType.SingleValue, Description = "Specify output directory", ShortName = "o", LongName = "output-dir")]
public string OutputDir { get; set; }
[Option(CommandOptionType.NoValue, Description = "Remove temporary m2v and audio after converting", ShortName = "c", LongName = "clean")]
public bool CleanTempFiles { get; set; }
protected int OnExecute(CommandLineApplication app)
{
FileAttributes attr = File.GetAttributes(InputPath);
if (attr.HasFlag(FileAttributes.Directory))
{
foreach (var file in Directory.GetFiles(InputPath, "*.usm"))
Process(file);
}
else
Process(InputPath);
return 0;
}
private void Process(string fileName)
{
Console.WriteLine($"File: {fileName}");
var usmStream = new CriUsmStream(fileName);
Console.WriteLine("Demuxing...");
usmStream.DemultiplexStreams(new MpegStream.DemuxOptionsStruct()
{
AddHeader = false,
AddPlaybackHacks = false,
ExtractAudio = true,
ExtractVideo = true,
SplitAudioStreams = false
});
if (!string.IsNullOrEmpty(OutputDir) && !Directory.Exists(OutputDir))
Directory.CreateDirectory(OutputDir);
JoinOutputFile(usmStream);
}
private void JoinOutputFile(CriUsmStream usmStream)
{
if (!File.Exists("config.json"))
{
Console.WriteLine("ERROR: config.json not found!");
return;
}
var audioFormat = usmStream.FinalAudioExtension;
var pureFileName = Path.GetFileNameWithoutExtension(usmStream.FilePath);
Helpers.ExecuteProcess("ffmpeg", Helpers.CreateFFmpegParameters(usmStream, pureFileName, OutputDir));
if (CleanTempFiles)
{
Console.WriteLine($"Cleaning up temporary files from {pureFileName}");
File.Delete(Path.ChangeExtension(usmStream.FilePath, "wav"));
File.Delete(Path.ChangeExtension(usmStream.FilePath, "adx"));
File.Delete(Path.ChangeExtension(usmStream.FilePath, "hca"));
File.Delete(Path.ChangeExtension(usmStream.FilePath, "m2v"));
}
}
}
}