private static void InitializeFixCommonErrorsLine(Nikse.SubtitleEdit.Forms.FixCommonErrors target, string line) { var subtitle = new Subtitle(); subtitle.Paragraphs.Add(new Paragraph(line, 100, 10000)); target.Initialize(subtitle, new Nikse.SubtitleEdit.Logic.SubtitleFormats.SubRip(), System.Text.Encoding.UTF8); }
private void ButtonSyncClick(object sender, EventArgs e) { double startPos = MediaPlayerStart.CurrentPosition; double endPos = MediaPlayerEnd.CurrentPosition; if (!(endPos > startPos)) { MessageBox.Show(_language.StartSceneMustComeBeforeEndScene, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } SetSyncFactorLabel(); double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / TimeCode.BaseUnit; double subDiff = subEnd - subStart; double realDiff = endPos - startPos; // speed factor double factor = realDiff / subDiff; // adjust to starting position double adjust = startPos - subStart * factor; foreach (Paragraph p in _paragraphs) { p.Adjust(factor, adjust); } // fix overlapping time codes using (var formFix = new FixCommonErrors()) { var tmpSubtitle = new Subtitle { WasLoadedWithFrameNumbers = _originalSubtitle.WasLoadedWithFrameNumbers }; foreach (Paragraph p in _paragraphs) { tmpSubtitle.Paragraphs.Add(new Paragraph(p)); } formFix.Initialize(tmpSubtitle, tmpSubtitle.OriginalFormat, System.Text.Encoding.UTF8); formFix.FixOverlappingDisplayTimes(); _paragraphs.Clear(); foreach (Paragraph p in formFix.FixedSubtitle.Paragraphs) { _paragraphs.Add(new Paragraph(p)); } } // update comboboxes int startSaveIdx = comboBoxStartTexts.SelectedIndex; int endSaveIdx = comboBoxEndTexts.SelectedIndex; FillStartAndEndTexts(); comboBoxStartTexts.SelectedIndex = startSaveIdx; comboBoxEndTexts.SelectedIndex = endSaveIdx; labelSyncDone.Text = _language.SynchronizationDone; _timerHideSyncLabel.Start(); }
private void InitializeFixCommonErrorsLine(FixCommonErrors target, string line, string line2) { _subtitle = new Subtitle(); _subtitle.Paragraphs.Add(new Paragraph(line, 100, 10000)); _subtitle.Paragraphs.Add(new Paragraph(line2, 10001, 30000)); target.Initialize(_subtitle, new SubRip(), System.Text.Encoding.UTF8); }
private void FixCommonErrors(bool onlySelectedLines) { if (IsSubtitleLoaded) { ReloadFromSourceView(); SaveSubtitleListviewIndices(); using (var fixErrors = new FixCommonErrors()) { if (onlySelectedLines) { var selectedLines = new Subtitle { WasLoadedWithFrameNumbers = _subtitle.WasLoadedWithFrameNumbers }; foreach (int index in SubtitleListview1.SelectedIndices) selectedLines.Paragraphs.Add(_subtitle.Paragraphs[index]); fixErrors.Initialize(selectedLines, GetCurrentSubtitleFormat(), GetCurrentEncoding()); } else { fixErrors.Initialize(_subtitle, GetCurrentSubtitleFormat(), GetCurrentEncoding()); } if (fixErrors.ShowDialog(this) == DialogResult.OK) { MakeHistoryForUndo(_language.BeforeCommonErrorFixes); _subtitle.Renumber(); if (onlySelectedLines) { // we only update selected lines int i = 0; if (_networkSession != null) { var deletes = new List<int>(); _networkSession.TimerStop(); foreach (int index in SubtitleListview1.SelectedIndices) { var pOld = _subtitle.Paragraphs[index]; var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.ID); if (p == null) { deletes.Add(index); } else { _subtitle.Paragraphs[index] = p; SubtitleListview1.SetTimeAndText(index, p); } i++; } NetworkGetSendUpdates(deletes, 0, null); } else { for (int index = SubtitleListview1.SelectedIndices.Count - 1; index >= 0; index--) { var idx = SubtitleListview1.SelectedIndices[index]; var pOld = _subtitle.Paragraphs[idx]; var p = fixErrors.FixedSubtitle.GetParagraphOrDefaultById(pOld.ID); if (p == null) { _subtitle.Paragraphs.RemoveAt(idx); } else { _subtitle.Paragraphs[idx] = p; } i++; } } ShowStatus(_language.CommonErrorsFixedInSelectedLines); } else { _subtitle.Paragraphs.Clear(); foreach (var p in fixErrors.FixedSubtitle.Paragraphs) _subtitle.Paragraphs.Add(p); ShowStatus(_language.CommonErrorsFixed); } _subtitle.Renumber(); ShowSource(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); RestoreSubtitleListviewIndices(); } Configuration.Settings.CommonErrors.StartSize = fixErrors.Width + ";" + fixErrors.Height; Configuration.Settings.CommonErrors.StartPosition = fixErrors.Left + ";" + fixErrors.Top; } } else { DisplaySubtitleNotLoadedMessage(); } ShowInTaskbar = true; }
private void ButtonSyncClick(object sender, EventArgs e) { double startPos = MediaPlayerStart.CurrentPosition; double endPos = MediaPlayerEnd.CurrentPosition; if (endPos > startPos) { double subStart = _paragraphs[comboBoxStartTexts.SelectedIndex].StartTime.TotalMilliseconds / 1000.0; double subEnd = _paragraphs[comboBoxEndTexts.SelectedIndex].StartTime.TotalMilliseconds / 1000.0; double subDiff = subEnd - subStart; double realDiff = endPos - startPos; // speed factor double factor = realDiff / subDiff; // adjust to starting position double adjust = startPos - subStart * factor; foreach (Paragraph p in _paragraphs) { p.Adjust(factor, adjust); } // fix overlapping time codes var formFix = new FixCommonErrors(); var tmpSubtitle = new Subtitle { WasLoadedWithFrameNumbers = _originalSubtitle.WasLoadedWithFrameNumbers }; foreach (Paragraph p in _paragraphs) tmpSubtitle.Paragraphs.Add(new Paragraph(p)); formFix.Initialize(tmpSubtitle, tmpSubtitle.OriginalFormat, System.Text.Encoding.UTF8); formFix.FixOverlappingDisplayTimes(); _paragraphs.Clear(); foreach (Paragraph p in formFix.FixedSubtitle.Paragraphs) _paragraphs.Add(new Paragraph(p)); // update comboboxes int startSaveIdx = comboBoxStartTexts.SelectedIndex; int endSaveIdx = comboBoxEndTexts.SelectedIndex; FillStartAndEndTexts(); comboBoxStartTexts.SelectedIndex = startSaveIdx; comboBoxEndTexts.SelectedIndex = endSaveIdx; labelSyncDone.Text = _language.SynchronizationDone; timerHideSyncLabel.Start(); } else { MessageBox.Show(_language.StartSceneMustComeBeforeEndScene, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
void DoThreadWork(object sender, DoWorkEventArgs e) { ThreadDoWorkParameter p = (ThreadDoWorkParameter)e.Argument; if (p.FixCommonErrors) { try { var fixCommonErrors = new FixCommonErrors(); fixCommonErrors.RunBatch(p.Subtitle, p.Format, p.Encoding, Configuration.Settings.Tools.BatchConvertLanguage); p.Subtitle = fixCommonErrors.FixedSubtitle; fixCommonErrors = new FixCommonErrors(); fixCommonErrors.RunBatch(p.Subtitle, p.Format, p.Encoding, Configuration.Settings.Tools.BatchConvertLanguage); p.Subtitle = fixCommonErrors.FixedSubtitle; } catch (Exception exception) { p.Error = "FCE ERROR: " + exception.Message; } } if (p.MultipleReplaceActive) { try { var form = new MultipleReplace(); form.Initialize(p.Subtitle); p.Subtitle = form.FixedSubtitle; } catch (Exception exception) { p.Error = "MultipleReplace error: " + exception.Message; } } if (p.SplitLongLinesActive) { try { p.Subtitle = Logic.Forms.SplitLongLinesHelper.SplitLongLinesInSubtitle(p.Subtitle, Configuration.Settings.General.SubtitleLineMaximumLength * 2, Configuration.Settings.General.SubtitleLineMaximumLength); } catch (Exception exception) { p.Error = "AutoBalance error: " + exception.Message; } } if (p.AutoBalanceActive) { try { foreach (Paragraph paragraph in p.Subtitle.Paragraphs) paragraph.Text = Utilities.AutoBreakLine(paragraph.Text); } catch (Exception exception) { p.Error = "AutoBalance error: " + exception.Message; } } if (p.SetMinDisplayTimeBetweenSubtitles) { double minumumMillisecondsBetweenLines = Configuration.Settings.General.MininumMillisecondsBetweenLines; for (int i = 0; i < p.Subtitle.Paragraphs.Count - 1; i++) { Paragraph current = p.Subtitle.GetParagraphOrDefault(i); Paragraph next = p.Subtitle.GetParagraphOrDefault(i + 1); if (next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds < minumumMillisecondsBetweenLines) current.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - minumumMillisecondsBetweenLines; } } e.Result = p; }
private void buttonFixCommonErrorSettings_Click(object sender, EventArgs e) { var form = new FixCommonErrors(); form.RunBatchSettings(new Subtitle(), GetCurrentSubtitleFormat(), GetCurrentEncoding(), Configuration.Settings.Tools.BatchConvertLanguage); form.ShowDialog(this); Configuration.Settings.Tools.BatchConvertLanguage = form.Language; }
public void FixOcrErrorsViaDoNotFixToUpper() { using (var form = new FixCommonErrors()) { Configuration.Settings.Tools.OcrFixUseHardcodedRules = true; const string input = "i.e., your killer."; var ofe = new Nikse.SubtitleEdit.Logic.Ocr.OcrFixEngine("eng", "not there", form); var res = ofe.FixOcrErrors(input, 1, "Ends with comma,", false, Nikse.SubtitleEdit.Logic.Ocr.OcrFixEngine.AutoGuessLevel.Cautious); Assert.AreEqual(res, "i.e., your killer."); } }
private static void DoThreadWork(object sender, DoWorkEventArgs e) { var p = (ThreadDoWorkParameter)e.Argument; if (p.FixCommonErrors) { try { using (var fixCommonErrors = new FixCommonErrors()) { for (int i = 0; i < 3; i++) { fixCommonErrors.RunBatch(p.Subtitle, p.Format, p.Encoding, Configuration.Settings.Tools.BatchConvertLanguage); p.Subtitle = fixCommonErrors.FixedSubtitle; } } } catch (Exception exception) { p.Error = string.Format(Configuration.Settings.Language.BatchConvert.FixCommonErrorsErrorX, exception.Message); } } if (p.MultipleReplaceActive) { try { using (var form = new MultipleReplace()) { form.RunFromBatch(p.Subtitle); p.Subtitle = form.FixedSubtitle; p.Subtitle.RemoveParagraphsByIndices(form.DeleteIndices); } } catch (Exception exception) { p.Error = string.Format(Configuration.Settings.Language.BatchConvert.MultipleReplaceErrorX, exception.Message); } } if (p.SplitLongLinesActive) { try { p.Subtitle = SplitLongLinesHelper.SplitLongLinesInSubtitle(p.Subtitle, Configuration.Settings.General.SubtitleLineMaximumLength * 2, Configuration.Settings.General.SubtitleLineMaximumLength); } catch (Exception exception) { p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); } } if (p.AutoBalanceActive) { try { foreach (var paragraph in p.Subtitle.Paragraphs) paragraph.Text = Utilities.AutoBreakLine(paragraph.Text); } catch (Exception exception) { p.Error = string.Format(Configuration.Settings.Language.BatchConvert.AutoBalanceErrorX, exception.Message); } } if (p.SetMinDisplayTimeBetweenSubtitles) { double minumumMillisecondsBetweenLines = Configuration.Settings.General.MinimumMillisecondsBetweenLines; for (int i = 0; i < p.Subtitle.Paragraphs.Count - 1; i++) { Paragraph current = p.Subtitle.GetParagraphOrDefault(i); Paragraph next = p.Subtitle.GetParagraphOrDefault(i + 1); var gapsBetween = next.StartTime.TotalMilliseconds - current.EndTime.TotalMilliseconds; if (gapsBetween < minumumMillisecondsBetweenLines && current.Duration.TotalMilliseconds > minumumMillisecondsBetweenLines) { current.EndTime.TotalMilliseconds -= (minumumMillisecondsBetweenLines - gapsBetween); } } } // always re-number p.Subtitle.Renumber(); e.Result = p; }
private static void InitializeFixCommonErrorsLine(FixCommonErrors target, string line) { var subtitle = new Subtitle(); subtitle.Paragraphs.Add(new Paragraph(line, 100, 10000)); target.Initialize(subtitle, new SubRip(), System.Text.Encoding.UTF8); }
internal static bool BatchConvertSave(string toFormat, string offset, Encoding targetEncoding, string outputFolder, int count, ref int converted, ref int errors, IList<SubtitleFormat> formats, string fileName, Subtitle sub, SubtitleFormat format, bool overwrite, string pacCodePage, double? targetFrameRate, bool removeTextForHi, bool fixCommonErrors, bool redoCasing) { double oldFrameRate = Configuration.Settings.General.CurrentFrameRate; try { // adjust offset if (!string.IsNullOrEmpty(offset) && (offset.StartsWith("/offset:") || offset.StartsWith("offset:"))) { string[] parts = offset.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 5) { try { var ts = new TimeSpan(0, int.Parse(parts[1].TrimStart('-')), int.Parse(parts[2]), int.Parse(parts[3]), int.Parse(parts[4])); if (parts[1].StartsWith('-')) sub.AddTimeToAllParagraphs(ts.Negate()); else sub.AddTimeToAllParagraphs(ts); } catch { Console.Write(" (unable to read offset " + offset + ")"); } } } // adjust frame rate if (targetFrameRate.HasValue) { sub.ChangeFrameRate(Configuration.Settings.General.CurrentFrameRate, targetFrameRate.Value); Configuration.Settings.General.CurrentFrameRate = targetFrameRate.Value; } if (removeTextForHi) { var hiSettings = new Core.Forms.RemoveTextForHISettings(); var hiLib = new Core.Forms.RemoveTextForHI(hiSettings); foreach (var p in sub.Paragraphs) { p.Text = hiLib.RemoveTextFromHearImpaired(p.Text); } } if (fixCommonErrors) { using (var fce = new FixCommonErrors()) { for (int i = 0; i < 3; i++) { fce.RunBatch(sub, format, targetEncoding, Configuration.Settings.Tools.BatchConvertLanguage); sub = fce.FixedSubtitle; } } } if (redoCasing) { using (var changeCasing = new ChangeCasing()) { changeCasing.FixCasing(sub, LanguageAutoDetect.AutoDetectGoogleLanguage(sub)); } using (var changeCasingNames = new ChangeCasingNames()) { changeCasingNames.Initialize(sub); changeCasingNames.FixCasing(); } } bool targetFormatFound = false; string outputFileName; foreach (SubtitleFormat sf in formats) { if (sf.IsTextBased && (sf.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase) || sf.Name.Replace(" ", string.Empty).Equals(toFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase))) { targetFormatFound = true; sf.BatchMode = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, sf.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); if (sf.IsFrameBased && !sub.WasLoadedWithFrameNumbers) sub.CalculateFrameNumbersFromTimeCodesNoCheck(Configuration.Settings.General.CurrentFrameRate); else if (sf.IsTimeBased && sub.WasLoadedWithFrameNumbers) sub.CalculateTimeCodesFromFrameNumbers(Configuration.Settings.General.CurrentFrameRate); if ((sf.GetType() == typeof(WebVTT) || sf.GetType() == typeof(WebVTTFileWithLineNumber))) { targetEncoding = Encoding.UTF8; } if (sf.GetType() == typeof(ItunesTimedText) || sf.GetType() == typeof(ScenaristClosedCaptions) || sf.GetType() == typeof(ScenaristClosedCaptionsDropFrame)) { Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM using (var file = new StreamWriter(outputFileName, false, outputEnc)) // open file with encoding { file.Write(sub.ToText(sf)); } // save and close it } else if (targetEncoding == Encoding.UTF8 && (format.GetType() == typeof(TmpegEncAW5) || format.GetType() == typeof(TmpegEncXml))) { Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM using (var file = new StreamWriter(outputFileName, false, outputEnc)) // open file with encoding { file.Write(sub.ToText(sf)); } // save and close it } else { try { File.WriteAllText(outputFileName, sub.ToText(sf), targetEncoding); } catch (Exception ex) { Console.WriteLine(ex.Message); errors++; return false; } } if (format.GetType() == typeof(Sami) || format.GetType() == typeof(SamiModern)) { var sami = (Sami)format; foreach (string className in Sami.GetStylesFromHeader(sub.Header)) { var newSub = new Subtitle(); foreach (Paragraph p in sub.Paragraphs) { if (p.Extra != null && p.Extra.Trim().Equals(className.Trim(), StringComparison.OrdinalIgnoreCase)) newSub.Paragraphs.Add(p); } if (newSub.Paragraphs.Count > 0 && newSub.Paragraphs.Count < sub.Paragraphs.Count) { string s = fileName; if (s.LastIndexOf('.') > 0) s = s.Insert(s.LastIndexOf('.'), "_" + className); else s += "_" + className + format.Extension; outputFileName = FormatOutputFileNameForBatchConvert(s, sf.Extension, outputFolder, overwrite); File.WriteAllText(outputFileName, newSub.ToText(sf), targetEncoding); } } } Console.WriteLine(" done."); break; } } if (!targetFormatFound) { var ebu = new Ebu(); if (ebu.Name.Replace(" ", string.Empty).Equals(toFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ebu.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); Ebu.Save(outputFileName, sub, true); Console.WriteLine(" done."); } } if (!targetFormatFound) { var pac = new Pac(); if (pac.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase) || toFormat.Equals("pac", StringComparison.OrdinalIgnoreCase) || toFormat.Equals(".pac", StringComparison.OrdinalIgnoreCase)) { pac.BatchMode = true; int codePage; if (!string.IsNullOrEmpty(pacCodePage) && int.TryParse(pacCodePage, out codePage)) pac.CodePage = codePage; targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, pac.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); pac.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var cavena890 = new Cavena890(); if (cavena890.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, cavena890.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); cavena890.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var cheetahCaption = new CheetahCaption(); if (cheetahCaption.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, cheetahCaption.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); CheetahCaption.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var ayato = new Ayato(); if (ayato.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ayato.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); ayato.Save(outputFileName, null, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var capMakerPlus = new CapMakerPlus(); if (capMakerPlus.Name.Replace(" ", string.Empty).Equals(toFormat, StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, capMakerPlus.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); CapMakerPlus.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { if (Configuration.Settings.Language.BatchConvert.PlainText == toFormat || Configuration.Settings.Language.BatchConvert.PlainText.Replace(" ", string.Empty).Equals(toFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".txt", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); File.WriteAllText(outputFileName, ExportText.GeneratePlainText(sub, false, false, false, false, false, false, string.Empty, true, false, true, true, false), targetEncoding); Console.WriteLine(" done."); } } if (!targetFormatFound) { if (string.Compare(BatchConvert.BluRaySubtitle, toFormat, StringComparison.OrdinalIgnoreCase) == 0 || string.Compare(BatchConvert.BluRaySubtitle.Replace(" ", string.Empty), toFormat, StringComparison.OrdinalIgnoreCase) == 0) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".sup", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); using (var form = new ExportPngXml()) { form.Initialize(sub, format, "BLURAYSUP", fileName, null, null); var binarySubtitleFile = new FileStream(outputFileName, FileMode.Create); int width = 1920; int height = 1080; var parts = Configuration.Settings.Tools.ExportBluRayVideoResolution.Split('x'); if (parts.Length == 2 && Utilities.IsInteger(parts[0]) && Utilities.IsInteger(parts[1])) { width = int.Parse(parts[0]); height = int.Parse(parts[1]); } for (int index = 0; index < sub.Paragraphs.Count; index++) { var mp = form.MakeMakeBitmapParameter(index, width, height); mp.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; mp.Bitmap = ExportPngXml.GenerateImageFromTextWithStyle(mp); ExportPngXml.MakeBluRaySupImage(mp); binarySubtitleFile.Write(mp.Buffer, 0, mp.Buffer.Length); } binarySubtitleFile.Close(); } Console.WriteLine(" done."); } } if (!targetFormatFound) { Console.WriteLine("{0}: {1} - target format '{2}' not found!", count, fileName, toFormat); errors++; return false; } converted++; return true; } finally { Configuration.Settings.General.CurrentFrameRate = oldFrameRate; } }
internal static bool BatchConvertSave(string targetFormat, string offset, Encoding targetEncoding, string outputFolder, int count, ref int converted, ref int errors, IEnumerable<SubtitleFormat> formats, string fileName, Subtitle sub, SubtitleFormat format, bool overwrite, int pacCodePage, double? targetFrameRate, IEnumerable<string> multipleReplaceImportFiles, bool removeTextForHi, bool fixCommonErrors, bool redoCasing) { double oldFrameRate = Configuration.Settings.General.CurrentFrameRate; try { // adjust offset if (!string.IsNullOrWhiteSpace(offset)) { bool minus = offset.StartsWith('-'); offset = offset.TrimStart('-'); var offsetSplitChars = new[] { ':', '.', ',' }; var parts = offset.Split(offsetSplitChars, StringSplitOptions.RemoveEmptyEntries); while (parts.Length > 1 && parts.Length < 4) { offset = "0:" + offset; parts = offset.Split(offsetSplitChars, StringSplitOptions.RemoveEmptyEntries); } if (parts.Length == 4) { try { var ts = new TimeSpan(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3])); if (minus) sub.AddTimeToAllParagraphs(ts.Negate()); else sub.AddTimeToAllParagraphs(ts); parts = null; } catch { // ignored } } if (parts != null) { Console.Write(" (unable to read offset " + offset + ")"); } } // adjust frame rate if (targetFrameRate.HasValue) { sub.ChangeFrameRate(Configuration.Settings.General.CurrentFrameRate, targetFrameRate.Value); Configuration.Settings.General.CurrentFrameRate = targetFrameRate.Value; } if (removeTextForHi) { var hiSettings = new Core.Forms.RemoveTextForHISettings(); var hiLib = new Core.Forms.RemoveTextForHI(hiSettings); foreach (var p in sub.Paragraphs) { p.Text = hiLib.RemoveTextFromHearImpaired(p.Text); } } if (fixCommonErrors) { using (var fce = new FixCommonErrors { BatchMode = true }) { for (int i = 0; i < 3; i++) { fce.RunBatch(sub, format, targetEncoding, Configuration.Settings.Tools.BatchConvertLanguage); sub = fce.FixedSubtitle; } } } if (redoCasing) { using (var changeCasing = new ChangeCasing()) { changeCasing.FixCasing(sub, LanguageAutoDetect.AutoDetectGoogleLanguage(sub)); } using (var changeCasingNames = new ChangeCasingNames()) { changeCasingNames.Initialize(sub); changeCasingNames.FixCasing(); } } if (multipleReplaceImportFiles != null && multipleReplaceImportFiles.Count() > 0) { using (var mr = new MultipleReplace()) { mr.RunFromBatch(sub, multipleReplaceImportFiles); sub = mr.FixedSubtitle; sub.RemoveParagraphsByIndices(mr.DeleteIndices); } } bool targetFormatFound = false; string outputFileName; foreach (SubtitleFormat sf in formats) { if (sf.IsTextBased && sf.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; sf.BatchMode = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, sf.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); if (sf.IsFrameBased && !sub.WasLoadedWithFrameNumbers) sub.CalculateFrameNumbersFromTimeCodesNoCheck(Configuration.Settings.General.CurrentFrameRate); else if (sf.IsTimeBased && sub.WasLoadedWithFrameNumbers) sub.CalculateTimeCodesFromFrameNumbers(Configuration.Settings.General.CurrentFrameRate); if ((sf.GetType() == typeof(WebVTT) || sf.GetType() == typeof(WebVTTFileWithLineNumber))) { targetEncoding = Encoding.UTF8; } try { if (sf.GetType() == typeof(ItunesTimedText) || sf.GetType() == typeof(ScenaristClosedCaptions) || sf.GetType() == typeof(ScenaristClosedCaptionsDropFrame)) { var outputEnc = new UTF8Encoding(false); // create encoding with no BOM using (var file = new StreamWriter(outputFileName, false, outputEnc)) // open file with encoding { file.Write(sub.ToText(sf)); } // save and close it } else if (targetEncoding == Encoding.UTF8 && (format.GetType() == typeof(TmpegEncAW5) || format.GetType() == typeof(TmpegEncXml))) { var outputEnc = new UTF8Encoding(false); // create encoding with no BOM using (var file = new StreamWriter(outputFileName, false, outputEnc)) // open file with encoding { file.Write(sub.ToText(sf)); } // save and close it } else { File.WriteAllText(outputFileName, sub.ToText(sf), targetEncoding); } } catch (Exception ex) { Console.WriteLine(ex.Message); errors++; return false; } if (format.GetType() == typeof(Sami) || format.GetType() == typeof(SamiModern)) { var sami = (Sami)format; foreach (string className in Sami.GetStylesFromHeader(sub.Header)) { var newSub = new Subtitle(); foreach (Paragraph p in sub.Paragraphs) { if (p.Extra != null && p.Extra.Trim().Equals(className.Trim(), StringComparison.OrdinalIgnoreCase)) newSub.Paragraphs.Add(p); } if (newSub.Paragraphs.Count > 0 && newSub.Paragraphs.Count < sub.Paragraphs.Count) { string s = fileName; if (s.LastIndexOf('.') > 0) s = s.Insert(s.LastIndexOf('.'), "_" + className); else s += "_" + className + format.Extension; outputFileName = FormatOutputFileNameForBatchConvert(s, sf.Extension, outputFolder, overwrite); File.WriteAllText(outputFileName, newSub.ToText(sf), targetEncoding); } } } Console.WriteLine(" done."); break; } } if (!targetFormatFound) { var ebu = new Ebu(); if (ebu.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ebu.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); ebu.Save(outputFileName, sub, true); Console.WriteLine(" done."); } } if (!targetFormatFound) { var pac = new Pac(); if (pac.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase) || targetFormat.Equals(".pac", StringComparison.OrdinalIgnoreCase) || targetFormat.Equals("pac", StringComparison.OrdinalIgnoreCase)) { pac.BatchMode = true; pac.CodePage = pacCodePage; targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, pac.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); pac.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var cavena890 = new Cavena890(); if (cavena890.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, cavena890.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); cavena890.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var cheetahCaption = new CheetahCaption(); if (cheetahCaption.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, cheetahCaption.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); CheetahCaption.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var ayato = new Ayato(); if (ayato.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ayato.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); ayato.Save(outputFileName, null, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { var capMakerPlus = new CapMakerPlus(); if (capMakerPlus.Name.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, capMakerPlus.Extension, outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); CapMakerPlus.Save(outputFileName, sub); Console.WriteLine(" done."); } } if (!targetFormatFound) { if (Configuration.Settings.Language.BatchConvert.PlainText.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".txt", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); var exportOptions = new ExportText.ExportOptions { ShowLineNumbers = Configuration.Settings.Tools.ExportTextShowLineNumbers, AddNewlineAfterLineNumber = Configuration.Settings.Tools.ExportTextShowLineNumbersNewLine, ShowTimecodes = Configuration.Settings.Tools.ExportTextShowTimeCodes, TimeCodeSrt = Configuration.Settings.Tools.ExportTextShowTimeCodesNewLine, TimeCodeHHMMSSFF = false, AddNewlineAfterTimeCodes = Configuration.Settings.Tools.ExportTextShowTimeCodes, TimeCodeSeparator = string.Empty, RemoveStyling = Configuration.Settings.Tools.ExportTextRemoveStyling, FormatUnbreak = Configuration.Settings.Tools.ExportTextFormatText == "Unbreak", AddNewAfterText = Configuration.Settings.Tools.ExportTextNewLineAfterText, AddNewAfterText2 = Configuration.Settings.Tools.ExportTextNewLineBetweenSubtitles, FormatMergeAll = Configuration.Settings.Tools.ExportTextFormatText == "MergeAll" }; File.WriteAllText(outputFileName, ExportText.GeneratePlainText(sub, exportOptions), targetEncoding); Console.WriteLine(" done."); } } if (!targetFormatFound) { if (BatchConvert.BluRaySubtitle.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".sup", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); using (var form = new ExportPngXml()) { form.Initialize(sub, format, "BLURAYSUP", fileName, null, null); int width = 1920; int height = 1080; var parts = Configuration.Settings.Tools.ExportBluRayVideoResolution.Split('x'); if (parts.Length == 2 && Utilities.IsInteger(parts[0]) && Utilities.IsInteger(parts[1])) { width = int.Parse(parts[0]); height = int.Parse(parts[1]); } using (var binarySubtitleFile = new FileStream(outputFileName, FileMode.Create)) { for (int index = 0; index < sub.Paragraphs.Count; index++) { var mp = form.MakeMakeBitmapParameter(index, width, height); mp.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; mp.Bitmap = ExportPngXml.GenerateImageFromTextWithStyle(mp); ExportPngXml.MakeBluRaySupImage(mp); binarySubtitleFile.Write(mp.Buffer, 0, mp.Buffer.Length); } } } Console.WriteLine(" done."); } else if (BatchConvert.VobSubSubtitle.Replace(" ", string.Empty).Equals(targetFormat.Replace(" ", string.Empty), StringComparison.OrdinalIgnoreCase)) { targetFormatFound = true; outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".sub", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); using (var form = new ExportPngXml()) { form.Initialize(sub, format, "VOBSUB", fileName, null, null); int width = 720; int height = 576; var parts = Configuration.Settings.Tools.ExportVobSubVideoResolution.Split('x'); if (parts.Length == 2 && Utilities.IsInteger(parts[0]) && Utilities.IsInteger(parts[1])) { width = int.Parse(parts[0]); height = int.Parse(parts[1]); } var cfg = Configuration.Settings.Tools; var language = DvdSubtitleLanguage.GetLanguageOrNull(LanguageAutoDetect.AutoDetectGoogleLanguage(sub)) ?? DvdSubtitleLanguage.English; using (var vobSubWriter = new VobSubWriter(outputFileName, width, height, cfg.ExportBottomMargin, cfg.ExportBottomMargin, 32, cfg.ExportFontColor, cfg.ExportBorderColor, !cfg.ExportVobAntiAliasingWithTransparency, language)) { for (int index = 0; index < sub.Paragraphs.Count; index++) { var mp = form.MakeMakeBitmapParameter(index, width, height); mp.LineJoin = Configuration.Settings.Tools.ExportPenLineJoin; mp.Bitmap = ExportPngXml.GenerateImageFromTextWithStyle(mp); vobSubWriter.WriteParagraph(mp.P, mp.Bitmap, mp.Alignment); } vobSubWriter.WriteIdxFile(); } } Console.WriteLine(" done."); } else if (!targetFormatFound && targetFormat.StartsWith("CustomText:", StringComparison.OrdinalIgnoreCase)) { if (!string.IsNullOrEmpty(Configuration.Settings.Tools.ExportCustomTemplates)) { var arr = targetFormat.Split(':'); if (arr.Length == 2) { foreach (string template in Configuration.Settings.Tools.ExportCustomTemplates.Split('æ')) { if (template.StartsWith(arr[1] + "Æ", StringComparison.Ordinal)) { targetFormatFound = true; string title = string.Empty; if (!string.IsNullOrEmpty(fileName)) title = Path.GetFileNameWithoutExtension(fileName); outputFileName = FormatOutputFileNameForBatchConvert(fileName, ".txt", outputFolder, overwrite); Console.Write("{0}: {1} -> {2}...", count, Path.GetFileName(fileName), outputFileName); File.WriteAllText(outputFileName, ExportCustomText.GenerateCustomText(sub, null, title, template), targetEncoding); Console.WriteLine(" done."); break; } } } } } } if (!targetFormatFound) { Console.WriteLine("{0}: {1} - target format '{2}' not found!", count, fileName, targetFormat); errors++; return false; } converted++; return true; } finally { Configuration.Settings.General.CurrentFrameRate = oldFrameRate; } }