OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain / QueryGenerator.cs
1 using System;\r
2 using System.Collections;\r
3 using System.Text;\r
4 using System.Windows.Forms;\r
5 using System.Globalization;\r
6 using System.IO;\r
7 using System.Collections.Generic;\r
8 \r
9 namespace Handbrake\r
10 {\r
11     class QueryGenerator\r
12     {\r
13         /// <summary>\r
14         /// Generates a CLI query based on the GUI widgets.\r
15         /// </summary>\r
16         /// <param name="mainWindow"></param>\r
17         /// <returns>The CLI String</returns>\r
18         public string GenerateTheQuery(frmMain mainWindow)\r
19         {\r
20             // Source tab\r
21             string query = "";\r
22 \r
23             if ((mainWindow.text_source.Text != "") && (mainWindow.text_source.Text.Trim() != "Click 'Source' to continue"))\r
24                 query = " -i " + '"' + mainWindow.text_source.Text + '"';\r
25 \r
26             if (mainWindow.drp_dvdtitle.Text != "Automatic")\r
27             {\r
28                 string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' ');\r
29                 query += " -t " + titleInfo[0];\r
30             }\r
31 \r
32             if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text && mainWindow.drop_chapterStart.Text != "Auto")\r
33                 query += " -c " + mainWindow.drop_chapterStart.Text;\r
34             else if (mainWindow.drop_chapterStart.Text == "Auto" && mainWindow.drop_chapterFinish.Text != "Auto")\r
35                 query += " -c " + "0-" + mainWindow.drop_chapterFinish.Text;\r
36             else if (mainWindow.drop_chapterStart.Text != "Auto" && mainWindow.drop_chapterFinish.Text != "Auto")\r
37                 query += " -c " + mainWindow.drop_chapterStart.Text + "-" + mainWindow.drop_chapterFinish.Text;\r
38 \r
39             // Destination tab\r
40             if (mainWindow.text_destination.Text != "")\r
41                 query += " -o " + '"' + mainWindow.text_destination.Text + '"';\r
42 \r
43             query += generateTabbedComponentsQuery(mainWindow);\r
44             return query;\r
45         }\r
46 \r
47         /// <summary>\r
48         /// Generates a CLI query for the preview function.\r
49         /// This basically forces a shortened version of the encdode.\r
50         /// </summary>\r
51         /// <param name="mainWindow"></param>\r
52         /// <returns>Returns a CLI query String.</returns>\r
53         public string GeneratePreviewQuery(frmMain mainWindow, string duration, string preview)\r
54         {\r
55             int seconds = 0;\r
56             int.TryParse(duration, out seconds);\r
57 \r
58             // Source tab\r
59             string query = "";\r
60 \r
61             if ((mainWindow.text_source.Text != "") && (mainWindow.text_source.Text.Trim() != "Click 'Source' to continue"))\r
62                 query = " -i " + '"' + mainWindow.text_source.Text + '"';\r
63 \r
64             if (mainWindow.drp_dvdtitle.Text != "Automatic")\r
65             {\r
66                 string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' ');\r
67                 query += " -t " + titleInfo[0];\r
68             }\r
69 \r
70             query += " --start-at-preview " + preview;\r
71             query += " --stop-at-duration " + duration + " ";\r
72 \r
73             // Destination tab\r
74             if (mainWindow.text_destination.Text != "")\r
75                 query += " -o " + '"' + mainWindow.text_destination.Text.Replace(".m", "_sample.m").Replace(".avi", "_sample.avi").Replace(".ogm", "_sample.ogm") + '"';\r
76 \r
77             query += generateTabbedComponentsQuery(mainWindow);\r
78             return query;\r
79         }\r
80 \r
81         /// <summary>\r
82         /// Generates part of the CLI query, for the tabbed components only.\r
83         /// </summary>\r
84         /// <param name="mainWindow"></param>\r
85         /// <param name="source"></param>\r
86         /// <returns></returns>\r
87         public string generateTabbedComponentsQuery(frmMain mainWindow)\r
88         {\r
89             string query = "";\r
90 \r
91             // The Output Settings box above the tabbed section.\r
92             #region Output Settings Box\r
93             query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", "");\r
94 \r
95             // These are output settings features\r
96             if (mainWindow.check_largeFile.Checked)\r
97                 query += " -4 ";\r
98 \r
99             if (mainWindow.check_iPodAtom.Checked)\r
100                 query += " -I ";\r
101 \r
102             if (mainWindow.check_optimiseMP4.Checked)\r
103                 query += " -O ";\r
104             #endregion\r
105 \r
106             // Picture Settings Tab\r
107             #region Picture Settings Tab\r
108 \r
109             // Use MaxWidth for built-in presets and width for user settings.\r
110             if (mainWindow.maxWidth == 0)\r
111             {\r
112 \r
113                 if (mainWindow.text_width.Text != "")\r
114                     query += " -w " + mainWindow.text_width.Text;\r
115             }\r
116             else\r
117             {\r
118                 if (mainWindow.text_width.Text != "")\r
119                     query += " -X " + mainWindow.text_width.Text;\r
120             }\r
121 \r
122             // Use MaxHeight for built-in presets and height for user settings.\r
123             if (mainWindow.maxHeight == 0)\r
124             {\r
125                 if (mainWindow.text_height.Text != "")\r
126                     query += " -l " + mainWindow.text_height.Text;\r
127             }\r
128             else\r
129             {\r
130                 if (mainWindow.text_height.Text != "")\r
131                     query += " -Y " + mainWindow.text_height.Text;\r
132             }\r
133 \r
134             string cropTop = mainWindow.text_top.Text;\r
135             string cropBottom = mainWindow.text_bottom.Text;\r
136             string cropLeft = mainWindow.text_left.Text;\r
137             string cropRight = mainWindow.text_right.Text;\r
138 \r
139             if (mainWindow.check_customCrop.Checked)\r
140             {\r
141                 if (mainWindow.text_top.Text == string.Empty)\r
142                     cropTop = "0";\r
143                 if (mainWindow.text_bottom.Text == string.Empty)\r
144                     cropBottom = "0";\r
145                 if (mainWindow.text_left.Text == string.Empty)\r
146                     cropLeft = "0";\r
147                 if (mainWindow.text_right.Text == string.Empty)\r
148                     cropRight = "0";\r
149 \r
150                 query += " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight;\r
151             }\r
152 \r
153             switch (mainWindow.drp_deInterlace_option.Text)\r
154             {\r
155                 case "None":\r
156                     query += "";\r
157                     break;\r
158                 case "Fast":\r
159                     query += " --deinterlace=\"fast\"";\r
160                     break;\r
161                 case "Slow":\r
162                     query += " --deinterlace=\"slow\"";\r
163                     break;\r
164                 case "Slower":\r
165                     query += " --deinterlace=\"slower\"";\r
166                     break;\r
167                 case "Slowest":\r
168                     query += " --deinterlace=\"slowest\"";\r
169                     break;\r
170                 default:\r
171                     query += "";\r
172                     break;\r
173             }\r
174 \r
175             if (mainWindow.check_decomb.Checked)\r
176             {\r
177                 string decombValue = Properties.Settings.Default.decomb;\r
178                 if (decombValue != "" && decombValue != Properties.Settings.Default.default_decomb)\r
179                     query += " --decomb=\"" + decombValue + "\"";\r
180                 else\r
181                     query += " --decomb ";\r
182             }\r
183 \r
184             if (mainWindow.drp_anamorphic.SelectedIndex == 1)\r
185                 query += " -p ";\r
186             else if (mainWindow.drp_anamorphic.SelectedIndex == 2)\r
187                 query += " -P ";\r
188 \r
189             if (mainWindow.slider_deblock.Value != 4)\r
190                 query += " --deblock=" + mainWindow.slider_deblock.Value;\r
191 \r
192             if (mainWindow.check_detelecine.Checked)\r
193                 query += " --detelecine";\r
194             #endregion\r
195 \r
196             // Video Settings Tab\r
197             #region Video Settings Tab\r
198 \r
199             switch (mainWindow.drp_videoEncoder.Text)\r
200             {\r
201                 case "MPEG-4 (FFmpeg)":\r
202                     query += " -e ffmpeg";\r
203                     break;\r
204                 case "MPEG-4 (XviD)":\r
205                     query += " -e xvid";\r
206                     break;\r
207                 case "H.264 (x264)":\r
208                     query += " -e x264";\r
209                     break;\r
210                 case "VP3 (Theora)":\r
211                     query += " -e theora";\r
212                     break;\r
213                 default:\r
214                     query += " -e x264";\r
215                     break;\r
216             }\r
217 \r
218             if (mainWindow.check_grayscale.Checked)\r
219                 query += " -g ";\r
220 \r
221             // Video Settings\r
222             if (mainWindow.text_bitrate.Text != "")\r
223                 query += " -b " + mainWindow.text_bitrate.Text;\r
224 \r
225             if (mainWindow.text_filesize.Text != "")\r
226                 query += " -S " + mainWindow.text_filesize.Text;\r
227 \r
228             // Video Quality Setting\r
229             double videoQuality = mainWindow.slider_videoQuality.Value;\r
230             if (videoQuality != 0)\r
231             {\r
232                 videoQuality = videoQuality / 100;\r
233                 query += " -q " + videoQuality.ToString(new CultureInfo("en-US"));\r
234             }\r
235 \r
236             if (mainWindow.check_2PassEncode.Checked)\r
237                 query += " -2 ";\r
238 \r
239             if (mainWindow.check_turbo.Checked)\r
240                 query += " -T ";\r
241 \r
242             if (mainWindow.drp_videoFramerate.Text != "Same as source")\r
243                 query += " -r " + mainWindow.drp_videoFramerate.Text;\r
244 \r
245             switch (mainWindow.drp_deNoise.Text)\r
246             {\r
247                 case "None":\r
248                     query += "";\r
249                     break;\r
250                 case "Weak":\r
251                     query += " --denoise=\"weak\"";\r
252                     break;\r
253                 case "Medium":\r
254                     query += " --denoise=\"medium\"";\r
255                     break;\r
256                 case "Strong":\r
257                     query += " --denoise=\"strong\"";\r
258                     break;\r
259                 default:\r
260                     query += "";\r
261                     break;\r
262             }\r
263             #endregion\r
264 \r
265             // Audio Settings Tab\r
266             #region Audio Settings Tab\r
267 \r
268             ListView audioTracks = mainWindow.lv_audioList;\r
269             List<string> tracks = new List<string>();\r
270             List<string> codecs = new List<string>();\r
271             List<string> mixdowns = new List<string>();\r
272             List<string> samplerates = new List<string>();\r
273             List<string> bitrates = new List<string>();\r
274             List<string> drcs = new List<string>();\r
275 \r
276             // No Audio\r
277             if (audioTracks.Items.Count == 0)\r
278                 query += " -a none ";\r
279 \r
280             // Gather information about each audio track and store them in the declared lists.\r
281             foreach (ListViewItem row in audioTracks.Items)\r
282             {\r
283                 // Audio Track (-a)\r
284                 if (row.Text == "Automatic")\r
285                     tracks.Add("1");\r
286                 else if (row.Text != "None")\r
287                 {\r
288                     string[] tempSub = row.Text.Split(' ');\r
289                     tracks.Add(tempSub[0]);\r
290                 }\r
291 \r
292                 // Audio Codec (-E)\r
293                 if (row.SubItems[1].Text != String.Empty)\r
294                     codecs.Add(getAudioEncoder(row.SubItems[1].Text));\r
295 \r
296                 // Audio Mixdown (-6)\r
297                 if (row.SubItems[2].Text != String.Empty)\r
298                     mixdowns.Add(getMixDown(row.SubItems[2].Text));\r
299 \r
300                 // Sample Rate (-R)\r
301                 if (row.SubItems[3].Text != String.Empty)\r
302                     samplerates.Add(row.SubItems[3].Text.Replace("Auto", "0"));\r
303 \r
304                 // Audio Bitrate (-B)\r
305                 if (row.SubItems[4].Text != String.Empty)\r
306                     bitrates.Add(row.SubItems[4].Text.Replace("Auto", "0"));\r
307 \r
308                 // DRC (-D)\r
309                 if (row.SubItems[5].Text != String.Empty)\r
310                     drcs.Add(row.SubItems[5].Text);\r
311             }\r
312 \r
313             // Audio Track (-a)\r
314             String audioItems = "";\r
315             Boolean firstLoop = true;\r
316 \r
317             foreach (String item in tracks)\r
318             {\r
319                 if (firstLoop == true)\r
320                 {\r
321                     audioItems = item; firstLoop = false;\r
322                 }\r
323                 else\r
324                     audioItems += "," + item;\r
325             }\r
326             if (audioItems.Trim() != String.Empty)\r
327                 query += " -a " + audioItems;\r
328             firstLoop = true; audioItems = ""; // Reset for another pass.\r
329 \r
330             // Audio Codec (-E)\r
331             foreach (String item in codecs)\r
332             {\r
333                 if (firstLoop == true)\r
334                 {\r
335                     audioItems = item; firstLoop = false;\r
336                 }\r
337                 else\r
338                     audioItems += "," + item;\r
339             }\r
340             query += " -E " + audioItems;\r
341             firstLoop = true; audioItems = ""; // Reset for another pass.\r
342 \r
343             // Audio Mixdown (-6)\r
344             foreach (String item in mixdowns)\r
345             {\r
346                 if (firstLoop == true)\r
347                 {\r
348                     audioItems = item; firstLoop = false;\r
349                 }\r
350                 else\r
351                     audioItems += "," + item;\r
352             }\r
353             query += " -6 " + audioItems;\r
354             firstLoop = true; audioItems = ""; // Reset for another pass.\r
355 \r
356             // Sample Rate (-R)\r
357             foreach (String item in samplerates)\r
358             {\r
359                 if (firstLoop == true)\r
360                 {\r
361                     audioItems = item; firstLoop = false;\r
362                 }\r
363                 else\r
364                     audioItems += "," + item;\r
365             }\r
366             query += " -R " + audioItems;\r
367             firstLoop = true; audioItems = ""; // Reset for another pass.\r
368 \r
369             // Audio Bitrate (-B)\r
370             foreach (String item in bitrates)\r
371             {\r
372                 if (firstLoop == true)\r
373                 {\r
374                     audioItems = item; firstLoop = false;\r
375                 }\r
376                 else\r
377                     audioItems += "," + item;\r
378             }\r
379             query += " -B " + audioItems;\r
380             firstLoop = true; audioItems = ""; // Reset for another pass.\r
381 \r
382             // DRC (-D)\r
383             foreach (String item in drcs)\r
384             {\r
385                 if (firstLoop == true)\r
386                 {\r
387                     audioItems = item; firstLoop = false;\r
388                 }\r
389                 else\r
390                     audioItems += "," + item;\r
391             }\r
392             query += " -D " + audioItems;\r
393             firstLoop = true; audioItems = ""; // Reset for another pass.\r
394 \r
395 \r
396             // Subtitles\r
397             string subtitles = mainWindow.drp_subtitle.Text;\r
398             if (subtitles == "Autoselect")\r
399                 query += " -U ";\r
400             else if (subtitles != "" && subtitles != "None")\r
401             {\r
402                 string[] tempSub;\r
403                 tempSub = subtitles.Split(' ');\r
404                 query += " -s " + tempSub[0];\r
405             }\r
406 \r
407             if (mainWindow.check_forced.Checked)\r
408                 query += " -F ";\r
409 \r
410             #endregion\r
411 \r
412             // Chapter Markers Tab\r
413             #region Chapter Markers\r
414 \r
415             // Attach Source name and dvd title to the start of the chapters.csv filename.\r
416             // This is for the queue. It allows different chapter name files for each title.\r
417             string source_name = mainWindow.text_source.Text;\r
418             string[] sourceName = source_name.Split('\\');\r
419             source_name = sourceName[sourceName.Length - 1];\r
420             source_name = source_name.Replace("\"", "");\r
421 \r
422             string source_title = mainWindow.drp_dvdtitle.Text;\r
423             string[] titlesplit = source_title.Split(' ');\r
424             source_title = titlesplit[0];\r
425 \r
426             if (mainWindow.Check_ChapterMarkers.Checked)\r
427             {\r
428                 if ((source_name.Trim() != "Click 'Source' to continue") && (source_name.Trim() != ""))\r
429                 {\r
430                     string path = "";\r
431                     if (source_title != "Automatic")\r
432                         path = Path.Combine(Path.GetTempPath(), source_name + "-" + source_title + "-chapters.csv");\r
433                     else\r
434                         path = Path.Combine(Path.GetTempPath(), source_name + "-chapters.csv");\r
435 \r
436                     if (chapterCSVSave(mainWindow, path) == false)\r
437                         query += " -m ";\r
438                     else\r
439                         query += " --markers=" + "\"" + path + "\"";\r
440                 }\r
441                 else\r
442                     query += " -m";\r
443             }\r
444             #endregion\r
445 \r
446             // H264 Tab\r
447             #region  H264 Tab\r
448             if (mainWindow.rtf_x264Query.Text != "")\r
449                 query += " -x " + mainWindow.rtf_x264Query.Text;\r
450             #endregion\r
451 \r
452             // Other\r
453             #region Processors / Other\r
454             string processors = Properties.Settings.Default.Processors;\r
455             if (processors != "Automatic")\r
456                 query += " -C " + processors + " ";\r
457 \r
458             query += " -v ";\r
459             #endregion\r
460 \r
461             return query;\r
462         }\r
463 \r
464         /// <summary>\r
465         /// Get the CLI equive of the audio mixdown from the widget name.\r
466         /// </summary>\r
467         /// <param name="selectedAudio"></param>\r
468         /// <returns></returns>\r
469         /// \r
470         private string getMixDown(string selectedAudio)\r
471         {\r
472             switch (selectedAudio)\r
473             {\r
474                 case "Automatic":\r
475                     return "auto";\r
476                 case "Mono":\r
477                     return "mono";\r
478                 case "Stereo":\r
479                     return "stereo";\r
480                 case "Dolby Surround":\r
481                     return "dpl1";\r
482                 case "Dolby Pro Logic II":\r
483                     return "dpl2";\r
484                 case "6 Channel Discrete":\r
485                     return "6ch";\r
486                 default:\r
487                     return "auto";\r
488             }\r
489         }\r
490 \r
491         /// <summary>\r
492         /// Get the CLI equiv of the audio encoder from the widget name.\r
493         /// </summary>\r
494         /// <param name="selectedEncoder"></param>\r
495         /// <returns></returns>\r
496         /// \r
497         private string getAudioEncoder(string selectedEncoder)\r
498         {\r
499             switch (selectedEncoder)\r
500             {\r
501                 case "AAC":\r
502                     return "faac";\r
503                 case "MP3":\r
504                     return "lame";\r
505                 case "Vorbis":\r
506                     return "vorbis";\r
507                 case "AC3":\r
508                     return "ac3";\r
509                 default:\r
510                     return "";\r
511             }\r
512         }\r
513 \r
514         /// <summary>\r
515         /// This function saves the data in the chapters tab, dataGridView into a CSV file called chapters.csv\r
516         /// in a directory specified by file_path_name\r
517         /// </summary>\r
518         /// <param name="mainWindow"></param>\r
519         /// <param name="file_path_name"></param>\r
520         /// <returns></returns>\r
521         private Boolean chapterCSVSave(frmMain mainWindow, string file_path_name)\r
522         {\r
523             try\r
524             {\r
525                 StringBuilder csv = new StringBuilder();\r
526 \r
527                 foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)\r
528                 {\r
529                     csv.Append(row.Cells[0].Value.ToString());\r
530                     csv.Append(",");\r
531                     csv.Append(row.Cells[1].Value.ToString());\r
532                     csv.Append(Environment.NewLine);\r
533                 }\r
534                 StreamWriter file = new StreamWriter(file_path_name);\r
535                 file.Write(csv.ToString());\r
536                 file.Close();\r
537                 file.Dispose();\r
538                 return true;\r
539 \r
540             }\r
541             catch (Exception exc)\r
542             {\r
543                 MessageBox.Show("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode \n\n" + exc.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
544                 return false;\r
545             }\r
546         }\r
547     }\r
548 }