[gnome-music] player: Add optional inhibition of system suspend



commit d1fe10fb939c17619b569cf990291d06520666cb
Author: Apostol Bakalov <apogza gmail com>
Date:   Thu May 17 20:43:01 2018 +0300

    player: Add optional inhibition of system suspend
    
    Music does not currently inhibit automatic system suspend
    while playing music.
    This feature adds a gsetting that allows inhibiting
    the system suspend until Music has played all the tracks in
    its playlist.

 data/org.gnome.Music.gschema.xml |  5 +++
 gnomemusic/inhibitsuspend.py     | 97 ++++++++++++++++++++++++++++++++++++++++
 gnomemusic/player.py             |  4 ++
 po/POTFILES.in                   |  1 +
 4 files changed, 107 insertions(+)
---
diff --git a/data/org.gnome.Music.gschema.xml b/data/org.gnome.Music.gschema.xml
index aefc4bfd..12e63e29 100644
--- a/data/org.gnome.Music.gschema.xml
+++ b/data/org.gnome.Music.gschema.xml
@@ -38,5 +38,10 @@
             <summary>Inital state has been displayed</summary>
             <description>Set to true when initial state has been displayed</description>
         </key>
+        <key type="b" name="inhibit-suspend">
+            <default>false</default>
+            <summary>Inhibit system suspend</summary>
+            <description>Enables or disables inhibiting system suspend while playing music</description>
+        </key>
     </schema>
 </schemalist>
diff --git a/gnomemusic/inhibitsuspend.py b/gnomemusic/inhibitsuspend.py
new file mode 100644
index 00000000..0359daed
--- /dev/null
+++ b/gnomemusic/inhibitsuspend.py
@@ -0,0 +1,97 @@
+# Copyright © 2018 The GNOME Music developers
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music.  This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered.  If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so.  If you do not wish to do so,
+# delete this exception statement from your version.
+
+import logging
+
+from gettext import gettext as _
+from gi.repository import Gtk, Gio, GObject
+
+from gnomemusic import log
+from gnomemusic.gstplayer import Playback
+
+logger = logging.getLogger(__name__)
+
+
+class InhibitSuspend(GObject.GObject):
+    """InhibitSuspend object
+
+    Contains the logic to postpone automatic system suspend
+    until the application has played all the songs in the playlist.
+    """
+
+    def __repr__(self):
+        return '<InhibitSuspend>'
+
+    @log
+    def __init__(self, root_window, player):
+        super().__init__()
+
+        self._root_window = root_window
+        self._application = root_window.get_application()
+        self._player = player
+        self._inhibit_cookie = 0
+
+        self._player.connect(
+            'playback-status-changed', self._on_playback_status_changed)
+
+        self._settings = Gio.Settings.new('org.gnome.Music')
+        self._should_inhibit = self._settings.get_boolean('inhibit-suspend')
+        self._settings.connect(
+            'changed::inhibit-suspend', self._on_inhibit_suspend_changed)
+
+    @log
+    def _inhibit_suspend(self):
+        if (self._inhibit_cookie == 0
+                and self._should_inhibit):
+            self._inhibit_cookie = self._application.inhibit(
+                self._root_window, Gtk.ApplicationInhibitFlags.SUSPEND,
+                _("Playing music"))
+
+            if self._inhibit_cookie == 0:
+                logger.warning("Unable to inhibit automatic system suspend")
+
+    @log
+    def _uninhibit_suspend(self):
+        if self._inhibit_cookie != 0:
+            self._application.uninhibit(self._inhibit_cookie)
+            self._inhibit_cookie = 0
+
+    @log
+    def _on_inhibit_suspend_changed(self, settings, value):
+        self._should_inhibit = value
+        self._on_playback_status_changed(None)
+
+    @log
+    def _on_playback_status_changed(self, arguments):
+        if self._player.get_playback_status() == Playback.PLAYING:
+            self._inhibit_suspend()
+
+        # TODO: The additional check for has_next() is necessary
+        # since after a track is done, the player
+        # goes into STOPPED state before it goes back to PLAYING.
+        # To be simplified when the player's behavior is corrected.
+
+        if (self._player.get_playback_status() == Playback.PAUSED
+                or (self._player.get_playback_status() == Playback.STOPPED
+                    and not self._player.has_next())):
+            self._uninhibit_suspend()
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index 976eccdd..f4951390 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -37,6 +37,7 @@ from gi.repository import Gtk, GLib, Gio, GObject, Gst, GstPbutils
 from gnomemusic import log
 from gnomemusic.gstplayer import GstPlayer, Playback
 from gnomemusic.grilo import grilo
+from gnomemusic.inhibitsuspend import InhibitSuspend
 from gnomemusic.playlists import Playlists
 from gnomemusic.scrobbler import LastFmScrobbler
 
@@ -122,6 +123,9 @@ class Player(GObject.GObject):
         self._player.connect('eos', self._on_eos)
         self._player.connect('notify::state', self._on_state_change)
 
+        root_window = parent_window.get_toplevel()
+        self._inhibit_suspend = InhibitSuspend(root_window, self)
+
         self._lastfm = LastFmScrobbler()
 
     @log
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6875e6da..a77faab7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -8,6 +8,7 @@ gnomemusic/albumartcache.py
 gnomemusic/application.py
 gnomemusic/grilo.py
 gnomemusic/gstplayer.py
+gnomemusic/inhibitsuspend.py
 gnomemusic/mpris.py
 gnomemusic/playlists.py
 gnomemusic/query.py


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]