Initial commit
[biamove.git] / miscdialogs.py
1 # Miscellaneous dialogs for the BiaMovE application
2
3 import Tkinter
4 import tkFileDialog
5 import tkSimpleDialog
6 import tkMessageBox
7 import os.path
8 import sys
9 import ConfigParser as CP
10
11 class DVDInfoDialog (tkSimpleDialog.Dialog):
12 """ Class to display the DVD information (works only on *NIX and only if the biadvdlister
13 executable program is installed """
14 def __init__ (self, master, dvddevice):
15 self.dvddevice = dvddevice
16 tkSimpleDialog.Dialog.__init__ (self, master, "DVD Information")
17
18 def fill_info (self, master):
19 if self.dvddevice.strip() == "":
20 self.dvddevice = "/dev/dvd"
21
22 fi, fo, fe = os.popen3 ("biadvdlister --dvd-device " + self.dvddevice)
23 infos = fo.readlines ()
24 if infos == []:
25 errors = fe.readlines ()
26 i = 1
27 for error in errors:
28 Tkinter.Label (master, text=error.strip()).grid (column=0, row=i, columnspan=2)
29 i += 1
30 else:
31 r = 1
32 c = 0
33 for info in infos:
34 rec = info.split ()
35 for field in rec:
36 Tkinter.Label (master, text=field).grid (column=c, row=r)
37 c += 1
38 r += 1
39 c = 0
40
41 def body (self, master):
42 Tkinter.Label (master, text="DVD information (you need the biadvdlister program installed for this feature)", fg="darkblue", wraplength=280).grid (column=0, row=0, columnspan=2)
43
44 self.fill_info (master)
45
46 class DVDDialog (tkSimpleDialog.Dialog):
47 """ Class to choose DVD device and set DVD options """
48 def apply (self):
49 self.result = "dvd://" + self.dvdtrack.get ()
50
51 self.result_args = ""
52 if self.allchapters.get() == 0:
53 self.result_args += " -chapter " + self.startchapter.get()
54 if self.endchapter.get().strip () != "":
55 self.result_args += "-" + self.endchapter.get()
56 if self.dvddevice.get().strip() != "":
57 self.result_args += " -dvd-device " + self.dvddevice.get()
58
59 self.result = self.result.strip ()
60 self.result_args = self.result_args.strip ()
61
62 def on_dvd_info (self):
63 if sys.platform.startswith ('win'):
64 tkMessageBox.showerror ("Cannot show info", "The DVD information feature does not work on Windows")
65 else:
66 dvdinfodlg = DVDInfoDialog (self, self.dvddevice.get())
67
68 def body (self, master):
69 Tkinter.Label (master, text="DVD input options (see Misc Options for choosing subtitles/audio language)", fg="darkblue", wraplength=280).grid (column=0, row=0, columnspan=3)
70
71 Tkinter.Label (master, text="Title/track #").grid (column=0, row=1)
72
73 self.dvdtrack = Tkinter.StringVar ()
74 self.dvdtrack.set (1)
75 Tkinter.Entry (master, textvariable=self.dvdtrack).grid (column=1, row=1)
76
77 Tkinter.Button (master, text="View DVD info...", command=self.on_dvd_info).grid (column=2, row=1)
78
79 self.allchapters = Tkinter.IntVar ()
80 self.allchapters.set (1)
81 Tkinter.Checkbutton (master, variable=self.allchapters, text="Encode all chapters on track", onvalue=1, offvalue=0).grid (column=0, row=2, columnspan=2)
82
83 Tkinter.Label (master, text="Start chapter #").grid (column=0, row=3)
84
85 self.startchapter = Tkinter.StringVar ()
86 Tkinter.Entry (master, textvariable=self.startchapter).grid (column=1, row=3)
87
88 Tkinter.Label (master, text="End chapter #").grid (column=0, row=4)
89
90 self.endchapter = Tkinter.StringVar ()
91 Tkinter.Entry (master, textvariable=self.endchapter).grid (column=1, row=4)
92
93 Tkinter.Label (master, text="DVD device (default: /dev/dvd)").grid (column=0, row=5)
94
95 self.dvddevice = Tkinter.StringVar ()
96 Tkinter.Entry (master, textvariable=self.dvddevice).grid (column=1, row=5)
97
98 class MiscOptionsDialog (tkSimpleDialog.Dialog):
99 """ Class to configure miscellaneous mencoder specific options """
100 def apply (self):
101 self.result = ""
102 if self.startpos.get().strip() != "":
103 self.result += "-ss " + self.startpos.get()
104 if self.endpos.get().strip() != "":
105 self.result += " -endpos " + self.endpos.get()
106 if self.resamplerate.get().strip() != "":
107 self.result += " -srate " + self.resamplerate.get()
108 if self.audiolang.get().strip() != "":
109 self.result += " -alang " + self.audiolang.get()
110 if self.subtitlelang.get().strip() != "":
111 self.result += " -slang " + self.subtitlelang.get()
112 if self.fourcc.get().strip() != "":
113 self.result += " -ffourcc " + self.fourcc.get()
114
115 self.result = self.result.strip ()
116
117 def body (self, master):
118 Tkinter.Label (master, text="Miscellaneous mencoder options (leave blank for defaults)", fg="darkblue").grid (column=0, row=0, columnspan=2)
119
120 Tkinter.Label (master, text="Input stream options", fg="darkblue").grid (column=0, row=1, columnspan=3, pady=10)
121
122 Tkinter.Label (master, text="Start encoding from (sec or hh:mm:ss)").grid (column=0, row=2)
123
124 self.startpos = Tkinter.StringVar ()
125 Tkinter.Entry (master, textvariable=self.startpos).grid (column=1, row=2)
126
127 Tkinter.Label (master, text="Stop encoding after (sec or hh:mm:ss or b/kb/mb)").grid (column=0, row=3)
128 self.endpos = Tkinter.StringVar ()
129 Tkinter.Entry (master, textvariable=self.endpos).grid (column=1, row=3)
130
131 Tkinter.Label (master, text="Audio and subtitle (only if available) options", fg="darkblue").grid (column=0, row=4, columnspan=2, pady=10)
132
133 Tkinter.Label (master, text="Resample audio (Hz)").grid (column=0, row=5)
134
135 self.resamplerate = Tkinter.StringVar ()
136 Tkinter.Entry (master, textvariable=self.resamplerate).grid (column=1, row=5)
137
138 Tkinter.Label (master, text="Audio language (code)").grid (column=0, row=6)
139
140 self.audiolang = Tkinter.StringVar ()
141 Tkinter.Entry (master, textvariable=self.audiolang).grid (column=1, row=6)
142
143 Tkinter.Label (master, text="Subtitle language (code)").grid (column=0, row=7)
144
145 self.subtitlelang = Tkinter.StringVar ()
146 Tkinter.Entry (master, textvariable=self.subtitlelang).grid (column=1, row=7)
147
148 Tkinter.Label (master, text="Advanced", fg="darkblue").grid (column=0, row=8, columnspan=2, pady=10)
149
150 Tkinter.Label (master, text="Override video four character code").grid (column=0, row=9)
151
152 self.fourcc = Tkinter.StringVar ()
153 Tkinter.Entry (master, textvariable=self.fourcc).grid (column=1, row=9)
154
155 class ProfileLoadDialog (tkSimpleDialog.Dialog):
156 """ Class to load a profile or simply delete existing profiles """
157 def apply (self):
158 self.result = self.conflist.get (Tkinter.ANCHOR)
159 if self.result.strip () == "":
160 self.result = None
161
162 def load_profiles (self):
163 cfgfile = os.path.join (os.path.expanduser ("~"), ".biamoverc")
164 config = CP.SafeConfigParser ()
165 config.read (cfgfile)
166
167 confsections = []
168 for section in config.sections ():
169 self.conflist.insert (Tkinter.END, section)
170
171 def on_delete_profile (self):
172 cfgfile = os.path.join (os.path.expanduser ("~"), ".biamoverc")
173 config = CP.SafeConfigParser ()
174 config.read (cfgfile)
175
176 delsection = self.conflist.get (Tkinter.ANCHOR)
177 self.conflist.delete (Tkinter.ANCHOR)
178
179 if (config.has_section (delsection)):
180 config.remove_section (delsection)
181 config.write (file (cfgfile, "w"))
182
183 def body (self, master):
184 Tkinter.Label (master, text = "Load profile", fg="darkblue").grid (column=0, row=0, columnspan=2)
185
186 frame = Tkinter.Frame(master)
187 scrollbar = Tkinter.Scrollbar(frame, orient=Tkinter.VERTICAL)
188 self.conflist = Tkinter.Listbox (frame, width=30, height=5, yscrollcommand=scrollbar.set)
189 scrollbar.config(command=self.conflist.yview)
190 scrollbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
191 self.conflist.pack (side=Tkinter.LEFT, fill=Tkinter.BOTH)
192 frame.grid (column=0, row=1)
193
194 Tkinter.Button (master, text="delete", command = self.on_delete_profile).grid (column=1, row=1)
195
196 self.load_profiles ()