[soundconverter] Add more fixes for success/failure of GStreamer plug-in installation,
Michael Schwendt
mschwendt at fedoraproject.org
Mon Feb 18 07:31:32 UTC 2013
commit 2b8dc5e62e908014bc7073f8cc08ee8b386b7c8a
Author: Michael Schwendt <mschwendt at fedoraproject.org>
Date: Mon Feb 18 08:31:21 2013 +0100
Add more fixes for success/failure of GStreamer plug-in installation,
which makes it possible to fix the idle callback race betwen reading of
tags and start of conversion.
- Merge all applied patches into a single file to avoid incremental
patching in places where 2.0.5-pre currently differs a lot but fails.
soundconverter-2.0.4-abort-conversion.patch | 11 -
...onverter-2.0.4-drag-data-received-warning.patch | 11 -
soundconverter-2.0.4-fedora.patch | 277 ++++++++++++++++++++
soundconverter-2.0.4-folder-choose.patch | 45 ----
soundconverter-2.0.4-gst-install.patch | 32 ---
soundconverter-2.0.4-gst-pipeline.patch | 29 --
soundconverter-2.0.4-gstreamer-show_error.patch | 30 --
soundconverter-2.0.4-no-gnome-audio-profiles.patch | 13 -
soundconverter-2.0.4-no-space-left.patch | 42 ---
soundconverter-2.0.4-remove-treesortedmodel.patch | 13 -
soundconverter-2.0.4-rootfiles.patch | 19 --
soundconverter-2.0.4-tagreader-exceptions.patch | 36 ---
soundconverter.spec | 56 ++--
13 files changed, 304 insertions(+), 310 deletions(-)
---
diff --git a/soundconverter-2.0.4-fedora.patch b/soundconverter-2.0.4-fedora.patch
new file mode 100644
index 0000000..a4983fc
--- /dev/null
+++ b/soundconverter-2.0.4-fedora.patch
@@ -0,0 +1,277 @@
+diff -Nur soundconverter-2.0.4-orig/soundconverter/error.py soundconverter-2.0.4-fedora/soundconverter/error.py
+--- soundconverter-2.0.4-orig/soundconverter/error.py 2012-01-04 00:23:34.000000000 +0100
++++ soundconverter-2.0.4-fedora/soundconverter/error.py 2013-02-18 08:01:37.000000000 +0100
+@@ -60,7 +60,10 @@
+ class ErrorPrinter:
+
+ def show_error(self, primary, secondary):
+- sys.stderr.write(_('\n\nError: %s\n%s\n') % (primary, secondary))
++ try:
++ sys.stderr.write(_('\n\nError: %s\n%s\n') % (primary, secondary))
++ except:
++ pass
+ sys.exit(1)
+
+ def show_exception(self, e):
+diff -Nur soundconverter-2.0.4-orig/soundconverter/gstreamer.py soundconverter-2.0.4-fedora/soundconverter/gstreamer.py
+--- soundconverter-2.0.4-orig/soundconverter/gstreamer.py 2012-10-04 13:56:26.000000000 +0200
++++ soundconverter-2.0.4-fedora/soundconverter/gstreamer.py 2013-02-18 08:04:19.943404728 +0100
+@@ -181,13 +181,16 @@
+ gst.update_registry()
+ self.parsed = False
+ self.duration = None
+- self.finished()
+- vfs_unlink(self.output_filename)
++ Pipeline.finished(self)
++ if hasattr(self,'output_filename'):
++ if vfs_exists(self.output_filename):
++ vfs_unlink(self.output_filename)
+ self.play()
+ return
+- self.done()
++ self.error = 'Could not install missing GStreamer plug-in.'
++ self.done() # this also emits 'finished'
+ if result == gst.pbutils.INSTALL_PLUGINS_USER_ABORT:
+- show_error(_('Plugin installation aborted.'))
++ show_error('Error',_('Plugin installation aborted.'))
+ return
+
+ show_error('Error', 'failed to install plugins: %s' % gobject.markup_escape_text(str(result)))
+@@ -456,10 +459,14 @@
+
+ def finished(self):
+ Pipeline.finished(self)
+- self.sound_file.tags_read = True
++ if not self.error:
++ # found_tag_hook must evaluate this properly as not to
++ # add the file to the converter queue on error condition
++ self.sound_file.tags_read = True
+ if self.found_tag_hook:
+ gobject.idle_add(self.found_tag_hook, self)
+- dontdelete.remove(self)
++ if self in dontdelete:
++ dontdelete.remove(self)
+
+
+ class Converter(Decoder):
+@@ -501,24 +508,23 @@
+ 'gst-profile': self.add_audio_profile,
+ }
+ self.add_command('audiorate')
+- self.add_command('audioresample')
+ self.add_command('audioconvert')
++ self.add_command('audioresample')
+
+- # audio resampling support
+- if self.output_resample:
+- self.add_command('audio/x-raw-int,rate=%d' % self.resample_rate)
+- self.add_command('audioresample')
+- self.add_command('audioconvert')
+-
+- if self.force_mono:
+- self.add_command('audio/x-raw-int,channels=1')
++ if self.output_resample or self.force_mono:
++ cmd = 'audio/x-raw-int'
++ if self.output_resample:
++ cmd += ',rate=%d' % self.resample_rate
++ if self.force_mono:
++ cmd += ',channels=1'
++ self.add_command(cmd)
+ self.add_command('audioconvert')
+
+ encoder = self.encoders[self.output_type]()
+ if not encoder:
+ # TODO: is this used ?
+ # TODO: add proper error management when an encoder cannot be created
+- show_error(_("Cannot create a decoder for \'%s\' format.") %
++ show_error('Error',_("Cannot create a decoder for \'%s\' format.") %
+ self.output_type)
+ return
+
+@@ -529,7 +535,7 @@
+ if dirname and not gnomevfs.exists(dirname):
+ log('Creating folder: \'%s\'' % dirname)
+ if not vfs_makedirs(str(dirname)):
+- show_error(_("Cannot create \'%s\' folder.") % dirname)
++ show_error('Error',_("Cannot create \'%s\' folder.") % dirname)
+ return
+
+ self.add_command('%s location="%s"' % (
+diff -Nur soundconverter-2.0.4-orig/soundconverter/ui.py soundconverter-2.0.4-fedora/soundconverter/ui.py
+--- soundconverter-2.0.4-orig/soundconverter/ui.py 2012-10-06 12:43:23.000000000 +0200
++++ soundconverter-2.0.4-fedora/soundconverter/ui.py 2013-02-18 08:06:24.814656593 +0100
+@@ -93,7 +93,10 @@
+ def show_error(self, primary, secondary):
+ self.primary.set_markup(primary)
+ self.secondary.set_markup(secondary)
+- sys.stderr.write(_('\nError: %s\n%s\n') % (primary, secondary))
++ try:
++ sys.stderr.write(_('\nError: %s\n%s\n') % (primary, secondary))
++ except:
++ pass
+ self.dialog.run()
+ self.dialog.hide()
+
+@@ -109,7 +112,10 @@
+ self.primary = builder.get_object('label_error')
+
+ def show_error(self, primary, secondary):
+- sys.stderr.write(_('\nError: %s\n%s\n') % (primary, secondary))
++ try:
++ sys.stderr.write(_('\nError: %s\n%s\n') % (primary, secondary))
++ except:
++ pass
+ #self.msg_area.set_text_and_icon(gtk.STOCK_DIALOG_ERROR, primary, secondary)
+ #self.msg_area.show()
+ self.primary.set_text(primary)
+@@ -177,6 +183,7 @@
+ def drag_data_received(self, widget, context, x, y, selection,
+ mime_id, time):
+
++ widget.stop_emission('drag_data_received')
+ if mime_id >= 0 and mime_id < len(self.drop_mime_types):
+ self.add_uris([uri.strip() for uri in selection.data.split('\n')])
+ context.finish(True, False, time)
+@@ -248,8 +255,13 @@
+ files.append(uri)
+
+ if not base:
+- base, notused = os.path.split(os.path.commonprefix(files))
+- base += '/'
++ base = os.path.commonprefix(files)
++ if base and not base.endswith('/'):
++ # we want a common folder
++ base = base[0:base.rfind('/')]
++ base += '/'
++ else:
++ base += '/'
+
+ for f in files:
+ sound_file = SoundFile(f, base)
+@@ -542,6 +554,9 @@
+ for b in widgets:
+ mime, encoder_name = b
+ encoder_present = encoder_name in available_elements
++ # special brute-force check to disable this encoder
++ if mime == 'gst-profile' and len(audio_profiles_list) == 0:
++ encoder_name = 'no GNOME Audio Profiles available'
+ if encoder_name and not encoder_present:
+ del model[i]
+ if mime_type == mime:
+@@ -812,9 +827,9 @@
+
+ def on_choose_folder_clicked(self, button):
+ ret = self.target_folder_chooser.run()
++ folder = self.target_folder_chooser.get_uri()
+ self.target_folder_chooser.hide()
+ if ret == gtk.RESPONSE_OK:
+- folder = self.target_folder_chooser.get_uri()
+ if folder:
+ self.set_string('selected-folder', urllib.unquote(folder))
+ self.update_selected_folder()
+@@ -1254,8 +1269,8 @@
+ self.addchooser.set_current_folder_uri(last_folder)
+
+ ret = self.addchooser.run()
+- self.addchooser.hide()
+ folder = self.addchooser.get_current_folder_uri()
++ self.addchooser.hide()
+ if ret == gtk.RESPONSE_OK and folder:
+ self.filelist.add_uris(self.addchooser.get_uris())
+ self.prefs.set_string('last-used-folder', folder)
+@@ -1267,18 +1282,15 @@
+ self.addfolderchooser.set_current_folder_uri(last_folder)
+
+ ret = self.addfolderchooser.run()
++ folders = self.addfolderchooser.get_uris()
++ folder = self.addfolderchooser.get_current_folder_uri()
+ self.addfolderchooser.hide()
+ if ret == gtk.RESPONSE_OK:
+-
+- folders = self.addfolderchooser.get_uris()
+-
+ extensions = None
+ if self.combo.get_active():
+ patterns = filepattern[self.combo.get_active()][1].split(';')
+ extensions = [os.path.splitext(p)[1] for p in patterns]
+ self.filelist.add_uris(folders, extensions=extensions)
+-
+- folder = self.addfolderchooser.get_current_folder_uri()
+ if folder:
+ self.prefs.set_string('last-used-folder', folder)
+
+@@ -1287,7 +1299,8 @@
+ def on_remove_activate(self, *args):
+ model, paths = self.filelist_selection.get_selected_rows()
+ while paths:
+- i = self.filelist.model.get_iter(paths[0])
++ childpath = model.convert_path_to_child_path(paths[0])
++ i = self.filelist.model.get_iter(childpath)
+ self.filelist.remove(i)
+ model, paths = self.filelist_selection.get_selected_rows()
+ self.set_sensitive()
+@@ -1305,11 +1318,20 @@
+
+ tagreader = TagReader(sound_file)
+ tagreader.set_found_tag_hook(self.tags_read)
++ self.tag_reader_tasks.append(tagreader)
+ tagreader.start()
+
+ def tags_read(self, tagreader):
++ self.tag_reader_tasks.remove(tagreader)
+ sound_file = tagreader.get_sound_file()
+- self.converter.add(sound_file)
++ try:
++ if not sound_file.tags_read:
++ raise ConverterQueueError
++ self.converter.add(sound_file)
++ except ConverterQueueCanceled:
++ self.tag_reader_exception = ConverterQueueCanceled
++ except ConverterQueueError:
++ self.tag_reader_exception = ConverterQueueError
+
+ def on_progress(self):
+ if self.pulse_progress >= 0: # still waiting for tags
+@@ -1336,6 +1358,9 @@
+ return running
+
+ def do_convert(self):
++ self.tag_reader_exception = None
++ self.tag_reader_tasks = []
++ self.converter.abort() # to start with empty queues
+ try:
+ self.pulse_progress = -1
+ gobject.timeout_add(100, self.on_progress)
+@@ -1347,6 +1372,10 @@
+ total = len(files)
+ for i, sound_file in enumerate(files):
+ gtk_iteration()
++ e = self.tag_reader_exception
++ if e:
++ log("Forwarded exception!")
++ raise e
+ self.pulse_progress = float(i)/total
+ sound_file.progress = None
+ if self.prefs.require_tags:
+@@ -1354,6 +1383,13 @@
+ else:
+ self.converter.add(sound_file)
+
++ while len(self.tag_reader_tasks)>0 and len(self.converter.waiting_tasks) < total:
++ gtk_sleep(1)
++ e = self.tag_reader_exception
++ if e:
++ log("Forwarded exception!")
++ raise e
++
+ except ConverterQueueCanceled:
+ log('cancelling conversion.')
+ self.conversion_ended()
+@@ -1430,6 +1466,7 @@
+ self.filelist.hide_row_progress()
+ self.status_frame.show()
+ self.widget.set_sensitive(True)
++ self.converter.abort()
+ try:
+ from gi.repository import Unity
+ launcher = Unity.LauncherEntry.get_for_desktop_id ("soundconverter.desktop")
diff --git a/soundconverter.spec b/soundconverter.spec
index 1c605ca..a925508 100644
--- a/soundconverter.spec
+++ b/soundconverter.spec
@@ -2,7 +2,7 @@
Name: soundconverter
Version: 2.0.4
-Release: 16%{?dist}
+Release: 17%{?dist}
Summary: Simple sound converter application for GNOME
Group: Applications/Multimedia
@@ -12,30 +12,31 @@ Source0: http://launchpad.net/soundconverter/trunk/%{tar_ver}/+download/s
BuildArch: noarch
# applied, lp #1077880
-Patch0: soundconverter-2.0.4-no-space-left.patch
+# soundconverter-2.0.4-no-space-left.patch
# applied, lp #1063724 / gnome bz #683708
-Patch1: soundconverter-2.0.4-folder-choose.patch
+# soundconverter-2.0.4-folder-choose.patch
# fixed, lp #1087901
-Patch2: soundconverter-2.0.4-rootfiles.patch
+# soundconverter-2.0.4-rootfiles.patch
# applied, lp #1121164
-Patch3: soundconverter-2.0.4-gstreamer-show_error.patch
+# soundconverter-2.0.4-gstreamer-show_error.patch
# lp #1121192
-# TODO: recheck the rewrite in >= 2.0.5
-Patch4: soundconverter-2.0.4-tagreader-exceptions.patch
+# TODO: recheck the rewrite in >= 2.0.5
+# recursive read_tags exceeds max. depth, so no go so far
+# soundconverter-2.0.4-tagreader-exceptions.patch
# applied, lp #1121297
-Patch5: soundconverter-2.0.4-abort-conversion.patch
+# soundconverter-2.0.4-abort-conversion.patch
# applied, lp #1121132
-Patch6: soundconverter-2.0.4-gst-pipeline.patch
+# soundconverter-2.0.4-gst-pipeline.patch
# reported, lp #1123410
-# reported, lp #1128332
-# reported, lp #1128340
-Patch7: soundconverter-2.0.4-gst-install.patch
-# reported, lp #1123957
-Patch8: soundconverter-2.0.4-no-gnome-audio-profiles.patch
-# reported, lp #1123957
-Patch9: soundconverter-2.0.4-drag-data-received-warning.patch
-# reported, lp #1123519
-Patch10: soundconverter-2.0.4-remove-treesortedmodel.patch
+# soundconverter-2.0.4-gst-install.patch
+# fixed, lp #1123957
+# TODO: recheck in >= 2.0.5
+# soundconverter-2.0.4-no-gnome-audio-profiles.patch
+# applied, lp #1124015
+# soundconverter-2.0.4-drag-data-received-warning.patch
+# applied, lp #1123519
+# soundconverter-2.0.4-remove-treesortedmodel.patch
+Patch0: soundconverter-2.0.4-fedora.patch
BuildRequires: desktop-file-utils
BuildRequires: intltool gettext
@@ -74,17 +75,7 @@ writes anything the GStreamer library can.
%prep
%setup -q -n %{name}-%{tar_ver}
-%patch0 -p1 -b .no-space-left
-%patch1 -p1 -b .folder-choose
-%patch2 -p1 -b .rootfiles
-%patch3 -p1 -b .gstreamer-show-error
-%patch4 -p1 -b .tagreader-exceptions
-%patch5 -p1 -b .abort-conversion
-%patch6 -p1 -b .gst-pipeline
-%patch7 -p1 -F3 -b .gst-install-abort
-%patch8 -p1 -b .no-gnome-audio-profiles
-%patch9 -p1 -b .drag-data-received-warning
-%patch10 -p1 -b .disable-remove
+%patch0 -p1
%build
@@ -138,6 +129,13 @@ update-desktop-database &> /dev/null ||:
%changelog
+* Mon Feb 18 2013 Michael Schwendt <mschwendt at fedoraproject.org> - 2.0.4-17
+- Add more fixes for success/failure of GStreamer plug-in installation,
+ which makes it possible to fix the idle callback race betwen reading of
+ tags and start of conversion.
+- Merge all applied patches into a single file to avoid incremental
+ patching in places where 2.0.5-pre currently differs a lot but fails.
+
* Sun Feb 17 2013 Michael Schwendt <mschwendt at fedoraproject.org> - 2.0.4-16
- Fix tracebacks upon successfully installing a missing GStreamer plugin.
More information about the scm-commits
mailing list