OSDN Git Service

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