public static void List(string inputHed) { using var hedStream = File.OpenRead(inputHed); var entries = Hed.Read(hedStream); foreach (var entry in entries) { var hash = Helpers.ToString(entry.MD5); if (!Names.TryGetValue(hash, out var fileName)) { fileName = $"{hash}.dat"; } Console.WriteLine(fileName); } }
public static void Extract(string inputHed, string output, bool doNotExtractAgain = false) { var outputDir = output ?? Path.GetFileNameWithoutExtension(inputHed); using var hedStream = File.OpenRead(inputHed); using var img = File.OpenRead(Path.ChangeExtension(inputHed, "pkg")); foreach (var entry in Hed.Read(hedStream)) { var hash = Helpers.ToString(entry.MD5); if (!Names.TryGetValue(hash, out var fileName)) { fileName = $"{hash}.dat"; } var outputFileName = Path.Combine(outputDir, ORIGINAL_FILES_FOLDER_NAME, fileName); if (doNotExtractAgain && File.Exists(outputFileName)) { continue; } Console.WriteLine(outputFileName); CreateDirectoryForFile(outputFileName); var hdAsset = new EgsHdAsset(img.SetPosition(entry.Offset)); File.Create(outputFileName).Using(stream => stream.Write(hdAsset.OriginalData)); outputFileName = Path.Combine(outputDir, REMASTERED_FILES_FOLDER_NAME, fileName); foreach (var asset in hdAsset.Assets) { var outputFileNameRemastered = Path.Combine(GetHDAssetFolder(outputFileName), asset); Console.WriteLine(outputFileNameRemastered); CreateDirectoryForFile(outputFileNameRemastered); var assetData = hdAsset.RemasteredAssetsDecompressedData[asset]; File.Create(outputFileNameRemastered).Using(stream => stream.Write(assetData)); } } }
public static void Patch(string pkgFile, string inputFolder, string outputFolder) { // Get files to inject in the PKG to detect if we want to include new files or not // We only get the original files as for me it doesn't make sense to include // new "remastered" asset since it must be linked to an original one var patchFiles = Helpers.GetAllFiles(Path.Combine(inputFolder, ORIGINAL_FILES_FOLDER_NAME)).ToList(); var filenames = new List <string>(); var remasteredFilesFolder = Path.Combine(inputFolder, REMASTERED_FILES_FOLDER_NAME); var outputDir = outputFolder ?? Path.GetFileNameWithoutExtension(pkgFile); var hedFile = Path.ChangeExtension(pkgFile, "hed"); using var hedStream = File.OpenRead(hedFile); using var pkgStream = File.OpenRead(pkgFile); var hedHeaders = Hed.Read(hedStream).ToList(); if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } using var patchedHedStream = File.Create(Path.Combine(outputDir, Path.GetFileName(hedFile))); using var patchedPkgStream = File.Create(Path.Combine(outputDir, Path.GetFileName(pkgFile))); foreach (var hedHeader in hedHeaders) { var hash = Helpers.ToString(hedHeader.MD5); // We don't know this filename, we ignore it if (!Names.TryGetValue(hash, out var filename)) { throw new Exception("Unknown filename!"); } if (patchFiles.Contains(filename)) { patchFiles.Remove(filename); } filenames.Add(filename); var asset = new EgsHdAsset(pkgStream.SetPosition(hedHeader.Offset)); if (hedHeader.DataLength > 0) { ReplaceFile(inputFolder, filename, patchedHedStream, patchedPkgStream, asset, hedHeader); } else { Console.WriteLine($"Skipped: {filename}"); } } // Add all files that are not in the original HED file and inject them in the PKG stream too foreach (var filename in patchFiles) { AddFile(inputFolder, filename, patchedHedStream, patchedPkgStream); Console.WriteLine($"Added a new file: {filename}"); } }