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
This commit is contained in:
Sergio Costas 2014-08-07 23:42:25 +02:00
parent 7646cdaf7e
commit 7c1766d25f
5 changed files with 269 additions and 75 deletions

View file

@ -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 create Matroska files with H.264 video and MP3 audio
* Allows to use VLC or MPlayer for preview * Allows to use VLC or MPlayer for preview
* Allows to choose between Brasero or K3B for burning the discs * Allows to choose between Brasero or K3B for burning the discs
* allows to set properties for several files in one step
## THINGS TO DO ## ## THINGS TO DO ##
Some of the future ideas to add to Devede NG are, without an specific order: 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 backends
* add more output formats * add more output formats
* allow to replace the movie's audio track with one or several MP3 or OGG audio files * 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 ## ## 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 * Added two-pass conversion
* Now detects separately MKISOFS and GENISOIMAGE, allowing to have only one of them installed in the system * 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 * Now checks that the number of files is smaller than the limit for DVD projects

View file

@ -22,6 +22,14 @@
<property name="step_increment">1</property> <property name="step_increment">1</property>
<property name="page_increment">10</property> <property name="page_increment">10</property>
</object> </object>
<object class="GtkListStore" id="files_to_set">
<columns>
<!-- column-name title -->
<column type="gchararray"/>
<!-- column-name object -->
<column type="GObject"/>
</columns>
</object>
<object class="GtkAdjustment" id="subt_font_size"> <object class="GtkAdjustment" id="subt_font_size">
<property name="lower">10</property> <property name="lower">10</property>
<property name="upper">50</property> <property name="upper">50</property>
@ -68,7 +76,7 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">4</property> <property name="spacing">4</property>
<child> <child>
<object class="GtkFrame" id="frame19"> <object class="GtkFrame" id="frame_title">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
@ -131,7 +139,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkFrame" id="frame2"> <object class="GtkFrame" id="frame_fileinfo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label_xalign">0</property> <property name="label_xalign">0</property>
@ -383,6 +391,118 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkFrame" id="frame_multiproperties">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="left_padding">12</property>
<child>
<object class="GtkBox" id="box22">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="treeview_multiproperties">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">files_to_set</property>
<property name="headers_visible">False</property>
<property name="enable_search">False</property>
<property name="search_column">0</property>
<property name="show_expanders">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn4">
<property name="title" translatable="yes">column</property>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButtonBox" id="buttonbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="layout_style">start</property>
<child>
<object class="GtkButton" id="select_all">
<property name="label" translatable="yes">Select all</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_select_all_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="unselect_all">
<property name="label" translatable="yes">Unselect all</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_unselect_all_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Set properties to these files&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child> <child>
<object class="GtkFrame" id="frame3"> <object class="GtkFrame" id="frame3">
<property name="visible">True</property> <property name="visible">True</property>
@ -808,7 +928,7 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledwindow1"> <object class="GtkScrolledWindow" id="scrolledwindow_subtitles">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="vscrollbar_policy">always</property> <property name="vscrollbar_policy">always</property>
@ -2235,7 +2355,7 @@
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">2</property> <property name="position">3</property>
</packing> </packing>
</child> </child>
<child> <child>
@ -2249,7 +2369,7 @@
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">3</property> <property name="position">4</property>
</packing> </packing>
</child> </child>
<child> <child>
@ -2257,21 +2377,6 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="layout_style">end</property> <property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-help</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
<property name="secondary">True</property>
</packing>
</child>
<child> <child>
<object class="GtkButton" id="button_cancel"> <object class="GtkButton" id="button_cancel">
<property name="label">gtk-cancel</property> <property name="label">gtk-cancel</property>
@ -2306,7 +2411,7 @@
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">4</property> <property name="position">5</property>
</packing> </packing>
</child> </child>
</object> </object>

View file

@ -136,6 +136,15 @@
<object class="GtkMenu" id="menu2"> <object class="GtkMenu" id="menu2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="multiproperties">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Set multiproperties</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_multiproperties_activate" swapped="no"/>
</object>
</child>
<child> <child>
<object class="GtkImageMenuItem" id="settings"> <object class="GtkImageMenuItem" id="settings">
<property name="label">gtk-preferences</property> <property name="label">gtk-preferences</property>

View file

