private void WriteSubtitlesToFile(string outputPath) { string directoryName = Path.GetDirectoryName(outputPath); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } using (StreamWriter sw = new StreamWriter(File.Open(outputPath, FileMode.Append, FileAccess.Write), Encoding.UTF8)) { sw.WriteLine($"; Changes from {DateTime.Now:yyyy-MM-dd-HHmmss}"); foreach (KeyValuePair <string, string> pair in CapturedSubtitles) { sw.WriteLine($"{pair.Key}\t{pair.Value}".Trim()); } } CapturedSubtitles.Clear(); }
private void DumpStrings() { foreach (string arcFile in files) { ArcFileSystem fileSystem = new ArcFileSystem(); if (!fileSystem.LoadArc(arcFile)) { Program.Logger.Error($"Failed to load {arcFile}"); continue; } Program.Logger.Info($"Opened {fileSystem}"); bool specifiedFileName = false; int fileCount = 0; int maxFiles = fileSystem.Files.Count(); foreach (ArcFileEntry file in fileSystem.Files) { fileCount++; Program.Logger.Info($"Processing file {fileCount}/{maxFiles} : {file.Name}"); if (Path.GetExtension(file.Name) != Program.SCRIPT_EXTENSION) { Program.Logger.Info("File is not a script. Skipping..."); continue; } bool specifiedScriptName = false; FilePointerBase pointer = file.Pointer; byte[] data = pointer.Compressed ? pointer.Decompress().Data : pointer.Data; using (StreamReader reader = new StreamReader(new MemoryStream(data), Encoding.GetEncoding(932))) { string line; while ((line = reader.ReadLine()) != null) { line = line.Trim(); if (!line.Contains(Program.VOICE_TAG)) { continue; } Match voiceMatch = Program.VoiceRegex.Match(line); if (!voiceMatch.Success) { continue; } string subFileName = voiceMatch.Groups["voice"].Value.Trim(); if (string.IsNullOrEmpty(subFileName)) { continue; } string transcript = reader.ReadLine(); if (transcript == null) { continue; } transcript = transcript.Replace(";", "").Trim(); if (string.IsNullOrEmpty(transcript) || transcript.StartsWith("@") || transcript.StartsWith("*L")) { continue; } lock (Program.ExistingSubtitles) { if (Program.ExistingSubtitles.TryGetValue(subFileName, out string existingSubtitle) && (transcript.StartsWith("//") || existingSubtitle.Equals(transcript, StringComparison.InvariantCulture))) { continue; } } lock (Program.FoundSubtitles) { if (Program.FoundSubtitles.TryGetValue(subFileName, out string found) && (transcript.StartsWith("//") || found.Equals(transcript, StringComparison.InvariantCulture))) { continue; } Program.FoundSubtitles[subFileName] = transcript; } if (!specifiedFileName) { specifiedFileName = true; CapturedSubtitles.Add($"; {fileSystem.Name}", string.Empty); } if (!specifiedScriptName) { specifiedScriptName = true; CapturedSubtitles.Add($"; From {fileSystem.Name}\\{file.Name}", string.Empty); } CapturedSubtitles[subFileName] = transcript; } } if (Program.MergeType == MergeType.None && CapturedSubtitles.Count != 0) { string filePath = file.FullName.Substring(fileSystem.Root.Name.Length + 1); filePath = Path.Combine(Path.GetFileNameWithoutExtension(fileSystem.Name), filePath.Remove(filePath.Length - 3, 3) + ".txt"); string outputPath = Path.Combine(Program.OUTPUT_DIR, filePath); WriteSubtitlesToFile(outputPath); } } if (Program.MergeType == MergeType.PerArc && CapturedSubtitles.Count != 0) { string outputPath = Path.Combine(Program.OUTPUT_DIR, Path.GetFileNameWithoutExtension(fileSystem.Name) + ".txt"); WriteSubtitlesToFile(outputPath); } } }