[exaile/f16] Update to 0.3.2.2 Drop hal. Apply patch to support udisk from upstream bzr's udisk branch

Deji Akingunola deji at fedoraproject.org
Fri Sep 2 03:35:52 UTC 2011


commit 386f7ce6e511771393312cf04dc3142d2b9f5f3d
Author: Deji Akingunola <dakingun at mail.com>
Date:   Thu Sep 1 23:38:14 2011 -0400

    Update to 0.3.2.2
    Drop hal. Apply patch to support udisk from upstream bzr's udisk branch

 exaile-udisks.patch |  253 +++++++++++++++++++++++++++++++++++++++++++++++++++
 exaile.spec         |   12 ++-
 sources             |    2 +-
 3 files changed, 263 insertions(+), 4 deletions(-)
---
diff --git a/exaile-udisks.patch b/exaile-udisks.patch
new file mode 100644
index 0000000..cc776fa
--- /dev/null
+++ b/exaile-udisks.patch
@@ -0,0 +1,253 @@
+--- plugins/cd/__init__.py	2011-07-18 20:32:50.690850000 -0400
++++ plugins/cd/__init__.py.new	2011-08-31 13:41:50.277924078 -0400
+@@ -27,12 +27,12 @@
+ 
+ from xl.nls import gettext as _
+ from xl import providers, event
+-from xl.hal import Handler
++from xl.hal import Handler, UDisksProvider
+ from xl.devices import Device
+ import logging
+ logger = logging.getLogger(__name__)
+ 
+-PROVIDER = None
++PROVIDER = PROVIDER_UDISKS = None
+ 
+ import dbus, threading, os, struct
+ from fcntl import ioctl
+@@ -61,15 +61,17 @@
+ CDROM_DATA_TRACK = 0x04
+ 
+ def enable(exaile):
+-    global PROVIDER
+-    PROVIDER = CDHandler()
+-    providers.register("hal", PROVIDER)
+-
++    global PROVIDER, PROVIDER_UDISKS
++    #~ PROVIDER = CDHandler()
++    #~ providers.register("hal", PROVIDER)
++    PROVIDER_UDISKS = UDisksCdProvider()
++    providers.register("udisks", PROVIDER_UDISKS)
+ 
+ def disable(exaile):
+-    global PROVIDER
++    global PROVIDER, PROVIDER_UDISKS
+     providers.unregister("hal", PROVIDER)
+-    PROVIDER = None
++    providers.unregister("udisks", PROVIDER_UDISKS)
++    PROVIDER = PROVIDER_UDISKS = None
+ 
+ class CDTocParser(object):
+     #based on code from http://carey.geek.nz/code/python-cdrom/cdtoc.py
+@@ -150,7 +152,7 @@
+         sort_tups.sort()
+         sorted = [ s[1] for s in sort_tups ]
+ 
+-        self.add_tracks(sorted)
++        self.extend(sorted)
+ 
+         if CDDB_AVAIL:
+             self.get_cddb_info()
+@@ -244,6 +246,24 @@
+ 
+         return cddev
+ 
++class UDisksCdProvider(UDisksProvider):
++    PRIORITY = UDisksProvider.NORMAL
++    
++    name = 'cd'
++
++    def get_priority(self, obj):
++        props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
++        iface = 'org.freedesktop.UDisks.Device'
++        # XXX: We use the number of audio tracks to identify audio CDs.
++        # There may be a better way....
++        compat = props.Get(iface, 'DriveMediaCompatibility')
++        return self.PRIORITY if 'optical_cd' in compat else None
++
++    def create_device(self, obj):
++        props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
++        iface = 'org.freedesktop.UDisks.Device'
++        return CDDevice(dev=props.Get(iface, 'DeviceFile'))
++
+ 
+ # vim: et sts=4 sw=4
+ 
+--- xl/main.py	2011-07-18 20:32:50.690850000 -0400
++++ xl/main.py.new	2011-08-31 13:57:44.678992423 -0400
+@@ -203,6 +203,8 @@
+         # Initialize HAL
+         if self.options.Hal:
+             from xl import hal
++            self.udisks = hal.UDisks(self.devices)
++            self.udisks.connect()
+             self.hal = hal.HAL(self.devices)
+             self.hal.connect()
+         else:
+--- xl/hal.py	2011-07-18 20:32:50.690850000 -0400
++++ xl/hal.py.new	2011-08-31 13:49:02.489520690 -0400
+@@ -24,7 +24,7 @@
+ # do so. If you do not wish to do so, delete this exception statement
+ # from your version.
+ 
+-import logging
++import logging, threading, time
+ import dbus
+ 
+ from xl import common, providers, event, devices, settings
+@@ -32,6 +32,120 @@
+ 
+ logger = logging.getLogger(__name__)
+ 
++class UDisks(providers.ProviderHandler):
++    """Provides support for UDisks devices.
++
++    If the D-Bus connection fails, this object will grow a "failed" attribute
++    with True as the value. Plugins should check for this attribute when
++    registering if they want to provide HAL fallback. FIXME: There's a race
++    condition here.
++    """
++
++    # States: start -> init -> addremove <-> listening -> end.
++    # The addremove state acts as a lock against concurrent changes.
++
++    def __init__(self, devicemanager):
++        self._lock = lock = threading.Lock()
++        self._state = 'init'
++
++        providers.ProviderHandler.__init__(self, 'udisks')
++        self.devicemanager = devicemanager
++
++        self.bus = self.obj = self.iface = None
++        self.devices = {}
++        self.providers = {}
++
++    @common.threaded
++    def connect(self):
++        assert self._state == 'init'
++        logger.debug("Connecting to UDisks")
++        try:
++            self.bus = bus = dbus.SystemBus()
++            self.obj = obj = bus.get_object('org.freedesktop.UDisks', '/org/freedesktop/UDisks')
++            self.iface = iface = dbus.Interface(obj, 'org.freedesktop.UDisks')
++            iface.connect_to_signal('DeviceAdded', self._device_added, path_keyword='path')
++            iface.connect_to_signal('DeviceRemoved', self._device_removed, path_keyword='path')
++            logger.info("Connected to UDisks")
++            event.log_event("hal_connected", self, None)
++        except Exception:
++            logger.warning("Failed to connect to UDisks, " \
++                    "autodetection of devices will be disabled.")
++            self._state = 'listening'
++            self.failed = True
++            return
++        self._state = 'addremove'
++        self._add_all()
++        self._state = 'listening'
++
++    def _add_all(self):
++        assert self._state == 'addremove'
++        for path in self.iface.EnumerateDevices():
++            self._add_path(path)
++
++    def _add_path(self, path):
++        assert self._state == 'addremove'
++        obj = self.bus.get_object('org.freedesktop.UDisks', path)
++        old, new = self._get_provider_for(obj)
++        if new is not old:
++            if old[0]:
++                self.devicemanager.remove_device(self.devices[path])
++            device = new[0].create_device(obj)
++            device.autoconnect()
++            self.devicemanager.add_device(device)
++            self.providers[path] = new
++            self.devices[path] = device
++
++    def _get_provider_for(self, obj):
++        """Return (old_provider, old_priority), (new_provider, new_priority)"""
++        assert self._state == 'addremove'
++        path = obj.object_path
++        highest = old = self.providers.get(path, (None, -1))
++        for provider in self.get_providers():
++            priority = provider.get_priority(obj)
++            if priority is not None and priority > highest[1]:
++                highest = (provider, priority)
++        return old, highest
++
++    def _remove_path(self, path):
++        assert self._state == 'addremove'
++        self.devicemanager.remove_device(self.devices[path])
++        del self.devices[path]
++
++    def _device_added(self, path):
++        import pdb; pdb.set_trace()
++        self._addremove()
++        self._add_path(path)
++        self._state = 'listening'
++
++    def _device_removed(self, path):
++        self._addremove()
++        try:
++            self._remove_path(path)
++        except KeyError: # Not ours
++            pass
++        self._state = 'listening'
++
++    def on_provider_added(self, provider):
++        self._addremove()
++        self._connect_all()
++        self._state = 'listening'
++
++    def on_provider_removed(self, provider):
++        self._addremove()
++        for path, provider_ in self.providers.iteritems():
++            if provider_ is provider:
++                self._remove_path(path)
++        self._state = 'listening'
++
++    def _addremove(self):
++        """Helper to transition safely to the addremove state"""
++        while True:
++            with self._lock:
++                if self._state == 'listening':
++                    self._state = 'addremove'
++                    break
++            time.sleep(1)
++
+ class HAL(providers.ProviderHandler):
+     """
+         HAL interface
+@@ -144,6 +258,13 @@
+     def device_from_udi(self, hal, udi):
+         pass
+ 
++class UDisksProvider:
++    VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH = range(0, 101, 25)
++    def get_priority(self, obj):
++        pass  # return: int [0..100] or None
++    def get_device(self, obj):
++        pass  # return: xl.devices.Device
++
+ 
+ # vim: et sts=4 sw=4
+ 
+--- xlgui/panel/flatplaylist.py	2011-07-18 20:32:50.690850000 -0400
++++ xlgui/panel/flatplaylist.py.new	2011-08-31 13:59:20.890789609 -0400
+@@ -29,7 +29,7 @@
+ 
+ from xl import metadata, trax
+ from xl.nls import gettext as _
+-from xlgui import panel, guiutil, menu
++from xlgui import panel, guiutil, oldmenu as menu
+ 
+ class FlatPlaylistPanel(panel.Panel):
+     """
+@@ -116,8 +116,7 @@
+     def set_playlist(self, pl):
+         self.model.clear()
+ 
+-        tracks = pl.get_tracks()
+-        self.tracks = tracks
++        self.tracks = tracks = list(pl)
+         for i, track in enumerate(tracks):
+             self.model.append([i + 1, track.get_tag_display("title"), track])
+ 
diff --git a/exaile.spec b/exaile.spec
index f517853..2fb296a 100644
--- a/exaile.spec
+++ b/exaile.spec
@@ -2,13 +2,14 @@
 
 Summary:	A music player
 Name:		exaile
