[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