OSDN Git Service

CLI: update the built in presets
[handbrake-jp/handbrake-jp-git.git] / win / C# / HandBrake.ApplicationServices / Parsing / Subtitle.cs
1 /*  Subtitle.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace HandBrake.ApplicationServices.Parsing\r
7 {\r
8     using System.Collections.Generic;\r
9     using System.IO;\r
10     using System.Text.RegularExpressions;\r
11 \r
12     using HandBrake.ApplicationServices.Model;\r
13     using HandBrake.Framework.Helpers;\r
14 \r
15     /// <summary>\r
16     /// An object that represents a subtitle associated with a Title, in a DVD\r
17     /// </summary>\r
18     public class Subtitle\r
19     {\r
20         /// <summary>\r
21         /// Gets or sets the track number of this Subtitle\r
22         /// </summary>\r
23         public int TrackNumber { get; set; }\r
24 \r
25         /// <summary>\r
26         /// Gets or sets the The language (if detected) of this Subtitle\r
27         /// </summary>\r
28         public string Language { get; set; }\r
29 \r
30         /// <summary>\r
31         /// Gets or sets the Langauage Code\r
32         /// </summary>\r
33         public string LanguageCode { get; set; }\r
34 \r
35         /// <summary>\r
36         /// Gets or sets the Subtitle Type\r
37         /// </summary>\r
38         public SubtitleType SubtitleType { get; set; }\r
39 \r
40         /// <summary>\r
41         /// Gets Subtitle Type\r
42         /// </summary>\r
43         public string TypeString\r
44         {\r
45             get\r
46             {\r
47                 return EnumHelper.GetDescription(this.SubtitleType);\r
48             }\r
49         }\r
50 \r
51         /// <summary>\r
52         /// Parse the input strings related to subtitles\r
53         /// </summary>\r
54         /// <param name="output">\r
55         /// The output.\r
56         /// </param>\r
57         /// <returns>\r
58         /// A Subitle object\r
59         /// </returns>\r
60         public static Subtitle Parse(StringReader output)\r
61         {\r
62             string curLine = output.ReadLine();\r
63 \r
64             // + 1, English (iso639-2: eng) (Text)(SSA)\r
65             // + 1, English (iso639-2: eng) (Text)(UTF-8)\r
66             Match m = Regex.Match(curLine, @"^    \+ ([0-9]*), ([A-Za-z, ]*) \((.*)\) \(([a-zA-Z]*)\)\(([a-zA-Z0-9\-]*)\)");\r
67 \r
68             if (m.Success && !curLine.Contains("HandBrake has exited."))\r
69             {\r
70                 var thisSubtitle = new Subtitle\r
71                                        {\r
72                                            TrackNumber = int.Parse(m.Groups[1].Value.Trim()),\r
73                                            Language = m.Groups[2].Value,\r
74                                            LanguageCode = m.Groups[3].Value,\r
75                                        };\r
76 \r
77                 switch (m.Groups[5].Value)\r
78                 {\r
79                     case "VOBSUB":\r
80                         thisSubtitle.SubtitleType = SubtitleType.VobSub;\r
81                         break;\r
82                     case "SRT":\r
83                         thisSubtitle.SubtitleType = SubtitleType.SRT;\r
84                         break;\r
85                     case "CC":\r
86                         thisSubtitle.SubtitleType = SubtitleType.CC;\r
87                         break;\r
88                     case "UTF-8":\r
89                         thisSubtitle.SubtitleType = SubtitleType.UTF8Sub;\r
90                         break;\r
91                     case "TX3G":\r
92                         thisSubtitle.SubtitleType = SubtitleType.TX3G;\r
93                         break;\r
94                     case "SSA":\r
95                         thisSubtitle.SubtitleType = SubtitleType.SSA;\r
96                         break;\r
97                     default:\r
98                         thisSubtitle.SubtitleType = SubtitleType.Unknown;\r
99                         break;\r
100                 }\r
101 \r
102                 return thisSubtitle;\r
103             }\r
104             return null;\r
105         }\r
106 \r
107         /// <summary>\r
108         /// Parse a list of Subtitle tracks from an input string.\r
109         /// </summary>\r
110         /// <param name="output">\r
111         /// The output.\r
112         /// </param>\r
113         /// <returns>\r
114         /// An array of Subtitle objects\r
115         /// </returns>\r
116         public static IEnumerable<Subtitle> ParseList(StringReader output)\r
117         {\r
118             var subtitles = new List<Subtitle>();\r
119             while ((char)output.Peek() != '+')\r
120             {\r
121                 Subtitle thisSubtitle = Parse(output);\r
122 \r
123                 if (thisSubtitle != null)\r
124                     subtitles.Add(thisSubtitle);\r
125                 else\r
126                     break;\r
127             }\r
128             return subtitles.ToArray();\r
129         }\r
130 \r
131         /// <summary>\r
132         /// Override of the ToString method to make this object easier to use in the UI\r
133         /// </summary>\r
134         /// <returns>A string formatted as: {track #} {language}</returns>\r
135         public override string ToString()\r
136         {\r
137             return string.Format("{0} {1} ({2})", TrackNumber, Language, TypeString);\r
138         }\r
139     }\r
140 }