-Version:	0.3.2.1
+Version:	0.3.2.2
 Release:	1%{?dist}
 Group:		Applications/Multimedia
 License:	GPLv2+
 URL:		http://www.exaile.org
-Source0:	http://launchpad.net/exaile/0.3.2/0.3.2.1/+download/exaile-%{version}.tar.gz
+Source0:	http://launchpad.net/exaile/0.3.2/0.3.2.2/+download/exaile-%{version}.tar.gz
 Patch0:		exaile-makefile.patch
+Patch1:		exaile-udisks.patch
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires:	pygobject2-devel
 BuildRequires:	desktop-file-utils
@@ -25,7 +26,7 @@ Requires:	python-inotify
 Requires:	python-CDDB
 Requires:	python-sexy
 Requires:	gamin-python
-Requires:	hal
+Requires:	udisks
 
 BuildArch:	noarch
 
@@ -45,6 +46,7 @@ on your iPod to last.fm
 %prep
 %setup -q
 %patch0 -p0 -b .fix
+%patch1 -p0 -b .udisk
 
 %build
 make %{?_smp_mflags}
@@ -76,6 +78,10 @@ rm -rf %{buildroot}
 %{python_sitelib}/exaile/
 
 %changelog
+* Wed Aug 31 2011 Deji Akingunola <dakingun at gmail.com> - 0.3.2.2-1
+- Update to 0.3.2.2
+- Drop hal. Apply patch to support udisk from upstream bzr's udisk branch
+
 * Thu Mar 03 2011 Deji Akingunola <dakingun at gmail.com> - 0.3.2.1-1
 - Update to 0.3.2.1
 
diff --git a/sources b/sources
index 8d46f94..17cb347 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-7ecfa9e52a9f2882717b3483518b604b  exaile-0.3.2.1.tar.gz
+b3fd87e40af6592df0b511183ca49408  exaile-0.3.2.2.tar.gz


More information about the scm-commits mailing list