Пример #1
0
        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();
        }
Пример #2
0
        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);
                }
            }
        }