/* Subtitle.cs $ This file is part of the HandBrake source code. Homepage: . It may be used under the terms of the GNU General Public License. */ namespace HandBrake.ApplicationServices.Parsing { using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using HandBrake.ApplicationServices.Functions; using HandBrake.ApplicationServices.Model.Encoding; /// /// An object that represents a subtitle associated with a Title, in a DVD /// public class Subtitle { /// /// Initializes a new instance of the class. /// public Subtitle() { } /// /// Initializes a new instance of the class. /// /// /// The track number. /// /// /// The language. /// /// /// The language code. /// /// /// The subtitle type. /// public Subtitle(int trackNumber, string language, string languageCode, SubtitleType subtitleType) { this.TrackNumber = trackNumber; this.Language = language; this.LanguageCode = languageCode; this.SubtitleType = subtitleType; } /// /// Gets or sets the track number of this Subtitle /// public int TrackNumber { get; set; } /// /// Gets or sets the The language (if detected) of this Subtitle /// public string Language { get; set; } /// /// Gets or sets the Langauage Code /// public string LanguageCode { get; set; } /// /// Gets or sets the Subtitle Type /// public SubtitleType SubtitleType { get; set; } /// /// Gets Subtitle Type /// public string TypeString { get { return EnumHelper.GetDescription(this.SubtitleType); } } /// /// Parse the input strings related to subtitles /// /// /// The output. /// /// /// A Subitle object /// public static Subtitle Parse(StringReader output) { string curLine = output.ReadLine(); // + 1, English (iso639-2: eng) (Text)(SSA) // + 1, English (iso639-2: eng) (Text)(UTF-8) Match m = Regex.Match(curLine, @"^ \+ ([0-9]*), ([A-Za-z, ]*) \((.*)\) \(([a-zA-Z]*)\)\(([a-zA-Z0-9\-]*)\)"); if (m.Success && !curLine.Contains("HandBrake has exited.")) { var thisSubtitle = new Subtitle { TrackNumber = int.Parse(m.Groups[1].Value.Trim()), Language = m.Groups[2].Value, LanguageCode = m.Groups[3].Value, }; switch (m.Groups[5].Value) { case "VOBSUB": thisSubtitle.SubtitleType = SubtitleType.VobSub; break; case "SRT": thisSubtitle.SubtitleType = SubtitleType.SRT; break; case "CC": thisSubtitle.SubtitleType = SubtitleType.CC; break; case "UTF-8": thisSubtitle.SubtitleType = SubtitleType.UTF8Sub; break; case "TX3G": thisSubtitle.SubtitleType = SubtitleType.TX3G; break; case "SSA": thisSubtitle.SubtitleType = SubtitleType.SSA; break; case "PGS": thisSubtitle.SubtitleType = SubtitleType.PGS; break; default: thisSubtitle.SubtitleType = SubtitleType.Unknown; break; } return thisSubtitle; } return null; } /// /// Parse a list of Subtitle tracks from an input string. /// /// /// The output. /// /// /// An array of Subtitle objects /// public static IEnumerable ParseList(StringReader output) { var subtitles = new List(); while ((char)output.Peek() != '+') { Subtitle thisSubtitle = Parse(output); if (thisSubtitle != null) subtitles.Add(thisSubtitle); else break; } return subtitles.ToArray(); } /// /// Override of the ToString method to make this object easier to use in the UI /// /// A string formatted as: {track #} {language} public override string ToString() { return string.Format("{0} {1} ({2})", TrackNumber, Language, TypeString); } } }