[gnome-music/wip/jfelder/gstplayer-disable-about-to-finish-http-files: 1/3] grldleynawrapper: fetches songs from dleyna server



commit cf352b8da6e1760bf5b535f9be62c362fb4c4ec8
Author: Chinmay Gurjar <chnmgurjar gmail com>
Date:   Sat May 23 02:46:32 2020 +0530

    grldleynawrapper: fetches songs from dleyna server
    
    Fetches songs from dleyna server and adds them to the songs model.
    Register dleyna grilo wrapper in the coregrilo.

 gnomemusic/coregrilo.py                      | 11 ++++
 gnomemusic/grilowrappers/grldleynawrapper.py | 89 ++++++++++++++++++++++++++++
 org.gnome.Music.json                         |  3 +-
 3 files changed, 102 insertions(+), 1 deletion(-)
---
diff --git a/gnomemusic/coregrilo.py b/gnomemusic/coregrilo.py
index a7a4936e..f7afd17f 100644
--- a/gnomemusic/coregrilo.py
+++ b/gnomemusic/coregrilo.py
@@ -28,6 +28,7 @@ import gi
 gi.require_version('Grl', '0.3')
 from gi.repository import Grl, GLib, GObject
 
+from gnomemusic.grilowrappers.grldleynawrapper import GrlDleynaWrapper
 from gnomemusic.grilowrappers.grlsearchwrapper import GrlSearchWrapper
 from gnomemusic.grilowrappers.grltrackerwrapper import GrlTrackerWrapper
 from gnomemusic.trackerwrapper import TrackerState, TrackerWrapper
@@ -143,6 +144,16 @@ class CoreGrilo(GObject.GObject):
                 grl_tracker_wrapper = self._wrappers[source.props.source_id]
                 registry.unregister_source(grl_tracker_wrapper.props.source)
                 grl_tracker_wrapper.props.source = source
+        elif (source.props.source_id.startswith("grl-dleyna")):
+            if source.props.source_id not in self._wrappers.keys():
+                new_wrapper = GrlDleynaWrapper(
+                    source, self._application)
+                self._wrappers[source.props.source_id] = new_wrapper
+                self._log.debug("Adding wrapper {}".format(new_wrapper))
+            else:
+                grl_dleyna_wrapper = self._wrappers[source.props.source_id]
+                registry.unregister_source(grl_dleyna_wrapper.props.source)
+                grl_dleyna_wrapper.props.source = source
         elif (source.props.source_id not in self._search_wrappers.keys()
                 and source.props.source_id not in self._wrappers.keys()
                 and source.props.source_id != "grl-tracker-source"
diff --git a/gnomemusic/grilowrappers/grldleynawrapper.py b/gnomemusic/grilowrappers/grldleynawrapper.py
new file mode 100644
index 00000000..ae20fd12
--- /dev/null
+++ b/gnomemusic/grilowrappers/grldleynawrapper.py
@@ -0,0 +1,89 @@
+import gi
+gi.require_versions({"Grl": "0.3"})
+from gi.repository import Grl, GObject
+
+from gnomemusic.coresong import CoreSong
+
+
+class GrlDleynaWrapper(GObject.GObject):
+    """Wrapper for the Grilo Dleyna source.
+    """
+    _SPLICE_SIZE = 100
+    METADATA_KEYS = [
+        Grl.METADATA_KEY_ALBUM,
+        Grl.METADATA_KEY_ARTIST,
+        Grl.METADATA_KEY_AUTHOR,
+        Grl.METADATA_KEY_ID,
+        Grl.METADATA_KEY_PUBLICATION_DATE,
+        Grl.METADATA_KEY_TITLE,
+        Grl.METADATA_KEY_TRACK_NUMBER,
+        Grl.METADATA_KEY_URL
+    ]
+
+    def __init__(self, source, application):
+        super().__init__()
+
+        self._application = application
+        self._coremodel = application.props.coremodel
+        self._log = application.props.log
+        self._songs_model = self._coremodel.props.songs
+        self._source = source
+        self._hash = {}
+        self._window = application.props.window
+
+        self._fast_options = Grl.OperationOptions()
+        self._fast_options.set_resolution_flags(
+            Grl.ResolutionFlags.FAST_ONLY | Grl.ResolutionFlags.IDLE_RELAY)
+
+        self.props.source = source
+
+        self._initial_songs_fill(self.props.source)
+        # self._initial_albums_fill(self.props.source)
+        # self._initial_artists_fill(self.props.source)
+
+    @GObject.Property(type=Grl.Source, default=None)
+    def source(self):
+        return self._source
+
+    def _initial_songs_fill(self, source):
+        self._window.notifications_popup.push_loading()
+        songs_added = []
+
+        def _add_to_model(source, op_id, media, remaining, error):
+            if error:
+                self._log.warning("Error: {}".format(error))
+                self._window.notifications_popup.pop_loading()
+                return
+            if remaining == 0:
+                self._songs_model.splice(
+                    self._songs_model.get_n_items(), 0, songs_added)
+                self._window.notifications_popup.pop_loading()
+
+                return
+
+            if not media:
+                self._songs_model.splice(
+                    self._songs_model.get_n_items(), 0, songs_added)
+                self._window.notifications_popup.pop_loading()
+
+                return
+
+            song = CoreSong(self._application, media)
+            song.props.title = (
+                song.props.title + " (" + source.props.source_name + ")")
+            songs_added.append(song)
+            self._hash[media.get_id()] = song
+            if len(songs_added) == self._SPLICE_SIZE:
+                self._songs_model.splice(
+                    self._songs_model.get_n_items(), 0, songs_added)
+                songs_added.clear()
+
+        query = """upnp:class derivedfrom 'object.item.audioItem'
+        """.replace('\n', ' ').strip()
+
+        options = self._fast_options.copy()
+        self._source.query(
+            query, self.METADATA_KEYS, options, _add_to_model)
+
+    def search(self, text):
+        pass
diff --git a/org.gnome.Music.json b/org.gnome.Music.json
index 97b6c74f..5dc3233f 100644
--- a/org.gnome.Music.json
+++ b/org.gnome.Music.json
@@ -22,6 +22,7 @@
         "--talk-name=org.gnome.SettingsDaemon.MediaKeys",
         "--talk-name=org.gtk.vfs",
         "--talk-name=org.gtk.vfs.*",
+        "--talk-name=com.intel.dleyna-server",
         "--system-talk-name=org.freedesktop.login1"
     ],
     "cleanup": [
@@ -115,7 +116,7 @@
             "buildsystem": "meson",
             "config-opts": [ "-Denable-tracker=yes",
                              "-Denable-bookmarks=no",
-                             "-Denable-dleyna=no",
+                             "-Denable-dleyna=yes",
                              "-Denable-filesystem=no",
                              "-Denable-freebox=no",
                              "-Denable-local-metadata=no",


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