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:
parent
7646cdaf7e
commit
7c1766d25f
5 changed files with 269 additions and 75 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -22,6 +22,14 @@
|
|||
<property name="step_increment">1</property>
|
||||
<property name="page_increment">10</property>
|
||||
</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">
|
||||
<property name="lower">10</property>
|
||||
<property name="upper">50</property>
|
||||
|
|
@ -68,7 +76,7 @@
|
|||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">4</property>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame19">
|
||||
<object class="GtkFrame" id="frame_title">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label_xalign">0</property>
|
||||
|
|
@ -131,7 +139,7 @@
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame2">
|
||||
<object class="GtkFrame" id="frame_fileinfo">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label_xalign">0</property>
|
||||
|
|
@ -383,6 +391,118 @@
|
|||
<property name="position">1</property>
|
||||
</packing>
|
||||
</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"><b>Set properties to these files</b></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>
|
||||
<object class="GtkFrame" id="frame3">
|
||||
<property name="visible">True</property>
|
||||
|
|
@ -808,7 +928,7 @@
|
|||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow_subtitles">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="vscrollbar_policy">always</property>
|
||||
|
|
@ -2235,7 +2355,7 @@
|
|||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
|
@ -2249,7 +2369,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
|
@ -2257,21 +2377,6 @@
|
|||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</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>
|
||||
<object class="GtkButton" id="button_cancel">
|
||||
<property name="label">gtk-cancel</property>
|
||||
|
|
@ -2306,7 +2411,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">4</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
|
|
|||
|
|
@ -136,6 +136,15 @@
|
|||
<object class="GtkMenu" id="menu2">
|
||||
<property name="visible">True</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>
|
||||
<object class="GtkImageMenuItem" id="settings">
|
||||
<property name="label">gtk-preferences</property>
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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)
|
||||
self.set_interface_status(None)
|
||||
self.refresh_disc_usage()
|
||||
|
||||
|
||||
def on_multiproperties_activate(self,b):
|
||||
|
||||
e = devede.file_movie.file_movie(None,self.get_all_files())
|
||||
e.properties()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue