OSDN Git Service

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