From c7963d8394729b51264a30becefffd8f4770989d Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Sun, 27 Jul 2014 23:52:14 +0200 Subject: [PATCH] Added settings window Added support for VLC as player Added support for comboboxes in the interfaces Fixed a bug in the names of the NTSC resolutions --- data/interface/wfile_properties.ui | 402 +++++++++++++++-------------- data/interface/wmain.ui | 40 +-- data/interface/wsettings.ui | 379 +++++++++++++++++++++++++++ src/devede/configuration_data.py | 23 +- src/devede/converter.py | 34 ++- src/devede/dvd_menu.py | 8 +- src/devede/error.py | 2 +- src/devede/executor.py | 18 +- src/devede/file_movie.py | 20 +- src/devede/interface_manager.py | 49 +++- src/devede/project.py | 7 +- src/devede/runner.py | 17 +- src/devede/settings.py | 100 +++++++ src/devede/vlc.py | 56 ++++ 14 files changed, 862 insertions(+), 293 deletions(-) create mode 100644 data/interface/wsettings.ui create mode 100644 src/devede/settings.py create mode 100644 src/devede/vlc.py diff --git a/data/interface/wfile_properties.ui b/data/interface/wfile_properties.ui index ef49a35..f14746c 100644 --- a/data/interface/wfile_properties.ui +++ b/data/interface/wfile_properties.ui @@ -142,206 +142,226 @@ False 12 - + True False - 4 - 4 + vertical - + True False - 0 - Original size (pixels): + + + True + False + 0 + Path: + + + False + True + 0 + + + + + True + False + True + 0 + middle + + + False + True + 1 + + - 0 - 1 - 1 - 1 + False + True + 0 - + True False - 0 + 4 + 4 + + + True + False + 0 + Original size (pixels): + + + 0 + 0 + 1 + 1 + + + + + True + False + 0 + + + 1 + 0 + 1 + 1 + + + + + True + False + 0 + Original length (seconds): + + + 0 + 1 + 1 + 1 + + + + + True + False + 0 + + + 1 + 1 + 1 + 1 + + + + + True + False + 8 + 0 + Original aspect ratio: + + + 4 + 0 + 1 + 1 + + + + + True + False + 8 + 0 + Frames per second: + + + 4 + 1 + 1 + 1 + + + + + True + False + 0 + + + 5 + 0 + 1 + 1 + + + + + True + False + 0 + + + 5 + 1 + 1 + 1 + + + + + True + False + 0 + end + + + 3 + 1 + 1 + 1 + + + + + True + False + 0 + + + 3 + 0 + 1 + 1 + + + + + True + False + 8 + 0 + Original audio rate (Kbits/sec): + + + 2 + 1 + 1 + 1 + + + + + True + False + 8 + 0 + Original video rate (Kbits/sec): + + + 2 + 0 + 1 + 1 + + - 1 - 1 - 1 - 1 - - - - - True - False - 0 - Original length (seconds): - - - 0 - 2 - 1 - 1 - - - - - True - False - 0 - - - 1 - 2 - 1 - 1 - - - - - True - False - 8 - 0 - Original aspect ratio: - - - 4 - 1 - 1 - 1 - - - - - True - False - 8 - 0 - Frames per second: - - - 4 - 2 - 1 - 1 - - - - - True - False - 0 - - - 5 - 1 - 1 - 1 - - - - - True - False - 0 - - - 5 - 2 - 1 - 1 - - - - - True - False - 0 - Path: - - - 0 - 0 - 1 - 1 - - - - - True - False - True - 0 - middle - - - 1 - 0 - 5 - 1 - - - - - True - False - 0 - end - - - 3 - 2 - 1 - 1 - - - - - True - False - 0 - - - 3 - 1 - 1 - 1 - - - - - True - False - 8 - 0 - Original audio rate (Kbits/sec): - - - 2 - 2 - 1 - 1 - - - - - True - False - baseline - 8 - 0 - Original video rate (Kbits/sec): - - - 2 - 1 - 1 - 1 + False + True + 1 @@ -1025,7 +1045,7 @@ - + 720x480 True True @@ -1042,7 +1062,7 @@ - + 704x480 True True @@ -1059,7 +1079,7 @@ - + 480x480 True True @@ -1076,7 +1096,7 @@ - + 352x480 True True @@ -1093,7 +1113,7 @@ - + 352x240 True True diff --git a/data/interface/wmain.ui b/data/interface/wmain.ui index a771a76..6ea3b84 100644 --- a/data/interface/wmain.ui +++ b/data/interface/wmain.ui @@ -129,53 +129,19 @@ True False - - gtk-cut - True - False - True - True - - - - - gtk-copy - True - False - True - True - - - - - gtk-paste - True - False - True - True - - - - - gtk-delete + + gtk-preferences True False True True + - - - True - False - _Ver - True - - True diff --git a/data/interface/wsettings.ui b/data/interface/wsettings.ui new file mode 100644 index 0000000..dd2e291 --- /dev/null +++ b/data/interface/wsettings.ui @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + False + True + center + dialog + False + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + True + + + False + True + 0 + + + + + gtk-ok + True + True + True + True + + + False + True + 1 + + + + + False + True + end + 0 + + + + + True + False + vertical + + + True + False + 0 + none + + + True + False + 12 + + + True + False + multicore_store + + + + 0 + + + + + + + + + True + False + <b>Multicore CPUs</b> + True + + + + + False + True + 0 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + False + + + True + False + Temporary files folder: + + + False + True + 2 + 0 + + + + + True + False + select-folder + + + True + True + 1 + + + + + + + + + True + False + <b>Folders</b> + True + + + + + False + True + 1 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + False + + + True + False + 4 + 1 + Play preview: + + + 0 + 0 + 1 + 1 + + + + + True + False + 4 + 1 + Get video info: + + + 0 + 1 + 1 + 1 + + + + + True + False + 4 + 1 + Convert menus: + + + 0 + 2 + 1 + 1 + + + + + True + False + 4 + 1 + Convert videos: + end + + + 0 + 3 + 1 + 1 + + + + + True + False + player_store + 0 + 0 + + + + 0 + + + + + 1 + 0 + 1 + 1 + + + + + True + False + analizer_store + + + + 0 + + + + + 1 + 1 + 1 + 1 + + + + + True + False + menuer_store + + + + 0 + + + + + 1 + 2 + 1 + 1 + + + + + True + False + converter_store + + + + 0 + + + + + 1 + 3 + 1 + 1 + + + + + + + + + True + False + <b>Backends</b> + True + + + + + False + True + 2 + + + + + False + True + 1 + + + + + + button1 + button2 + + + diff --git a/src/devede/configuration_data.py b/src/devede/configuration_data.py index 709170c..7a56a4c 100644 --- a/src/devede/configuration_data.py +++ b/src/devede/configuration_data.py @@ -33,10 +33,16 @@ class configuration(GObject.GObject): configuration.current_configuration = None return configuration.current_configuration + def __init__(self): + GObject.GObject.__init__(self) def fill_config(self): - GObject.GObject.__init__(self) + self.cores = 0 + proc_file = open("/proc/cpuinfo","r") + for line in proc_file: + if (line.startswith("processor")): + self.cores += 1 is_local = None self.log = "" @@ -78,7 +84,7 @@ class configuration(GObject.GObject): self.PAL = True self.tmp_folder = "/var/tmp" - self.multicore = True + self.multicore = self.cores self.final_folder = os.environ.get("HOME") self.sub_language = None self.sub_codepage = None @@ -89,7 +95,6 @@ class configuration(GObject.GObject): self.subtitles_font_size = 28 self.sub_language = None self.sub_codepage = None - self.menu_dynamic_preview = False config_path = os.path.join(os.environ.get("HOME"),".devede") try: @@ -135,11 +140,6 @@ class configuration(GObject.GObject): continue if linea[:19]=="subtitle_font_size:": self.subtitles_font_size = int(linea[19:].strip()) - if linea[:21]=="menu_dynamic_preview:": - if linea[21] == '0': - self.menu_dynamic_preview = False - else: - self.menu_dynamic_preview = True config_data.close() except: pass @@ -163,7 +163,7 @@ class configuration(GObject.GObject): config_data.write("ntsc\n") if (self.tmp_folder != None): config_data.write("temp_folder:"+str(self.tmp_folder)+"\n") - config_data.write("multicore:"+str(self.multicore)) + config_data.write("multicore:"+str(self.multicore)+"\n") if (self.final_folder != None): config_data.write("final_folder:"+str(self.final_folder)+"\n") if (self.sub_language != None): @@ -182,11 +182,6 @@ class configuration(GObject.GObject): config_data.write("sub_codepage:"+str(self.sub_codepage)+"\n") if (self.sub_language != None): config_data.write("sub_language:"+str(self.sub_language)+"\n") - config_data.write("menu_dynamic_preview:") - if (self.menu_dynamic_preview): - config_data.write("1\n") - else: - config_data.write("0\n") config_data.write("subtitle_font_size:"+str(self.subtitles_font_size)+"\n") config_data.close() except: diff --git a/src/devede/converter.py b/src/devede/converter.py index 3190f97..f65a2bb 100644 --- a/src/devede/converter.py +++ b/src/devede/converter.py @@ -18,6 +18,7 @@ import devede.configuration_data import devede.mplayer_detector import devede.avconv_converter +import devede.vlc class converter: @@ -26,7 +27,7 @@ class converter: @staticmethod def get_converter(): if converter.current_converter == None: - converter.current_converter = converter.converter() + converter.current_converter = converter() return converter.current_converter @@ -34,7 +35,7 @@ class converter: self.config = devede.configuration_data.configuration.get_config() # List of classes with conversion capabilities, in order of preference - self.c = [devede.mplayer_detector.mplayer_detector, devede.avconv_converter.avconv_converter] + self.c = [devede.vlc.vlc_player, devede.mplayer_detector.mplayer_detector, devede.avconv_converter.avconv_converter] self.analizers = {} self.default_analizer = None @@ -70,6 +71,23 @@ class converter: if (self.default_menuer == None): self.default_menuer = element + def get_available_programs(self): + + players = [] + menuers = [] + converters = [] + analizers = [] + + for e in self.analizers: + analizers.append(e) + for e in self.players: + players.append(e) + for e in self.menuers: + menuers.append(e) + for e in self.converters: + converters.append(e) + + return (analizers, players, menuers, converters) def get_needed_programs(self): """ returns a tupla with four lists. When a list is NONE, there are installed in the system @@ -112,15 +130,15 @@ class converter: def get_film_player(self): """ returns a class for the desired film player, or the most priviledged if the desired is not installed """ - if (self.config.film_player == None) or (self.players.has_key(self.config.film_player) == False): + if (self.config.film_player == None) or (self.config.film_player not in self.players): return self.default_player else: - return self.players[self.config.film_analizer] + return self.players[self.config.film_player] def get_film_analizer(self): """ returns a class for the desired film analizer, or the most priviledged if the desired is not installed """ - if (self.config.film_analizer == None) or (self.analizers.has_key(self.config.film_analizer) == False): + if (self.config.film_analizer == None) or (self.config.film_analizer not in self.analizers): return self.default_analizer else: return self.analizers[self.config.film_analizer] @@ -128,15 +146,15 @@ class converter: def get_menu_converter(self): """ returns a class for the desired menu converter, or the most priviledged if the desired is not installed """ - if (self.config.menu_converter == None) or (self.analizers.has_key(self.config.menu_converter) == False): + if (self.config.menu_converter == None) or (self.config.menu_converter not in self.analizers): return self.default_menuer else: return self.menuers[self.config.menu_converter] - + def get_disc_converter(self): """ returns a class for the desired disc converter, or the most priviledged if the desired is not installed """ - if (self.config.film_converter == None) or (self.analizers.has_key(self.config.film_converter) == False): + if (self.config.film_converter == None) or (self.config.film_converter not in self.analizers): return self.default_converter else: return self.converters[self.config.film_converter] \ No newline at end of file diff --git a/src/devede/dvd_menu.py b/src/devede/dvd_menu.py index 36e9493..7f26dc3 100644 --- a/src/devede/dvd_menu.py +++ b/src/devede/dvd_menu.py @@ -70,7 +70,7 @@ class dvd_menu(devede.interface_manager.interface_manager): def update_music(self,b=None): self.store_ui(self.builder) - cv = devede.converter.converter() + cv = devede.converter.converter.get_converter() film_analizer = (cv.get_film_analizer())() (video, audio, length) = film_analizer.analize_film_data(self.background_music,True) if (video != 0): @@ -504,10 +504,10 @@ class dvd_menu(devede.interface_manager.interface_manager): xml_file.write(' left="boton'+str(n_page)+'x'+str(counter-1)+'"') xml_file.write(' > \n') counter += 1 - + xml_file.write("\n\n\n") xml_file.close() - + return False @@ -515,7 +515,7 @@ class dvd_menu(devede.interface_manager.interface_manager): self.file_list = file_list self.refresh_static_data() - cv = devede.converter.converter() + cv = devede.converter.converter.get_converter() menu_folder = os.path.join(base_path,"menu") try: os.makedirs(menu_folder) diff --git a/src/devede/error.py b/src/devede/error.py index d52056f..bc3b319 100644 --- a/src/devede/error.py +++ b/src/devede/error.py @@ -40,7 +40,7 @@ class error_window: def on_copy_clicked(self,b): - + clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) data =self.config.get_log() clipboard.set_text(data,len(data)) diff --git a/src/devede/executor.py b/src/devede/executor.py index c9c0de5..74b0f8e 100644 --- a/src/devede/executor.py +++ b/src/devede/executor.py @@ -41,20 +41,20 @@ class executor(GObject.GObject): self.stderr_data = "" self.stdin_file = None self.stdout_file = None - + self.dependencies = None self.childs = [] self.progress_bar = None self.killed = False def add_dependency(self, dep): - + if (self.dependencies == None): self.dependencies = [] - + if (self.dependencies.count(dep) == 0): self.dependencies.append(dep) - + # the childs have the same dependencies than the parent process because, from outside, it is viewed as a single process for child in self.childs: child.add_dependency(dep) @@ -73,12 +73,12 @@ class executor(GObject.GObject): self.dependencies = None def add_child_process(self,child): - + # the childs have the same dependencies than the parent process because, from outside, it is viewed as a single process if self.dependencies != None: for dep in self.dependencies: child.add_dependency(dep) - + if (self.childs.count(child) == 0): self.childs.append(child) @@ -91,7 +91,7 @@ class executor(GObject.GObject): self.launch_process(self.command_var) def remove_ansi(self,line): - + output="" while True: pos=line.find("\033[") # try with double-byte ESC @@ -102,10 +102,10 @@ class executor(GObject.GObject): if pos==-1: # no ANSI characters; we ended output+=line break - + output+=line[:pos] line=line[pos+jump:] - + while True: if len(line)==0: break diff --git a/src/devede/file_movie.py b/src/devede/file_movie.py index 9a5df84..0334e06 100644 --- a/src/devede/file_movie.py +++ b/src/devede/file_movie.py @@ -113,7 +113,7 @@ class file_movie(devede.interface_manager.interface_manager): self.add_enable_disable("is_mpeg_ps", [], is_mpeg_ps_list) self.add_enable_disable("no_reencode_audio_video", [], no_reencode_audio_video_list) - cv = devede.converter.converter() + cv = devede.converter.converter.get_converter() film_analizer = (cv.get_film_analizer())() if (film_analizer.get_film_data(self.file_name)): self.error = True @@ -141,7 +141,7 @@ class file_movie(devede.interface_manager.interface_manager): self.aspect_ratio_final = None def get_max_resolution(self,rx,ry,aspect): - + tmpx = ry*aspect tmpy = rx/aspect if (tmpx > rx): @@ -150,7 +150,7 @@ class file_movie(devede.interface_manager.interface_manager): return rx,tmpy def set_final_size_aspect(self): - + if self.format_pal: final_size = self.final_size_pal else: @@ -246,12 +246,12 @@ class file_movie(devede.interface_manager.interface_manager): self.height_final = int(values[1]) # finally, calculate the midle size - + if (self.rotation == "rotation_90") or (self.rotation == "rotation_270"): midle_aspect_ratio = 1.0 / self.original_aspect_ratio else: midle_aspect_ratio = self.original_aspect_ratio - + if self.scaling == "scale_picture": self.width_midle = self.width_final self.height_midle = self.height_final @@ -430,12 +430,12 @@ class file_movie(devede.interface_manager.interface_manager): self.wdel_subtitles.set_sensitive(False) else: self.wdel_subtitles.set_sensitive(True) - - + + def do_conversion(self, output_path, duration = 0): - + self.set_final_size_aspect() - cv = devede.converter.converter() + cv = devede.converter.converter.get_converter() disc_converter = cv.get_disc_converter() converter = disc_converter() converter.convert_file(self,output_path,duration) @@ -459,6 +459,6 @@ class file_movie(devede.interface_manager.interface_manager): def preview_done(self,o,retval): if (retval == 0): - cv = devede.converter.converter() + cv = devede.converter.converter.get_converter() disc_player = (cv.get_film_player())() disc_player.play_film(os.path.join(self.config.tmp_folder,"movie_preview.mpg")) \ No newline at end of file diff --git a/src/devede/interface_manager.py b/src/devede/interface_manager.py index 4a6b842..2c99654 100644 --- a/src/devede/interface_manager.py +++ b/src/devede/interface_manager.py @@ -37,6 +37,7 @@ class interface_manager(GObject.GObject): self.interface_colorbuttons = [] self.interface_fontbuttons = [] self.interface_filebuttons = [] + self.interface_comboboxes = [] def add_group(self,group_name,radiobutton_list,default_value,callback = None): """ Adds a group of radiobuttons and creates an internal variable with @@ -102,7 +103,7 @@ class interface_manager(GObject.GObject): self.interface_lists.append( (liststore_name, callback )) def add_colorbutton(self,colorbutton_name, default_value,callback = None): - """ Adds an internal variable with the name text_name, linked to an + """ Adds an internal variable with the name colorbutton_name, linked to an element with the same name (must be a Gtk.ColorButton). The default value must be a set with RGBA values """ @@ -110,7 +111,7 @@ class interface_manager(GObject.GObject): self.interface_colorbuttons.append( (colorbutton_name, callback )) def add_fontbutton(self,fontbutton_name, default_value, callback = None): - """ Adds an internal variable with the name text_name, linked to an + """ Adds an internal variable with the name fontbutton_name, linked to an element with the same name (must be a Gtk.FontButton). The default value must be a string with the font values """ @@ -118,12 +119,20 @@ class interface_manager(GObject.GObject): self.interface_fontbuttons.append( (fontbutton_name, callback )) def add_filebutton(self,filebutton_name, default_value, callback = None): - """ Adds an internal variable with the name text_name, linked to an + """ Adds an internal variable with the name filebutton_name, linked to an element with the same name (must be a Gtk.FileButton). The default value must be a string with the font values """ exec('self.'+filebutton_name+' = default_value') - self.interface_filebuttons.append( (filebutton_name, callback )) + self.interface_filebuttons.append( (filebutton_name, callback ) ) + + def add_combobox(self,combobox_name,values,default_value,callback = None): + """ Adds an internal variable with the name combobox_name, linked to an + element with the same name (must be a Gtk.Combobox). + The default value must be an integer with the entry selected """ + + exec('self.'+combobox_name+' = default_value') + self.interface_comboboxes.append ( (combobox_name, values, callback) ) def add_show_hide(self,element_name,to_show,to_hide): """ Adds an element that can be active or inactive, and two lists of elements. @@ -238,6 +247,23 @@ class interface_manager(GObject.GObject): if (callback != None): obj.connect("file_set",callback) + for element in self.interface_comboboxes: + obj = eval('self.'+element[0]) + the_combo = builder.get_object(element[0]) + the_list = the_combo.get_model() + the_list.clear() + counter = 0 + dv = 0 + for item in element[1]: + the_list.append([item]) + if (item == obj): + dv = counter + counter += 1 + the_combo.set_active(dv) + callback = element[2] + if (callback != None): + the_liststore.connect("changed",callback) + self.interface_show_hide_obj = {} for element in self.interface_show_hide: obj = builder.get_object(element[0]) @@ -257,9 +283,13 @@ class interface_manager(GObject.GObject): to_enable = [] for e2 in element[1]: to_enable.append(builder.get_object(e2)) + if (builder.get_object(e2) == None): + print("Error en "+str(e2)) to_disable = [] for e3 in element[2]: to_disable.append(builder.get_object(e3)) + if (builder.get_object(e3) == None): + print("Error en "+str(e3)) self.interface_enable_disable_obj[obj] = [to_enable, to_disable] obj.connect('toggled',self.toggled_element2) self.toggled_element2(obj) @@ -385,6 +415,11 @@ class interface_manager(GObject.GObject): print (final_row) exec('self.'+element[0]+'.append(final_row)') + for element in self.interface_comboboxes: + obj = builder.get_object(element[0]) + exec('self.'+element[0]+' = element[1][obj.get_active()]') + + def save_ui(self): """ Makes a copy of all the UI variables """ @@ -406,6 +441,8 @@ class interface_manager(GObject.GObject): exec('self.'+element[0]+'_backup = self.'+element[0]) for element in self.interface_lists: exec('self.'+element[0]+'_backup = self.'+element[0]) + for element in self.interface_comboboxes: + exec('self.'+element[0]+'_backup = self.'+element[0]) def restore_ui(self): """ Restores a copy of all the UI variables """ @@ -427,4 +464,6 @@ class interface_manager(GObject.GObject): for element in self.interface_filebuttons: exec('self.'+element[0]+' = self.'+element[0]+'_backup') for element in self.interface_lists: - exec('self.'+element[0]+' = self.'+element[0]+'_backup') \ No newline at end of file + exec('self.'+element[0]+' = self.'+element[0]+'_backup') + for element in self.interface_comboboxes: + exec('self.'+element[0]+' = self.'+element[0]+'_backup') diff --git a/src/devede/project.py b/src/devede/project.py index de2f651..bf8ba7c 100644 --- a/src/devede/project.py +++ b/src/devede/project.py @@ -25,6 +25,7 @@ import devede.message import devede.dvd_menu import devede.create_disk_window import devede.runner +import devede.settings class devede_project: @@ -288,4 +289,8 @@ class devede_project: (element, position, model, treeiter) = self.get_current_file() if (element == None): return - element.do_preview() \ No newline at end of file + element.do_preview() + + def on_settings_activate(self,b): + + w = devede.settings.settings_window() \ No newline at end of file diff --git a/src/devede/runner.py b/src/devede/runner.py index 740eba8..faea1ee 100644 --- a/src/devede/runner.py +++ b/src/devede/runner.py @@ -29,14 +29,14 @@ class runner(GObject.GObject): GObject.GObject.__init__(self) self.config = devede.configuration_data.configuration.get_config() - max_cores = self.count_cores() + if (self.config.multicore > 0): - if max_cores < self.config.multicore: - self.cores = max_cores + if self.config.cores < self.config.multicore: + self.cores = self.config.cores else: self.cores = self.config.multicore else: - self.cores = max_cores - self.config.multicore + self.cores = self.config.cores - self.config.multicore if (self.cores <= 0): self.cores = 1 @@ -84,15 +84,6 @@ class runner(GObject.GObject): def on_cancel_clicked(self,b): pass - def count_cores(self): - - cores = 0 - proc_file = open("/proc/cpuinfo","r") - for line in proc_file: - if (line.startswith("processor")): - cores += 1 - return cores - def run(self, clear_log = True): if clear_log: diff --git a/src/devede/settings.py b/src/devede/settings.py new file mode 100644 index 0000000..38bd6cc --- /dev/null +++ b/src/devede/settings.py @@ -0,0 +1,100 @@ +# Copyright 2014 (C) Raster Software Vigo (Sergio Costas) +# +# This file is part of DeVeDe-NG +# +# DeVeDe-NG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# DeVeDe-NG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see + +from gi.repository import Gtk +import os +import devede.configuration_data +import devede.interface_manager +import gettext +import devede.converter + +class settings_window(devede.interface_manager.interface_manager): + + def __init__(self): + + devede.interface_manager.interface_manager.__init__(self) + self.config = devede.configuration_data.configuration.get_config() + + if (self.config.multicore > 0): + if self.config.cores < self.config.multicore: + cores = self.config.cores + else: + cores = self.config.multicore + else: + if self.config.cores <= -self.config.multicore: + cores = -self.config.cores+1 + else: + cores = self.config.multicore + + self.core_elements = {} + list_core_elements = [] + default_value = _("Use all cores") + counter = 1 + for c in range(self.config.cores-1,-self.config.cores, -1): + if c > 0: + translated_string = gettext.ngettext("Use %(X)d core","Use %(X)d cores",c) % {"X":c} + value = c + if c == cores: + default_value = translated_string + counter += 1 + elif c < 0: + translated_string = gettext.ngettext("Use all except %(X)d core","Use all except %(X)d cores", -c) % {"X": -c} + value = c + if c == cores: + default_value = translated_string + counter += 1 + else: + translated_string = _("Use all cores") + value = c + + self.core_elements[translated_string] = value + list_core_elements.append(translated_string) + + self.add_combobox("multicore",list_core_elements,default_value) + self.add_filebutton("tempo_path", self.config.tmp_folder) + + c = devede.converter.converter.get_converter() + (analizers, players, menuers, converters) = c.get_available_programs() + + self.add_combobox("analizer", analizers,self.config.film_analizer) + self.add_combobox("player", players,self.config.film_player) + self.add_combobox("converter", converters,self.config.film_converter) + self.add_combobox("menuer", menuers,self.config.menu_converter) + + builder = Gtk.Builder() + builder.set_translation_domain(self.config.gettext_domain) + + builder.add_from_file(os.path.join(self.config.glade,"wsettings.ui")) + builder.connect_signals(self) + wsettings_window = builder.get_object("settings") + + + wsettings_window.show_all() + self.update_ui(builder) + + retval = wsettings_window.run() + self.store_ui(builder) + wsettings_window.destroy() + + if retval == 1: + self.config.multicore = self.core_elements[self.multicore] + self.config.tmp_folder = self.tempo_path + self.config.film_analizer = self.analizer + self.config.film_player = self.player + self.config.film_converter = self.converter + self.config.menu_converter = self.menuer + self.config.save_config() diff --git a/src/devede/vlc.py b/src/devede/vlc.py new file mode 100644 index 0000000..fb61c8d --- /dev/null +++ b/src/devede/vlc.py @@ -0,0 +1,56 @@ +# Copyright 2014 (C) Raster Software Vigo (Sergio Costas) +# +# This file is part of DeVeDe-NG +# +# DeVeDe-NG is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# DeVeDe-NG is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see + +import subprocess +import devede.configuration_data +import devede.executor + +class vlc_player(devede.executor.executor): + + supports_analize = False + supports_play = True + supports_convert = False + supports_menu = False + display_name = "VLC" + + @staticmethod + def check_is_installed(): + try: + handle = subprocess.Popen(["vlc","-h"], stdout = subprocess.PIPE, stderr = subprocess.PIPE) + (stdout, stderr) = handle.communicate() + if 0==handle.wait(): + return True + else: + return False + except: + return False + + def __init__(self): + + devede.executor.executor.__init__(self) + self.config = devede.configuration_data.configuration.get_config() + + def play_film(self,file_name): + + command_line = ["vlc", file_name] + self.launch_process(command_line) + + def process_stdout(self,data): + return + + def process_stderr(self,data): + return