Rikux3
4 years ago
4 changed files with 219 additions and 175 deletions
@ -0,0 +1,174 @@ |
|||
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); |
|||
|
|||
if (audioFormat == ".adx") |
|||
{ |
|||
//ffmpeg can not handle .adx from 0.2 for whatever reason
|
|||
//need vgmstream to format that to wav
|
|||
if (!Directory.Exists("vgmstream")) |
|||
{ |
|||
Console.WriteLine("ERROR: vgmstream folder not found!"); |
|||
return; |
|||
} |
|||
|
|||
Console.WriteLine("adx audio detected, convert to wav..."); |
|||
Helpers.ExecuteProcess("vgmstream/test.exe", $"\"{Path.ChangeExtension(usmStream.FilePath, usmStream.FinalAudioExtension)}\" -o \"{Path.ChangeExtension(usmStream.FilePath, "wav")}\""); |
|||
|
|||
usmStream.FinalAudioExtension = ".wav"; |
|||
} |
|||
|
|||
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")); |
|||
} |
|||
} |
|||
} |
|||
|
|||
[Command(Description = "Setup ffmpeg and vgmstream needed for conversion")] |
|||
public class GetDependenciesCommand |
|||
{ |
|||
protected int OnExecute(CommandLineApplication app) |
|||
{ |
|||
DepsConfig conf = JsonConvert.DeserializeObject<DepsConfig>(File.ReadAllText("deps.json")); |
|||
WebClient client = new WebClient(); |
|||
|
|||
Console.WriteLine($"Downloading ffmpeg from {conf.FFmpeg}"); |
|||
client.DownloadFile(conf.FFmpeg, "ffmpeg.zip"); |
|||
|
|||
Console.WriteLine($"Extracting ffmpeg..."); |
|||
using (ZipArchive archive = ZipFile.OpenRead("ffmpeg.zip")) |
|||
{ |
|||
var ent = archive.Entries.FirstOrDefault(x => x.Name == "ffmpeg.exe"); |
|||
if (ent != null) |
|||
{ |
|||
ent.ExtractToFile("ffmpeg.exe", true); |
|||
} |
|||
} |
|||
File.Delete("ffmpeg.zip"); |
|||
|
|||
Console.WriteLine($"Downloading vgmstream from {conf.Vgmstream}"); |
|||
client.DownloadFile(conf.Vgmstream, "vgmstream.zip"); |
|||
|
|||
Console.WriteLine("Extracting vgmstream..."); |
|||
ZipFile.ExtractToDirectory("vgmstream.zip", "vgmstream", true); |
|||
File.Delete("vgmstream.zip"); |
|||
|
|||
return 0; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
namespace UsmToolkit |
|||
{ |
|||
public class JoinConfig |
|||
{ |
|||
public string VideoParameter { get; set; } |
|||
public string AudioParameter { get; set; } |
|||
public string OutputFormat { get; set; } |
|||
} |
|||
|
|||
public class DepsConfig |
|||
{ |
|||
public string Vgmstream { get; set; } |
|||
public string FFmpeg { get; set; } |
|||
} |
|||
} |
Loading…
Reference in new issue