OSDN Git Service

0cfbff3f86fe16f871b7d3fe9f5be12e553398c2
[handbrake-jp/handbrake-jp-git.git] / win / C# / Parsing / Title.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Drawing;\r
4 using System.IO;\r
5 using System.Windows.Forms;\r
6 using System.Text.RegularExpressions;\r
7 \r
8 namespace Handbrake.Parsing\r
9 {\r
10     /// <summary>\r
11     /// An object that represents a single Title of a DVD\r
12     /// </summary>\r
13     public class Title\r
14     {\r
15         private List<Chapter> m_chapters;\r
16         /// <summary>\r
17         /// Collection of chapters in this Title\r
18         /// </summary>\r
19         public List<Chapter> Chapters\r
20         {\r
21             get\r
22             {\r
23                 return this.m_chapters;\r
24             }\r
25         }\r
26 \r
27         private List<AudioTrack> m_audioTracks;\r
28         /// <summary>\r
29         /// Collection of audio tracks associated with this Title\r
30         /// </summary>\r
31         public List<AudioTrack> AudioTracks\r
32         {\r
33             get\r
34             {\r
35                 return this.m_audioTracks;\r
36             }\r
37         }\r
38 \r
39         private List<Subtitle> m_subtitles;\r
40         /// <summary>\r
41         /// Collection of subtitles associated with this Title\r
42         /// </summary>\r
43         public List<Subtitle> Subtitles\r
44         {\r
45             get\r
46             {\r
47                 return this.m_subtitles;\r
48             }\r
49         }\r
50 \r
51         private int m_titleNumber;\r
52         /// <summary>\r
53         /// The track number of this Title\r
54         /// </summary>\r
55         public int TitleNumber\r
56         {\r
57             get\r
58             {\r
59                 return this.m_titleNumber;\r
60             }\r
61         }\r
62 \r
63         private TimeSpan m_duration;\r
64         /// <summary>\r
65         /// The length in time of this Title\r
66         /// </summary>\r
67         public TimeSpan Duration\r
68         {\r
69             get\r
70             {\r
71                 return this.m_duration;\r
72             }\r
73         }\r
74 \r
75         private Size m_resolution;\r
76         /// <summary>\r
77         /// The resolution (width/height) of this Title\r
78         /// </summary>\r
79         public Size Resolution\r
80         {\r
81             get\r
82             {\r
83                 return this.m_resolution;\r
84             }\r
85         }\r
86 \r
87         private float m_aspectRatio;\r
88         /// <summary>\r
89         /// The aspect ratio of this Title\r
90         /// </summary>\r
91         public float AspectRatio\r
92         {\r
93             get\r
94             {\r
95                 return this.m_aspectRatio;\r
96             }\r
97         }\r
98 \r
99         private int[] m_autoCrop;\r
100         /// <summary>\r
101         /// The automatically detected crop region for this Title.\r
102         /// This is an int array with 4 items in it as so:\r
103         /// 0: \r
104         /// 1: \r
105         /// 2: \r
106         /// 3: \r
107         /// </summary>\r
108         public int[] AutoCropDimensions\r
109         {\r
110             get\r
111             {\r
112                 return this.m_autoCrop;\r
113             }\r
114         }\r
115 \r
116         /// <summary>\r
117         /// The constructor for this object\r
118         /// </summary>\r
119         public Title()\r
120         {\r
121             this.m_audioTracks = new List<AudioTrack>();\r
122             this.m_chapters = new List<Chapter>();\r
123             this.m_subtitles = new List<Subtitle>();\r
124         }\r
125 \r
126         /// <summary>\r
127         /// Override of the ToString method to provide an easy way to use this object in the UI\r
128         /// </summary>\r
129         /// <returns>A string representing this track in the format: {title #} (00:00:00)</returns>\r
130         public override string ToString()\r
131         {\r
132             return string.Format("{0} ({1:00}:{2:00}:{3:00})", this.m_titleNumber, this.m_duration.Hours,\r
133              this.m_duration.Minutes, this.m_duration.Seconds);\r
134         }\r
135 \r
136         public static Title Parse(StringReader output)\r
137         {\r
138             Title thisTitle = new Title();\r
139             try\r
140             {\r
141                 Match m = Regex.Match(output.ReadLine(), @"^\+ title ([0-9]*):");\r
142                 // Match track number for this title\r
143                 if (m.Success)\r
144                     thisTitle.m_titleNumber = int.Parse(m.Groups[1].Value.Trim().ToString());\r
145 \r
146                 output.ReadLine();\r
147 \r
148                 // Get duration for this title\r
149 \r
150                 m = Regex.Match(output.ReadLine(), @"^  \+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})");\r
151                 if (m.Success)\r
152                     thisTitle.m_duration = TimeSpan.Parse(m.Groups[1].Value);\r
153 \r
154                 // Get resolution, aspect ratio and FPS for this title\r
155                 m = Regex.Match(output.ReadLine(), @"^  \+ size: ([0-9]*)x([0-9]*), aspect: ([0-9]*\.[0-9]*), ([0-9]*\.[0-9]*) fps");\r
156                 if (m.Success)\r
157                 {\r
158                     thisTitle.m_resolution = new Size(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));\r
159                     thisTitle.m_aspectRatio = float.Parse(m.Groups[3].Value, Functions.CLI.Culture);\r
160                 }\r
161 \r
162                 // Get autocrop region for this title\r
163                 m = Regex.Match(output.ReadLine(), @"^  \+ autocrop: ([0-9]*)/([0-9]*)/([0-9]*)/([0-9]*)");\r
164                 if (m.Success)\r
165                     thisTitle.m_autoCrop = new int[4] { int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value), int.Parse(m.Groups[3].Value), int.Parse(m.Groups[4].Value) };\r
166 \r
167                 thisTitle.m_chapters.AddRange(Chapter.ParseList(output));\r
168 \r
169                 thisTitle.m_audioTracks.AddRange(AudioTrack.ParseList(output));\r
170 \r
171                 thisTitle.m_subtitles.AddRange(Subtitle.ParseList(output));\r
172             }\r
173             catch (Exception exc)\r
174             {\r
175                 MessageBox.Show("Title.cs - Parse " + exc.ToString());\r
176             }\r
177 \r
178             return thisTitle;\r
179         }\r
180 \r
181         public static Title[] ParseList(string output)\r
182         {\r
183             List<Title> titles = new List<Title>();\r
184             try\r
185             {\r
186                 StringReader sr = new StringReader(output);\r
187                 while ((char)sr.Peek() == '+')\r
188                 {\r
189                     titles.Add(Title.Parse(sr));\r
190                 }\r
191             }\r
192             catch (Exception exc)\r
193             {\r
194                 MessageBox.Show("Title.cs - ParseList " + exc.ToString());\r
195             }\r
196             return titles.ToArray();\r
197         }\r
198     }\r
199 }\r