@ -30,7 +30,9 @@ class file_movie(devede.interface_manager.interface_manager):
__gsignals__ = {'title_changed': (GObject.SIGNAL_RUN_FIRST, None,(str,))} __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) devede.interface_manager.interface_manager.__init__(self)
@ -41,6 +43,7 @@ class file_movie(devede.interface_manager.interface_manager):
self.set_type(None, self.config.disc_type) self.set_type(None, self.config.disc_type)
self.config.connect('disc_type',self.set_type) self.config.connect('disc_type',self.set_type)
if list_files == None:
self.add_text("file_name", file_name) self.add_text("file_name", file_name)
self.add_text("title_name", os.path.splitext(os.path.basename(file_name))[0]) self.add_text("title_name", os.path.splitext(os.path.basename(file_name))[0])
self.add_label("original_size",None) self.add_label("original_size",None)
@ -49,8 +52,10 @@ class file_movie(devede.interface_manager.interface_manager):
self.add_label("original_audiorate",None) self.add_label("original_audiorate",None)
self.add_label("original_aspect_ratio",None) self.add_label("original_aspect_ratio",None)
self.add_label("original_fps",None) self.add_label("original_fps",None)
self.add_toggle("show_in_menu", True) self.add_toggle("show_in_menu", True)
else:
self.original_aspect_ratio = 1.777 # dummy value
self.add_toggle("format_pal",self.config.PAL) self.add_toggle("format_pal",self.config.PAL)
self.add_toggle("video_rate_automatic", True) self.add_toggle("video_rate_automatic", True)
self.add_toggle("audio_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_float_adjustment("audio_delay", 0.0)
self.add_integer_adjustment("chapter_size", 5) self.add_integer_adjustment("chapter_size", 5)
if list_files == None:
self.add_list("subtitles_list") 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"]) self.add_show_hide("format_pal", ["size_pal"], ["size_ntsc"])
@ -122,6 +132,7 @@ class file_movie(devede.interface_manager.interface_manager):
self.add_enable_disable("is_mpeg_ps", [], is_mpeg_ps_list) self.add_enable_disable("is_mpeg_ps", [], is_mpeg_ps_list)
self.add_enable_disable("no_reencode_audio_video", [], no_reencode_audio_video_list) self.add_enable_disable("no_reencode_audio_video", [], no_reencode_audio_video_list)
if list_files == None:
cv = devede.converter.converter.get_converter() cv = devede.converter.converter.get_converter()
film_analizer = (cv.get_film_analizer())() film_analizer = (cv.get_film_analizer())()
if (film_analizer.get_film_data(self.file_name)): if (film_analizer.get_film_data(self.file_name)):
@ -149,8 +160,6 @@ class file_movie(devede.interface_manager.interface_manager):
# presume that there are only video and audio streams # 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.original_videorate = ((8 * self.original_file_size) / self.original_length) - (self.original_audiorate * self.audio_streams)
self.error = False
self.width_midle = -1 self.width_midle = -1
self.height_midle = -1 self.height_midle = -1
self.width_final = -1 self.width_final = -1
@ -162,6 +171,8 @@ class file_movie(devede.interface_manager.interface_manager):
self.aspect_ratio_final = None self.aspect_ratio_final = None
self.converted_filename = None self.converted_filename = None
self.error = False
def get_estimated_size(self): def get_estimated_size(self):
""" Returns the estimated final file size, in kBytes, based on the final audio and video rate, and the subtitles """ """ Returns the estimated final file size, in kBytes, based on the final audio and video rate, and the subtitles """
@ -371,6 +382,7 @@ class file_movie(devede.interface_manager.interface_manager):
self.width_midle = int(self.original_width) self.width_midle = int(self.original_width)
self.height_midle = int(self.original_height * midle_aspect_ratio / self.aspect_ratio_final) self.height_midle = int(self.original_height * midle_aspect_ratio / self.aspect_ratio_final)
def set_type(self,obj = None,disc_type = None): def set_type(self,obj = None,disc_type = None):
if (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 = self.builder.get_object("file_properties")
self.wfile_properties.show_all() 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.wshow_in_menu = self.builder.get_object("show_in_menu")
self.wnotebook = self.builder.get_object("notebook") self.wnotebook = self.builder.get_object("notebook")
# elements in page GENERAL # 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_video_rate = self.builder.get_object("frame_video_rate")
self.wframe_audio_rate = self.builder.get_object("frame_audio_rate") self.wframe_audio_rate = self.builder.get_object("frame_audio_rate")
self.waudio_rate = self.builder.get_object("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 # elements in page SUBTITLES
self.wsubtitles_list = self.builder.get_object("subtitles_list") self.wsubtitles_list = self.builder.get_object("subtitles_list")
self.wtreview_subtitles = self.builder.get_object("treeview_subtitles") 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") self.wdel_subtitles = self.builder.get_object("del_subtitles")
selection = self.wtreview_subtitles.get_selection() selection = self.wtreview_subtitles.get_selection()
@ -487,10 +509,31 @@ class file_movie(devede.interface_manager.interface_manager):
self.wframe_division_chapters.hide() self.wframe_division_chapters.hide()
self.wnotebook.remove_page(5) 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.save_ui()
self.update_ui(self.builder) self.update_ui(self.builder)
self.on_aspect_classic_toggled(None) self.on_aspect_classic_toggled(None)
self.on_treeview_subtitles_cursor_changed(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): 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): def on_button_accept_clicked(self,b):
self.store_ui(self.builder) self.store_ui(self.builder)
if self.list_files == None:
self.set_final_rates() self.set_final_rates()
self.set_final_size_aspect() self.set_final_size_aspect()
self.emit('title_changed',self.title_name) 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.destroy()
self.wfile_properties = None self.wfile_properties = None
self.builder = None self.builder = None
@ -529,7 +581,9 @@ class file_movie(devede.interface_manager.interface_manager):
def on_button_cancel_clicked(self,b): def on_button_cancel_clicked(self,b):
if self.list_files == None:
self.restore_ui() self.restore_ui()
self.wfile_properties.destroy() self.wfile_properties.destroy()
self.wfile_properties = None self.wfile_properties = None
self.builder = None self.builder = None
@ -639,9 +693,25 @@ class file_movie(devede.interface_manager.interface_manager):
def store_file(self): 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): def restore_file(self,data):
self.unserialize(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()

View file

@ -631,3 +631,9 @@ class devede_project:
devede.message.message_window(_("The following files in the project could not be added again:"),_("Error while adding files"),error_list) 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.set_interface_status(None)
self.refresh_disc_usage() self.refresh_disc_usage()
def on_multiproperties_activate(self,b):
e = devede.file_movie.file_movie(None,self.get_all_files())
e.properties()