From 7c1766d25fe1ccc176f1ced2f3019990789b15bf Mon Sep 17 00:00:00 2001 From: Sergio Costas Date: Thu, 7 Aug 2014 23:42:25 +0200 Subject: [PATCH] Added support for setting the properties of several video files in a single step Fixed little bug when setting the PAL/NTSC toggle in the file properties dialog --- README.md | 8 +- data/interface/wfile_properties.ui | 147 ++++++++++++++++++++---- data/interface/wmain.ui | 9 ++ src/devede/file_movie.py | 172 ++++++++++++++++++++--------- src/devede/project.py | 8 +- 5 files changed, 269 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index c1f9214..5995ff3 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,24 @@ The current visible changes are quite small in number: * Allows to create Matroska files with H.264 video and MP3 audio * Allows to use VLC or MPlayer for preview * Allows to choose between Brasero or K3B for burning the discs +* allows to set properties for several files in one step ## THINGS TO DO ## Some of the future ideas to add to Devede NG are, without an specific order: -* allow to set properties for several files in one step * add more backends * add more output formats * allow to replace the movie's audio track with one or several MP3 or OGG audio files +* widescreen menus for DVDs +* choose between MP2 and AC3 audio for menus ## History of versions ## -* version XXXXX +* version in GIT + * allow to set properties for several files in one step + * Fixed bug whe setting PAL or NTSC toggle in file properties * Added two-pass conversion * Now detects separately MKISOFS and GENISOIMAGE, allowing to have only one of them installed in the system * Now checks that the number of files is smaller than the limit for DVD projects diff --git a/data/interface/wfile_properties.ui b/data/interface/wfile_properties.ui index c27242a..f3a3f1a 100644 --- a/data/interface/wfile_properties.ui +++ b/data/interface/wfile_properties.ui @@ -22,6 +22,14 @@ 1 10 + + + + + + + + 10 50 @@ -68,7 +76,7 @@ vertical 4 - + True False 0 @@ -131,7 +139,7 @@ - + True False 0 @@ -383,6 +391,118 @@ 1 + + + True + False + 0 + none + + + True + False + 12 + + + True + False + + + True + True + in + + + True + True + files_to_set + False + False + 0 + False + + + + + + column + + + + 0 + + + + + + + + + True + True + 0 + + + + + True + False + vertical + start + + + Select all + True + True + True + + + + False + True + 0 + + + + + Unselect all + True + True + True + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + + + True + False + <b>Set properties to these files</b> + True + + + + + True + True + 2 + + True @@ -808,7 +928,7 @@ False vertical - + True True always @@ -2235,7 +2355,7 @@ True True - 2 + 3 @@ -2249,7 +2369,7 @@ False True - 3 + 4 @@ -2257,21 +2377,6 @@ True False end - - - gtk-help - True - True - True - True - - - False - True - 0 - True - - gtk-cancel @@ -2306,7 +2411,7 @@ False True - 4 + 5 diff --git a/data/interface/wmain.ui b/data/interface/wmain.ui index ac30e80..08e6ab9 100644 --- a/data/interface/wmain.ui +++ b/data/interface/wmain.ui @@ -136,6 +136,15 @@ True False + + + True + False + Set multiproperties + True + + + gtk-preferences diff --git a/src/devede/file_movie.py b/src/devede/file_movie.py index c096b0e..736cf1b 100644 --- a/src/devede/file_movie.py +++ b/src/devede/file_movie.py @@ -30,7 +30,9 @@ class file_movie(devede.interface_manager.interface_manager): __gsignals__ = {'title_changed': (GObject.SIGNAL_RUN_FIRST, None,(str,))} - def __init__(self,file_name): + def __init__(self,file_name, list_files = None): + + self.list_files = list_files devede.interface_manager.interface_manager.__init__(self) @@ -41,16 +43,19 @@ class file_movie(devede.interface_manager.interface_manager): self.set_type(None, self.config.disc_type) self.config.connect('disc_type',self.set_type) - self.add_text("file_name", file_name) - self.add_text("title_name", os.path.splitext(os.path.basename(file_name))[0]) - self.add_label("original_size",None) - self.add_label("original_length",None) - self.add_label("original_videorate",None) - self.add_label("original_audiorate",None) - self.add_label("original_aspect_ratio",None) - self.add_label("original_fps",None) + if list_files == None: + self.add_text("file_name", file_name) + self.add_text("title_name", os.path.splitext(os.path.basename(file_name))[0]) + self.add_label("original_size",None) + self.add_label("original_length",None) + self.add_label("original_videorate",None) + self.add_label("original_audiorate",None) + self.add_label("original_aspect_ratio",None) + self.add_label("original_fps",None) + self.add_toggle("show_in_menu", True) + else: + self.original_aspect_ratio = 1.777 # dummy value - self.add_toggle("show_in_menu", True) self.add_toggle("format_pal",self.config.PAL) self.add_toggle("video_rate_automatic", True) self.add_toggle("audio_rate_automatic", True) @@ -89,7 +94,12 @@ class file_movie(devede.interface_manager.interface_manager): self.add_float_adjustment("audio_delay", 0.0) self.add_integer_adjustment("chapter_size", 5) - self.add_list("subtitles_list") + if list_files == None: + self.add_list("subtitles_list") + else: + self.add_list("files_to_set") + for e in list_files: + self.files_to_set.append([e.title_name, e]) self.add_show_hide("format_pal", ["size_pal"], ["size_ntsc"]) @@ -122,45 +132,46 @@ 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.get_converter() - film_analizer = (cv.get_film_analizer())() - if (film_analizer.get_film_data(self.file_name)): - self.error = True - else: - self.audio_list = film_analizer.audio_list - self.audio_streams = film_analizer.audio_streams - self.video_streams = film_analizer.video_streams - self.original_width = film_analizer.original_width - self.original_height = film_analizer.original_height - self.original_length = film_analizer.original_length - self.original_size = film_analizer.original_size - self.original_aspect_ratio = film_analizer.original_aspect_ratio - self.original_videorate = film_analizer.original_videorate - self.original_audiorate = film_analizer.original_audiorate + if list_files == None: + cv = devede.converter.converter.get_converter() + film_analizer = (cv.get_film_analizer())() + if (film_analizer.get_film_data(self.file_name)): + self.error = True + else: + self.audio_list = film_analizer.audio_list + self.audio_streams = film_analizer.audio_streams + self.video_streams = film_analizer.video_streams + self.original_width = film_analizer.original_width + self.original_height = film_analizer.original_height + self.original_length = film_analizer.original_length + self.original_size = film_analizer.original_size + self.original_aspect_ratio = film_analizer.original_aspect_ratio + self.original_videorate = film_analizer.original_videorate + self.original_audiorate = film_analizer.original_audiorate - self.original_audiorate_uncompressed = film_analizer.original_audiorate_uncompressed - self.original_fps = film_analizer.original_fps - self.original_file_size = film_analizer.original_file_size + self.original_audiorate_uncompressed = film_analizer.original_audiorate_uncompressed + self.original_fps = film_analizer.original_fps + self.original_file_size = film_analizer.original_file_size - if self.original_audiorate <= 0: - # just a guess, but usually correct - self.original_audiorate = 224 - if self.original_videorate <= 0: - # presume that there are only video and audio streams - self.original_videorate = ((8 * self.original_file_size) / self.original_length) - (self.original_audiorate * self.audio_streams) + if self.original_audiorate <= 0: + # just a guess, but usually correct + self.original_audiorate = 224 + if self.original_videorate <= 0: + # presume that there are only video and audio streams + self.original_videorate = ((8 * self.original_file_size) / self.original_length) - (self.original_audiorate * self.audio_streams) - self.error = False + self.width_midle = -1 + self.height_midle = -1 + self.width_final = -1 + self.height_final = -1 + self.video_rate_auto = self.video_rate + self.audio_rate_auto = self.audio_rate + self.video_rate_final = self.video_rate + self.audio_rate_final = self.audio_rate + self.aspect_ratio_final = None + self.converted_filename = None - self.width_midle = -1 - self.height_midle = -1 - self.width_final = -1 - self.height_final = -1 - self.video_rate_auto = self.video_rate - self.audio_rate_auto = self.audio_rate - self.video_rate_final = self.video_rate - self.audio_rate_final = self.audio_rate - self.aspect_ratio_final = None - self.converted_filename = None + self.error = False def get_estimated_size(self): @@ -371,6 +382,7 @@ class file_movie(devede.interface_manager.interface_manager): self.width_midle = int(self.original_width) self.height_midle = int(self.original_height * midle_aspect_ratio / self.aspect_ratio_final) + def set_type(self,obj = None,disc_type = None): if (disc_type != None): @@ -396,11 +408,19 @@ class file_movie(devede.interface_manager.interface_manager): self.wfile_properties = self.builder.get_object("file_properties") self.wfile_properties.show_all() + self.wframe_title = self.builder.get_object("frame_title") + self.wframe_fileinfo = self.builder.get_object("frame_fileinfo") + self.wframe_multiproperties = self.builder.get_object("frame_multiproperties") + self.wtreeview_multiproperties = self.builder.get_object("treeview_multiproperties") + self.wbutton_preview = self.builder.get_object("button_preview") + self.wshow_in_menu = self.builder.get_object("show_in_menu") self.wnotebook = self.builder.get_object("notebook") # elements in page GENERAL + self.wformat_pal = self.builder.get_object("format_pal") + self.wformat_ntsc = self.builder.get_object("format_ntsc") self.wframe_video_rate = self.builder.get_object("frame_video_rate") self.wframe_audio_rate = self.builder.get_object("frame_audio_rate") self.waudio_rate = self.builder.get_object("audio_rate") @@ -414,6 +434,8 @@ class file_movie(devede.interface_manager.interface_manager): # elements in page SUBTITLES self.wsubtitles_list = self.builder.get_object("subtitles_list") self.wtreview_subtitles = self.builder.get_object("treeview_subtitles") + self.wscrolledwindow_subtitles = self.builder.get_object("scrolledwindow_subtitles") + self.wadd_subtitles = self.builder.get_object("add_subtitles") self.wdel_subtitles = self.builder.get_object("del_subtitles") selection = self.wtreview_subtitles.get_selection() @@ -487,10 +509,31 @@ class file_movie(devede.interface_manager.interface_manager): self.wframe_division_chapters.hide() self.wnotebook.remove_page(5) + if self.list_files == None: + self.wframe_title.show() + self.wframe_fileinfo.show() + self.wframe_multiproperties.hide() + else: + self.wframe_title.hide() + self.wframe_fileinfo.hide() + self.wframe_multiproperties.show() + self.wscrolledwindow_subtitles.hide() + self.wbutton_preview.hide() + self.wadd_subtitles.hide() + self.wdel_subtitles.hide() + sel = self.wtreeview_multiproperties.get_selection() + sel.set_mode(Gtk.SelectionMode.MULTIPLE) + self.wtreeview_multiproperties.set_rubber_banding(True) + + self.save_ui() self.update_ui(self.builder) self.on_aspect_classic_toggled(None) self.on_treeview_subtitles_cursor_changed(None) + if self.format_pal: + self.wformat_pal.set_active(True) + else: + self.wformat_ntsc.set_active(True) def on_aspect_classic_toggled(self,b): @@ -519,9 +562,18 @@ class file_movie(devede.interface_manager.interface_manager): def on_button_accept_clicked(self,b): self.store_ui(self.builder) - self.set_final_rates() - self.set_final_size_aspect() - self.emit('title_changed',self.title_name) + if self.list_files == None: + self.set_final_rates() + self.set_final_size_aspect() + self.emit('title_changed',self.title_name) + else: + data = self.store_file() + sel = self.wtreeview_multiproperties.get_selection() + model, pathlist = sel.get_selected_rows() + for file_path in pathlist: + obj = model[file_path][1] + obj.restore_file(data) + self.wfile_properties.destroy() self.wfile_properties = None self.builder = None @@ -529,7 +581,9 @@ class file_movie(devede.interface_manager.interface_manager): def on_button_cancel_clicked(self,b): - self.restore_ui() + if self.list_files == None: + self.restore_ui() + self.wfile_properties.destroy() self.wfile_properties = None self.builder = None @@ -639,9 +693,25 @@ class file_movie(devede.interface_manager.interface_manager): def store_file(self): - return self.serialize() + data = self.serialize() + if "files_to_set" in data: + del data["files_to_set"] + + return data def restore_file(self,data): self.unserialize(data) + + + def on_select_all_clicked(self,b): + + sel = self.wtreeview_multiproperties.get_selection() + sel.select_all() + + + def on_unselect_all_clicked(self,b): + + sel = self.wtreeview_multiproperties.get_selection() + sel.unselect_all() \ No newline at end of file diff --git a/src/devede/project.py b/src/devede/project.py index 4d05c85..653da3d 100644 --- a/src/devede/project.py +++ b/src/devede/project.py @@ -630,4 +630,10 @@ class devede_project: if (len(error_list)!=0): devede.message.message_window(_("The following files in the project could not be added again:"),_("Error while adding files"),error_list) self.set_interface_status(None) - self.refresh_disc_usage() \ No newline at end of file + self.refresh_disc_usage() + + + def on_multiproperties_activate(self,b): + + e = devede.file_movie.file_movie(None,self.get_all_files()) + e.properties()