public void SrtDifficultLines1() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"303 00:16:22,417 --> 00:16:24,417 sky bots? 304 00:16:24,417 --> 00:16:27,042 how do you think i did all the stuff for the show? 305 00:16:27,042 --> 00:16:29,417 you think i went myself?"; target.LoadSubtitle(subtitle, GetSrtLines(text), null); Assert.AreEqual(3, subtitle.Paragraphs.Count); const string expected = @"how do you think i did all the stuff for the show?"; Assert.AreEqual(expected, subtitle.Paragraphs[1].Text); }
private void buttonTrain_Click(object sender, EventArgs e) { var startFontSize = Convert.ToInt32(comboBoxSubtitleFontSize.Items[comboBoxSubtitleFontSize.SelectedIndex].ToString()); var endFontSize = Convert.ToInt32(comboBoxFontSizeEnd.Items[comboBoxFontSizeEnd.SelectedIndex].ToString()); if (!File.Exists(textBoxInputFile.Text)) { MessageBox.Show($"Input file '{textBoxInputFile.Text}' does not exist!"); return; } if (!Directory.Exists(textBoxNOcrDb.Text)) { MessageBox.Show($"Output folder '{textBoxNOcrDb.Text}' does not exist!"); return; } if (listViewFonts.CheckedItems.Count == 1) { MessageBox.Show("Please select at least one font!"); return; } foreach (ListViewItem fontItem in listViewFonts.CheckedItems) { _subtitleFontName = fontItem.Text; for (_subtitleFontSize = startFontSize; _subtitleFontSize <= endFontSize; _subtitleFontSize++) { int numberOfCharactersLeaned = 0; int numberOfCharactersSkipped = 0; var bicDb = new BinaryOcrDb(Path.Combine(textBoxNOcrDb.Text, $"{_subtitleFontName}_{_subtitleFontSize}.db")); var lines = File.ReadAllLines(textBoxInputFile.Text).ToList(); var format = new SubRip(); var sub = new Subtitle(); format.LoadSubtitle(sub, lines, textBoxInputFile.Text); var charactersLearned = new List <string>(); foreach (var p in sub.Paragraphs) { foreach (char ch in p.Text) { if (!char.IsWhiteSpace(ch)) { var s = ch.ToString(); if (!charactersLearned.Contains(s)) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, false, false); TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, false, true); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, true, false); } } } } } bicDb.Save(); } } }
private void buttonTrain_Click(object sender, EventArgs e) { if (!System.IO.File.Exists(textBoxInputFile.Text)) { return; } int numberOfCharactersLeaned = 0; int numberOfCharactersSkipped = 0; var nOcrD = new NOcrDb(textBoxNOcrDb.Text); var lines = new List <string>(); foreach (string line in System.IO.File.ReadAllLines(textBoxInputFile.Text)) { lines.Add(line); } var format = new SubRip(); var sub = new Subtitle(); format.LoadSubtitle(sub, lines, textBoxInputFile.Text); var charactersLearned = new List <string>(); foreach (ListViewItem item in listViewFonts.Items) { if (item.Checked) { _subtitleFontName = item.Text; _subtitleFontSize = Convert.ToInt32(comboBoxSubtitleFontSize.Items[comboBoxSubtitleFontSize.SelectedIndex].ToString()); charactersLearned = new List <string>(); foreach (Paragraph p in sub.Paragraphs) { foreach (char ch in p.Text) { string s = ch.ToString(); if (s.Trim().Length > 0) { if (!charactersLearned.Contains(s)) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, nOcrD, charactersLearned, s, false); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, nOcrD, charactersLearned, s, true); } } } } } } } nOcrD.Save(); }
public void SrtNoLineNumbers() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"00:00:03,000 --> 00:00:08,000 Line1. 00:00:08,000 --> 00:00:09,920 Line 2."; target.LoadSubtitle(subtitle, GetSrtLines(text), null); Assert.AreEqual(2, subtitle.Paragraphs.Count); }
public void SrtDotsInsteadOfCommas() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"2 00:00:04.501 --> 00:00:08.500 Dots instead of commas"; target.LoadSubtitle(subtitle, GetSrtLines(text), null); string actual = subtitle.Paragraphs[0].Text; const string expected = "Dots instead of commas"; Assert.AreEqual(expected, actual); }
public void SrtCoordinates() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"1 00:00:02,001 --> 00:00:16,001 X1:000 X2:000 Y1:050 Y2:100 Let us have some! Let us have some!"; target.LoadSubtitle(subtitle, GetSrtLines(text), null); string actual = subtitle.Paragraphs[0].Text; const string expected = "Let us have some! Let us have some!"; Assert.AreEqual(expected, actual); }
public void SrtKeepBlankLines() { var target = new SubRip(); var subtitle = new Subtitle(); string subText = "Now go on!" + Environment.NewLine + Environment.NewLine + "Now go on!"; subtitle.Paragraphs.Add(new Paragraph(subText, 0, 999)); var text = target.ToText(subtitle, "title"); var outSubtitle = new Subtitle(); target.LoadSubtitle(outSubtitle, text.SplitToLines(), null); Assert.IsTrue(outSubtitle.Paragraphs[0].Text == subText); }
public void SrtTwoLiner() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"2 00:00:04.501 --> 00:00:08.500 Line 1 Line 2"; target.LoadSubtitle(subtitle, GetSrtLines(text), null); string actual = subtitle.Paragraphs[0].Text; string expected = "Line 1" + Environment.NewLine + "Line 2"; Assert.AreEqual(expected, actual); }
public void SrtNoLineNumbers() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"00:00:03,000 --> 00:00:08,000 Line1. 00:00:08,000 --> 00:00:09,920 Line 2."; target.LoadSubtitle(subtitle, GetSrtLines(text), null); string actual = subtitle.Paragraphs.Count.ToString(CultureInfo.InvariantCulture); const string expected = "2"; Assert.AreEqual(expected, actual); }
public void SrtDifficultLines2() { var target = new SubRip(); var subtitle = new Subtitle(); const string text = @"1 01:38:18,534 --> 01:38:20,067 6530 2 01:39:17,534 --> 01:39:19,400 ppp "; target.LoadSubtitle(subtitle, GetSrtLines(text), null); Assert.AreEqual(2, subtitle.Paragraphs.Count); const string expected = @" 6530"; Assert.AreEqual(expected.Trim(), subtitle.Paragraphs[0].Text.Trim()); }
private void importTimeCodesToolStripMenuItem_Click(object sender, EventArgs e) { if (_subtitle.Paragraphs.Count < 1) { return; } openFileDialog1.Title = Configuration.Settings.Language.General.OpenSubtitle; openFileDialog1.FileName = string.Empty; openFileDialog1.Filter = UiUtil.SubtitleExtensionFilter.Value; if (openFileDialog1.ShowDialog(this) == DialogResult.OK) { var timeCodeSubtitle = new Subtitle(); SubtitleFormat format = null; if (openFileDialog1.FileName.EndsWith(".sup", StringComparison.OrdinalIgnoreCase) && FileUtil.IsBluRaySup(openFileDialog1.FileName)) { var log = new StringBuilder(); var subtitles = BluRaySupParser.ParseBluRaySup(openFileDialog1.FileName, log); if (subtitles.Count > 0) { foreach (var sup in subtitles) { timeCodeSubtitle.Paragraphs.Add(new Paragraph(sup.StartTimeCode, sup.EndTimeCode, string.Empty)); } format = new SubRip(); // just to set format to something } } if (format == null) { format = timeCodeSubtitle.LoadSubtitle(openFileDialog1.FileName, out var encoding, null); } if (format == null) { var formats = SubtitleFormat.GetBinaryFormats(true).Union(SubtitleFormat.GetTextOtherFormats()).Union(new SubtitleFormat[] { new TimeCodesOnly1(), new TimeCodesOnly2() }).ToArray(); format = SubtitleFormat.LoadSubtitleFromFile(formats, openFileDialog1.FileName, timeCodeSubtitle); } if (format == null) { return; } if (timeCodeSubtitle.Paragraphs.Count != _subtitle.Paragraphs.Count) { var text = string.Format(Configuration.Settings.Language.Main.ImportTimeCodesDifferentNumberOfLinesWarning, timeCodeSubtitle.Paragraphs.Count, _subtitle.Paragraphs.Count); if (MessageBox.Show(this, text, Text, MessageBoxButtons.YesNoCancel) != DialogResult.Yes) { return; } } int count = 0; for (int i = 0; i < timeCodeSubtitle.Paragraphs.Count; i++) { var existing = _subtitle.GetParagraphOrDefault(i); var newTimeCode = timeCodeSubtitle.GetParagraphOrDefault(i); if (existing == null || newTimeCode == null) { break; } existing.StartTime.TotalMilliseconds = newTimeCode.StartTime.TotalMilliseconds; existing.EndTime.TotalMilliseconds = newTimeCode.EndTime.TotalMilliseconds; count++; } MessageBox.Show(string.Format(Configuration.Settings.Language.Main.TimeCodeImportedFromXY, Path.GetFileName(openFileDialog1.FileName), count)); var idx = subtitleListView1.SelectedItems[0].Index; subtitleListView1.Fill(_subtitle); subtitleListView1.SelectIndexAndEnsureVisible(_subtitle.GetParagraphOrDefault(idx)); } }
internal static SubtitleFormat LoadMatroskaTextSubtitle(MatroskaTrackInfo matroskaSubtitleInfo, MatroskaFile matroska, List<MatroskaSubtitle> sub, Subtitle subtitle) { if (subtitle == null) { throw new ArgumentNullException("subtitle"); } subtitle.Paragraphs.Clear(); var isSsa = false; SubtitleFormat format = new SubRip(); if (matroskaSubtitleInfo.CodecPrivate.Contains("[script info]", StringComparison.OrdinalIgnoreCase)) { if (matroskaSubtitleInfo.CodecPrivate.Contains("[V4 Styles]", StringComparison.OrdinalIgnoreCase)) { format = new SubStationAlpha(); } else { format = new AdvancedSubStationAlpha(); } isSsa = true; } if (isSsa) { foreach (var p in LoadMatroskaSSA(matroskaSubtitleInfo, matroska.Path, format, sub).Paragraphs) { subtitle.Paragraphs.Add(p); } if (!string.IsNullOrEmpty(matroskaSubtitleInfo.CodecPrivate)) { bool eventsStarted = false; bool fontsStarted = false; bool graphicsStarted = false; var header = new StringBuilder(); foreach (string line in matroskaSubtitleInfo.CodecPrivate.Replace(Environment.NewLine, "\n").Split('\n')) { if (!eventsStarted && !fontsStarted && !graphicsStarted) { header.AppendLine(line); } if (line.TrimStart().StartsWith("dialog:", StringComparison.OrdinalIgnoreCase)) { eventsStarted = true; fontsStarted = false; graphicsStarted = false; } else if (line.Trim().Equals("[events]", StringComparison.OrdinalIgnoreCase)) { eventsStarted = true; fontsStarted = false; graphicsStarted = false; } else if (line.Trim().Equals("[fonts]", StringComparison.OrdinalIgnoreCase)) { eventsStarted = false; fontsStarted = true; graphicsStarted = false; } else if (line.Trim().Equals("[graphics]", StringComparison.OrdinalIgnoreCase)) { eventsStarted = false; fontsStarted = false; graphicsStarted = true; } } subtitle.Header = header.ToString().TrimEnd(); if (!subtitle.Header.Contains("[events]", StringComparison.OrdinalIgnoreCase)) { subtitle.Header += Environment.NewLine + Environment.NewLine + "[Events]" + Environment.NewLine; } } } else { foreach (var p in sub) { subtitle.Paragraphs.Add(new Paragraph(p.Text, p.Start, p.End)); } } subtitle.Renumber(); return format; }
private void buttonTrain_Click(object sender, EventArgs e) { if (buttonTrain.Text == LanguageSettings.Current.SpellCheck.Abort) { _abort = true; return; } _abort = false; buttonTrain.Text = LanguageSettings.Current.SpellCheck.Abort; buttonOK.Enabled = false; saveFileDialog1.DefaultExt = ".db"; saveFileDialog1.Filter = "*Binary Image Compare DB files|*.db"; if (saveFileDialog1.ShowDialog(this) != DialogResult.OK) { return; } buttonTrain.Text = LanguageSettings.Current.SpellCheck.Abort; var startFontSize = Convert.ToInt32(comboBoxSubtitleFontSize.Items[comboBoxSubtitleFontSize.SelectedIndex].ToString()); var endFontSize = Convert.ToInt32(comboBoxFontSizeEnd.Items[comboBoxFontSizeEnd.SelectedIndex].ToString()); if (!File.Exists(textBoxInputFile.Text)) { MessageBox.Show($"Input file '{textBoxInputFile.Text}' does not exist!"); return; } if (listViewFonts.CheckedItems.Count == 0) { MessageBox.Show("Please select at least one font!"); return; } var bicDb = new BinaryOcrDb(saveFileDialog1.FileName); int numberOfCharactersLearned = 0; int numberOfCharactersSkipped = 0; foreach (ListViewItem fontItem in listViewFonts.CheckedItems) { _subtitleFontName = fontItem.Text; for (_subtitleFontSize = startFontSize; _subtitleFontSize <= endFontSize; _subtitleFontSize++) { var lines = File.ReadAllLines(textBoxInputFile.Text).ToList(); var format = new SubRip(); var sub = new Subtitle(); format.LoadSubtitle(sub, lines, textBoxInputFile.Text); var charactersLearned = new List <string>(); foreach (var p in sub.Paragraphs) { labelInfo.Refresh(); Application.DoEvents(); foreach (char ch in p.Text) { if (!char.IsWhiteSpace(ch)) { var s = ch.ToString(); if (!charactersLearned.Contains(s)) { charactersLearned.Add(s); TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, s, false, false); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, s, true, false); } if (checkBoxItalic.Checked) { TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, s, false, true); } } labelInfo.Text = string.Format(LanguageSettings.Current.VobSubOcr.NowTraining, numberOfCharactersLearned, _subtitleFontName, numberOfCharactersSkipped); } } foreach (var text in textBoxMerged.Text.Split(' ')) { if (!string.IsNullOrWhiteSpace(text)) { if (!charactersLearned.Contains(text) && text.Length > 1 && text.Length <= 3) { charactersLearned.Add(text); TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, text, false, false); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, text, true, false); } if (checkBoxItalic.Checked) { TrainLetter(ref numberOfCharactersLearned, ref numberOfCharactersSkipped, bicDb, text, false, true); } } } } if (_abort) { break; } } if (_abort) { break; } } if (_abort) { break; } } bicDb.Save(); if (_abort) { labelInfo.Text = "Partially (aborted) training completed and saved in " + saveFileDialog1.FileName; } else { labelInfo.Text = "Training completed and saved in " + saveFileDialog1.FileName; } buttonOK.Enabled = true; buttonTrain.Text = "Start training"; _abort = false; }
private void buttonTrain_Click(object sender, EventArgs e) { if (buttonTrain.Text == "Abort") { _abort = true; return; } if (!File.Exists(textBoxInputFile.Text)) { return; } _abort = false; buttonTrain.Text = "Abort"; buttonOK.Enabled = false; int numberOfCharactersLeaned = 0; int numberOfCharactersSkipped = 0; var nOcrD = new NOcrDb(null); var lines = new List <string>(); foreach (string line in File.ReadAllLines(textBoxInputFile.Text)) { lines.Add(line); } var format = new SubRip(); var sub = new Subtitle(); format.LoadSubtitle(sub, lines, textBoxInputFile.Text); foreach (ListViewItem item in listViewFonts.Items) { if (item.Checked) { _subtitleFontName = item.Text; _subtitleFontSize = Convert.ToInt32(comboBoxSubtitleFontSize.Items[comboBoxSubtitleFontSize.SelectedIndex].ToString()); var charactersLearned = new List <string>(); foreach (Paragraph p in sub.Paragraphs) { foreach (char ch in p.Text) { if (!char.IsWhiteSpace(ch)) { var s = ch.ToString(); if (!charactersLearned.Contains(s)) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, nOcrD, charactersLearned, s, false); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, nOcrD, charactersLearned, s, true); } } } } if (_abort) { break; } } if (_abort) { break; } } } labelInfo.Text = "Saving..."; labelInfo.Refresh(); saveFileDialog1.Filter = "nOCR DB|*.nocr"; saveFileDialog1.InitialDirectory = Configuration.OcrDirectory; if (saveFileDialog1.ShowDialog(this) == DialogResult.OK) { labelInfo.Text = $"Saving to {saveFileDialog1.FileName}..."; nOcrD.FileName = saveFileDialog1.FileName; nOcrD.Save(); labelInfo.Text = "Training done"; } else { labelInfo.Text = "Saving aborted"; } buttonOK.Enabled = true; buttonTrain.Text = "Start training"; _abort = false; }
private void buttonTrain_Click(object sender, EventArgs e) { saveFileDialog1.DefaultExt = ".db"; saveFileDialog1.Filter = "*Binary Image Compare DB files|*.db"; if (saveFileDialog1.ShowDialog(this) != DialogResult.OK) { return; } var startFontSize = Convert.ToInt32(comboBoxSubtitleFontSize.Items[comboBoxSubtitleFontSize.SelectedIndex].ToString()); var endFontSize = Convert.ToInt32(comboBoxFontSizeEnd.Items[comboBoxFontSizeEnd.SelectedIndex].ToString()); if (!File.Exists(textBoxInputFile.Text)) { MessageBox.Show($"Input file '{textBoxInputFile.Text}' does not exist!"); return; } if (listViewFonts.CheckedItems.Count == 1) { MessageBox.Show("Please select at least one font!"); return; } var bicDb = new BinaryOcrDb(saveFileDialog1.FileName); int numberOfCharactersLeaned = 0; int numberOfCharactersSkipped = 0; foreach (ListViewItem fontItem in listViewFonts.CheckedItems) { _subtitleFontName = fontItem.Text; for (_subtitleFontSize = startFontSize; _subtitleFontSize <= endFontSize; _subtitleFontSize++) { var lines = File.ReadAllLines(textBoxInputFile.Text).ToList(); var format = new SubRip(); var sub = new Subtitle(); format.LoadSubtitle(sub, lines, textBoxInputFile.Text); var charactersLearned = new List <string>(); foreach (var p in sub.Paragraphs) { foreach (char ch in p.Text) { if (!char.IsWhiteSpace(ch)) { var s = ch.ToString(); if (!charactersLearned.Contains(s)) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, false, false); TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, false, true); if (checkBoxBold.Checked) { TrainLetter(ref numberOfCharactersLeaned, ref numberOfCharactersSkipped, bicDb, charactersLearned, s, true, false); } } } } } } } bicDb.Save(); labelInfo.Text = "Training completed and saved in " + saveFileDialog1.FileName; }
private void SortAndLoad() { JoinedFormat = new SubRip(); // default subtitle format string header = null; SubtitleFormat lastFormat = null; var subtitles = new List <Subtitle>(); for (int k = 0; k < _fileNamesToJoin.Count; k++) { string fileName = _fileNamesToJoin[k]; try { var sub = new Subtitle(); Encoding encoding; var format = sub.LoadSubtitle(fileName, out encoding, null); if (format == null) { for (int j = k; j < _fileNamesToJoin.Count; j++) { _fileNamesToJoin.RemoveAt(j); } MessageBox.Show("Unkown subtitle format: " + fileName); return; } if (sub.Header != null) { header = sub.Header; } if (lastFormat == null || lastFormat.FriendlyName == format.FriendlyName) { lastFormat = format; } else { lastFormat = new SubRip(); // default subtitle format } subtitles.Add(sub); } catch (Exception exception) { for (int j = k; j < _fileNamesToJoin.Count; j++) { _fileNamesToJoin.RemoveAt(j); } MessageBox.Show(exception.Message); return; } } JoinedFormat = lastFormat; for (int outer = 0; outer < subtitles.Count; outer++) { for (int inner = 1; inner < subtitles.Count; inner++) { var a = subtitles[inner - 1]; var b = subtitles[inner]; if (a.Paragraphs.Count > 0 && b.Paragraphs.Count > 0 && a.Paragraphs[0].StartTime.TotalMilliseconds > b.Paragraphs[0].StartTime.TotalMilliseconds) { string t1 = _fileNamesToJoin[inner - 1]; _fileNamesToJoin[inner - 1] = _fileNamesToJoin[inner]; _fileNamesToJoin[inner] = t1; var t2 = subtitles[inner - 1]; subtitles[inner - 1] = subtitles[inner]; subtitles[inner] = t2; } } } listViewParts.BeginUpdate(); listViewParts.Items.Clear(); int i = 0; foreach (string fileName in _fileNamesToJoin) { Subtitle sub = subtitles[i]; var lvi = new ListViewItem(string.Format("{0:#,###,###}", sub.Paragraphs.Count)); if (sub.Paragraphs.Count > 0) { lvi.SubItems.Add(sub.Paragraphs[0].StartTime.ToString()); lvi.SubItems.Add(sub.Paragraphs[sub.Paragraphs.Count - 1].StartTime.ToString()); } else { lvi.SubItems.Add("-"); lvi.SubItems.Add("-"); } lvi.SubItems.Add(fileName); listViewParts.Items.Add(lvi); i++; } listViewParts.EndUpdate(); JoinedSubtitle = new Subtitle(); if (JoinedFormat.FriendlyName != SubRip.NameOfFormat) { JoinedSubtitle.Header = header; } foreach (Subtitle sub in subtitles) { foreach (Paragraph p in sub.Paragraphs) { JoinedSubtitle.Paragraphs.Add(p); } } JoinedSubtitle.Renumber(); labelTotalLines.Text = string.Format(Configuration.Settings.Language.JoinSubtitles.TotalNumberOfLinesX, JoinedSubtitle.Paragraphs.Count); }
private void SortAndLoad() { JoinedFormat = new SubRip(); // default subtitle format string header = null; SubtitleFormat lastFormat = null; var subtitles = new List <Subtitle>(); for (int k = 0; k < _fileNamesToJoin.Count; k++) { string fileName = _fileNamesToJoin[k]; try { var sub = new Subtitle(); var format = sub.LoadSubtitle(fileName, out _, null); if (format == null) { foreach (var binaryFormat in SubtitleFormat.GetBinaryFormats(true)) { if (binaryFormat.IsMine(null, fileName)) { _fileNamesToJoin.Add(fileName); binaryFormat.LoadSubtitle(sub, null, fileName); format = binaryFormat; break; } } } if (format == null) { var encoding = LanguageAutoDetect.GetEncodingFromFile(fileName); var lines = FileUtil.ReadAllTextShared(fileName, encoding).SplitToLines(); foreach (var f in SubtitleFormat.GetTextOtherFormats()) { if (f.IsMine(lines, fileName)) { _fileNamesToJoin.Add(fileName); f.LoadSubtitle(sub, lines, fileName); format = f; break; } } } if (format == null) { for (int j = k; j < _fileNamesToJoin.Count; j++) { _fileNamesToJoin.RemoveAt(j); } MessageBox.Show("Unkown subtitle format: " + fileName); return; } if (sub.Header != null) { header = sub.Header; } if (lastFormat == null || lastFormat.FriendlyName == format.FriendlyName) { lastFormat = format; } else { lastFormat = new SubRip(); // default subtitle format } subtitles.Add(sub); } catch (Exception exception) { for (int j = k; j < _fileNamesToJoin.Count; j++) { _fileNamesToJoin.RemoveAt(j); } MessageBox.Show(exception.Message); return; } } JoinedFormat = lastFormat; for (int outer = 0; outer < subtitles.Count; outer++) { for (int inner = 1; inner < subtitles.Count; inner++) { var a = subtitles[inner - 1]; var b = subtitles[inner]; if (a.Paragraphs.Count > 0 && b.Paragraphs.Count > 0 && a.Paragraphs[0].StartTime.TotalMilliseconds > b.Paragraphs[0].StartTime.TotalMilliseconds) { string t1 = _fileNamesToJoin[inner - 1]; _fileNamesToJoin[inner - 1] = _fileNamesToJoin[inner]; _fileNamesToJoin[inner] = t1; var t2 = subtitles[inner - 1]; subtitles[inner - 1] = subtitles[inner]; subtitles[inner] = t2; } } } listViewParts.BeginUpdate(); listViewParts.Items.Clear(); int i = 0; foreach (string fileName in _fileNamesToJoin) { var sub = subtitles[i]; var lvi = new ListViewItem($"{sub.Paragraphs.Count:#,###,###}"); if (sub.Paragraphs.Count > 0) { lvi.SubItems.Add(sub.Paragraphs[0].StartTime.ToString()); lvi.SubItems.Add(sub.Paragraphs[sub.Paragraphs.Count - 1].StartTime.ToString()); } else { lvi.SubItems.Add("-"); lvi.SubItems.Add("-"); } lvi.SubItems.Add(fileName); listViewParts.Items.Add(lvi); i++; } listViewParts.EndUpdate(); JoinedSubtitle = new Subtitle(); if (JoinedFormat != null && JoinedFormat.FriendlyName != SubRip.NameOfFormat) { JoinedSubtitle.Header = header; } foreach (var sub in subtitles) { foreach (var p in sub.Paragraphs) { JoinedSubtitle.Paragraphs.Add(p); } } JoinedSubtitle.Renumber(); labelTotalLines.Text = string.Format(Configuration.Settings.Language.JoinSubtitles.TotalNumberOfLinesX, JoinedSubtitle.Paragraphs.Count); }