// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// An object that represents a subtitle associated with a Title, in a DVD
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrake.ApplicationServices.Parsing
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using HandBrake.ApplicationServices.Model.Encoding;
using HandBrake.ApplicationServices.Utilities;
///
/// 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 this.SubtitleType == SubtitleType.ForeignAudioSearch ? "Foreign Audio Scan" : string.Format("{0} {1} ({2})", this.TrackNumber, this.Language, this.TypeString);
}
///
/// The equals.
///
///
/// The other.
///
///
/// The System.Boolean.
///
public bool Equals(Subtitle other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return other.TrackNumber == this.TrackNumber && object.Equals(other.Language, this.Language) && object.Equals(other.LanguageCode, this.LanguageCode) && object.Equals(other.SubtitleType, this.SubtitleType);
}
///
/// Determines whether the specified is equal to the current .
///
///
/// true if the specified is equal to the current ; otherwise, false.
///
/// The to compare with the current . 2
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != typeof(Subtitle))
{
return false;
}
return Equals((Subtitle)obj);
}
///
/// Serves as a hash function for a particular type.
///
///
/// A hash code for the current .
///
/// 2
public override int GetHashCode()
{
unchecked
{
int result = this.TrackNumber;
result = (result * 397) ^ (this.Language != null ? this.Language.GetHashCode() : 0);
result = (result * 397) ^ (this.LanguageCode != null ? this.LanguageCode.GetHashCode() : 0);
result = (result * 397) ^ this.SubtitleType.GetHashCode();
return result;
}
}
}
}