private static string GetLanguageCode(string fileName) { fileName = Path.Combine(Directory.GetCurrentDirectory(), fileName); var sub = new Subtitle(); Encoding encoding; sub.LoadSubtitle(fileName, out encoding, null); return LanguageAutoDetect.AutoDetectGoogleLanguage(sub); }
/// <summary> /// Load a subtitle from a file. /// Check "OriginalFormat" to see what subtitle format was used. /// Check "OriginalEncoding" to see what text encoding was used. /// </summary> /// <param name="fileName">File name of subtitle to load.</param> /// <param name="useThisEncoding">Encoding to read file with.</param> /// <returns>Loaded subtitle, null if file is not known subtitle format.</returns> public static Subtitle Parse(string fileName, Encoding useThisEncoding) { var subtitle = new Subtitle(); var format = subtitle.LoadSubtitle(fileName, out var encodingUsed, useThisEncoding); if (format == null) { return(null); } subtitle.OriginalEncoding = encodingUsed; return(subtitle); }
private void VerifyDragDrop(ListView listView, DragEventArgs e) { var files = e.Data.GetData(DataFormats.FileDrop) as string[]; if (files.Length > 1) { MessageBox.Show(Configuration.Settings.Language.Main.DropOnlyOneFile, "", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } string filePath = files[0]; var listExt = new List<string>(); foreach (var s in Utilities.GetOpenDialogFilter().Split(new[] { '*' }, StringSplitOptions.RemoveEmptyEntries)) { if (s.EndsWith(';')) listExt.Add(s.Trim(';')); } if (!listExt.Contains(Path.GetExtension(filePath))) return; if (FileUtil.IsVobSub(filePath) || FileUtil.IsBluRaySup(filePath)) { MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); return; } Encoding encoding; if (listView.Name == "subtitleListView1") { _subtitle1 = new Subtitle(); _subtitle1.LoadSubtitle(filePath, out encoding, null); subtitleListView1.Fill(_subtitle1); subtitleListView1.SelectIndexAndEnsureVisible(0); subtitleListView2.SelectIndexAndEnsureVisible(0); labelSubtitle1.Text = filePath; _language1 = Utilities.AutoDetectGoogleLanguage(_subtitle1); if (_subtitle1.Paragraphs.Count > 0) CompareSubtitles(); } else { _subtitle2 = new Subtitle(); _subtitle2.LoadSubtitle(filePath, out encoding, null); subtitleListView2.Fill(_subtitle2); subtitleListView1.SelectIndexAndEnsureVisible(0); subtitleListView2.SelectIndexAndEnsureVisible(0); labelSubtitle2.Text = filePath; if (_subtitle2.Paragraphs.Count > 0) CompareSubtitles(); } }
private void ButtonOpenSubtitle2Click(object sender, EventArgs e) { openFileDialog1.FileName = string.Empty; if (openFileDialog1.ShowDialog() == DialogResult.OK) { if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) { MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); return; } _subtitle2 = new Subtitle(); Encoding encoding; var format = _subtitle2.LoadSubtitle(openFileDialog1.FileName, out encoding, null); if (format == null) { var pac = new Pac(); if (pac.IsMine(null, openFileDialog1.FileName)) { pac.BatchMode = true; pac.LoadSubtitle(_subtitle2, null, openFileDialog1.FileName); format = pac; } } if (format == null) { var cavena890 = new Cavena890(); if (cavena890.IsMine(null, openFileDialog1.FileName)) { cavena890.LoadSubtitle(_subtitle2, null, openFileDialog1.FileName); } } subtitleListView2.Fill(_subtitle2); subtitleListView1.SelectIndexAndEnsureVisible(0); subtitleListView2.SelectIndexAndEnsureVisible(0); labelSubtitle2.Text = openFileDialog1.FileName; if (_subtitle2.Paragraphs.Count > 0) CompareSubtitles(); } }
private void ButtonOpenSubtitle1Click(object sender, EventArgs e) { openFileDialog1.FileName = string.Empty; if (openFileDialog1.ShowDialog() == DialogResult.OK) { if (FileUtil.IsVobSub(openFileDialog1.FileName) || FileUtil.IsBluRaySup(openFileDialog1.FileName)) { MessageBox.Show(Configuration.Settings.Language.CompareSubtitles.CannotCompareWithImageBasedSubtitles); return; } _subtitle1 = new Subtitle(); Encoding encoding; var format = _subtitle1.LoadSubtitle(openFileDialog1.FileName, out encoding, null); if (format == null) { var pac = new Pac(); if (pac.IsMine(null, openFileDialog1.FileName)) { pac.BatchMode = true; pac.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); format = pac; } } if (format == null) { var cavena890 = new Cavena890(); if (cavena890.IsMine(null, openFileDialog1.FileName)) { cavena890.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } if (format == null) { var spt = new Spt(); if (spt.IsMine(null, openFileDialog1.FileName)) { spt.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } if (format == null) { var cheetahCaption = new CheetahCaption(); if (cheetahCaption.IsMine(null, openFileDialog1.FileName)) { cheetahCaption.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } if (format == null) { var chk = new Chk(); if (chk.IsMine(null, openFileDialog1.FileName)) { chk.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } if (format == null) { var asc = new TimeLineAscii(); if (asc.IsMine(null, openFileDialog1.FileName)) { asc.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } if (format == null) { var asc = new TimeLineFootageAscii(); if (asc.IsMine(null, openFileDialog1.FileName)) { asc.LoadSubtitle(_subtitle1, null, openFileDialog1.FileName); } } subtitleListView1.Fill(_subtitle1); subtitleListView1.SelectIndexAndEnsureVisible(0); subtitleListView2.SelectIndexAndEnsureVisible(0); labelSubtitle1.Text = openFileDialog1.FileName; _language1 = Utilities.AutoDetectGoogleLanguage(_subtitle1); if (_subtitle1.Paragraphs.Count > 0) CompareSubtitles(); } }
private void buttonImport_Click(object sender, EventArgs e) { openFileDialogImport.Title = Configuration.Settings.Language.SubStationAlphaStyles.ImportStyleFromFile; openFileDialogImport.InitialDirectory = Configuration.DataDirectory; if (_isSubStationAlpha) { openFileDialogImport.Filter = SubStationAlpha.NameOfFormat + "|*.ssa|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; saveFileDialogStyle.FileName = "my_styles.ssa"; } else { openFileDialogImport.Filter = AdvancedSubStationAlpha.NameOfFormat + "|*.ass|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; saveFileDialogStyle.FileName = "my_styles.ass"; } if (openFileDialogImport.ShowDialog(this) == DialogResult.OK) { Encoding encoding = null; var s = new Subtitle(); var format = s.LoadSubtitle(openFileDialogImport.FileName, out encoding, null); if (format != null && format.HasStyleSupport) { var styles = AdvancedSubStationAlpha.GetStylesFromHeader(s.Header); if (styles.Count > 0) { var cs = new ChooseStyle(s, format.GetType() == typeof(SubStationAlpha)); if (cs.ShowDialog(this) == DialogResult.OK && cs.SelectedStyleName != null) { SsaStyle style = AdvancedSubStationAlpha.GetSsaStyle(cs.SelectedStyleName, s.Header); if (GetSsaStyle(style.Name).LoadedFromHeader) { int count = 2; bool doRepeat = GetSsaStyle(style.Name + count).LoadedFromHeader; while (doRepeat) { doRepeat = GetSsaStyle(style.Name + count).LoadedFromHeader; count++; } style.RawLine = style.RawLine.Replace(" " + style.Name + ",", " " + style.Name + count + ","); style.Name = style.Name + count; } _doUpdate = false; AddStyle(listViewStyles, style, Subtitle, _isSubStationAlpha); SsaStyle oldStyle = GetSsaStyle(listViewStyles.Items[0].Text); _header = _header.Trim(); if (_header.EndsWith("[Events]")) { _header = _header.Substring(0, _header.Length - "[Events]".Length).Trim(); _header += Environment.NewLine + style.RawLine; _header += Environment.NewLine + Environment.NewLine + "[Events]" + Environment.NewLine; } else { _header = _header.Trim() + Environment.NewLine + style.RawLine + Environment.NewLine; } listViewStyles.Items[listViewStyles.Items.Count - 1].Selected = true; listViewStyles.Items[listViewStyles.Items.Count - 1].EnsureVisible(); listViewStyles.Items[listViewStyles.Items.Count - 1].Focused = true; textBoxStyleName.Text = style.Name; textBoxStyleName.Focus(); _doUpdate = true; SetControlsFromStyle(style); listViewStyles_SelectedIndexChanged(null, null); labelStatus.Text = string.Format(Configuration.Settings.Language.SubStationAlphaStyles.StyleXImportedFromFileY, style.Name, openFileDialogImport.FileName); timerClearStatus.Start(); } } } } }
private void buttonExport_Click(object sender, EventArgs e) { if (listViewStyles.SelectedItems.Count != 1) return; string styleName = listViewStyles.SelectedItems[0].Text; saveFileDialogStyle.Title = Configuration.Settings.Language.SubStationAlphaStyles.ExportStyleToFile; saveFileDialogStyle.InitialDirectory = Configuration.DataDirectory; if (_isSubStationAlpha) { saveFileDialogStyle.Filter = SubStationAlpha.NameOfFormat + "|*.ssa|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; saveFileDialogStyle.FileName = "my_styles.ssa"; } else { saveFileDialogStyle.Filter = AdvancedSubStationAlpha.NameOfFormat + "|*.ass|" + Configuration.Settings.Language.General.AllFiles + "|*.*"; saveFileDialogStyle.FileName = "my_styles.ass"; } if (saveFileDialogStyle.ShowDialog(this) == DialogResult.OK) { if (File.Exists(saveFileDialogStyle.FileName)) { Encoding encoding = null; var s = new Subtitle(); var format = s.LoadSubtitle(saveFileDialogStyle.FileName, out encoding, null); if (format == null) { MessageBox.Show("Not subtitle format: " + _format.Name); return; } else if (format.Name != _format.Name) { MessageBox.Show(string.Format("Cannot save {1} style in {0} file!", format.Name, _format.Name)); return; } else { var sb = new StringBuilder(); bool stylesOn = false; bool done = false; string styleFormat = "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"; foreach (string line in File.ReadAllLines(saveFileDialogStyle.FileName)) { if (line.StartsWith("format:", StringComparison.OrdinalIgnoreCase)) { styleFormat = line; } else if (line.StartsWith("style:", StringComparison.OrdinalIgnoreCase)) { stylesOn = true; } else if (stylesOn && !done) { done = true; SsaStyle style = GetSsaStyle(styleName); if (_isSubStationAlpha) { sb.AppendLine(style.ToRawSsa(styleFormat)); } else { sb.AppendLine(style.ToRawAss(styleFormat)); } } sb.AppendLine(line); if (stylesOn && line.Replace(" ", string.Empty).TrimStart().StartsWith("style:" + styleName.Replace(" ", string.Empty).Trim() + ",", StringComparison.OrdinalIgnoreCase)) { MessageBox.Show(string.Format(Configuration.Settings.Language.SubStationAlphaStyles.StyleAlreadyExits, styleName)); return; } } File.WriteAllText(saveFileDialogStyle.FileName, sb.ToString(), Encoding.UTF8); } } else { var sb = new StringBuilder(); foreach (var line in _header.Replace(Environment.NewLine, "\n").Split('\n')) { if (line.StartsWith("style:", StringComparison.OrdinalIgnoreCase)) { if (line.ToLower().Replace(" ", string.Empty).StartsWith("style:" + styleName.ToLower().Trim())) sb.AppendLine(line); } else { sb.AppendLine(line); } } string content = sb.ToString(); if (content.TrimEnd().EndsWith("[Events]")) { content = content.Trim() + Environment.NewLine + "Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text" + Environment.NewLine + "Dialogue: 0,0:00:31.91,0:00:33.91,Default,,0,0,0,,My Styles :)"; } File.WriteAllText(saveFileDialogStyle.FileName, content, Encoding.UTF8); } } labelStatus.Text = string.Format(Configuration.Settings.Language.SubStationAlphaStyles.StyleXExportedToFileY, styleName, saveFileDialogStyle.FileName); timerClearStatus.Start(); }
public void OpenSubtitle(string fileName, bool requireSaveAs, Encoding useThisEncoding = null) { if (System.IO.File.Exists(fileName)) { // bool videoFileLoaded = false; var file = new FileInfo(fileName); var ext = file.Extension.ToLowerInvariant(); _subtitle = new Subtitle(); Encoding encoding = useThisEncoding; if (encoding == null) { LanguageAutoDetect.GetEncodingFromFile(fileName); } SubtitleFormat format = _subtitle.LoadSubtitle(fileName, out encoding, encoding); // check for idx file if (format == null && file.Length > 100 && ext == ".idx") { MessageBox.Show(_language.ErrorLoadIdx); return; } // check for .rar file if (format == null && file.Length > 100 && FileUtil.IsRar(fileName)) { MessageBox.Show(_language.ErrorLoadRar); return; } // check for .zip file if (format == null && file.Length > 100 && FileUtil.IsZip(fileName)) { MessageBox.Show(_language.ErrorLoadZip); return; } // check for .png file if (format == null && file.Length > 100 && FileUtil.IsPng(fileName)) { MessageBox.Show(_language.ErrorLoadPng); return; } // check for .jpg file if (format == null && file.Length > 100 && FileUtil.IsJpg(fileName)) { MessageBox.Show(_language.ErrorLoadJpg); return; } // check for .srr file if (format == null && file.Length > 100 && ext == ".srr" && FileUtil.IsSrr(fileName)) { MessageBox.Show(_language.ErrorLoadSrr); return; } // check for Torrent file if (format == null && file.Length > 50 && FileUtil.IsTorrentFile(fileName)) { MessageBox.Show(_language.ErrorLoadTorrent); return; } // check for all binary zeroes (I've heard about this a few times... perhaps related to crashes?) if (format == null && file.Length > 50 && FileUtil.IsSubtitleFileAllBinaryZeroes(fileName)) { MessageBox.Show(_language.ErrorLoadBinaryZeroes); return; } if (format == null && file.Length < 500000) { // Try to use a generic subtitle format parser (guessing subtitle format) try { var enc = LanguageAutoDetect.GetEncodingFromFile(fileName); var s = System.IO.File.ReadAllText(fileName, enc); var uknownFormatImporter = new UknownFormatImporter { UseFrames = true }; var genericParseSubtitle = uknownFormatImporter.AutoGuessImport(s.SplitToLines()); if (genericParseSubtitle.Paragraphs.Count > 1) { _subtitle = genericParseSubtitle; //ShowStatus("Guessed subtitle format via generic subtitle parser!"); } } catch { } } if (format != null && format.IsFrameBased) _subtitle.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); else _subtitle.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); if (format != null) { if (Configuration.Settings.General.RemoveBlankLinesWhenOpening) { _subtitle.RemoveEmptyLines(); } foreach (var p in _subtitle.Paragraphs) { // Replace U+0456 (CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I) by U+0069 (LATIN SMALL LETTER I) p.Text = p.Text.Replace("<і>", "<i>").Replace("</і>", "</i>"); } _subtitleFileName = fileName; SetSubtitleFormat(format); Window.SetEncoding(encoding.BodyName); SetNewSubtitle(_subtitle); Configuration.Settings.RecentFiles.Add(fileName, null, null); UpdateRecentFiles(); TryToFindAndOpenVideoFile(_subtitleFileName); ShowAudioVisualizerIfDataIsReady(); } else { // } } else { MessageBox.Show(string.Format(_language.FileNotFound, 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); }