[gnome-music] Use libsoup for remote art retrieval



commit 179991068e3adc28c89a0e674d24cfad9b689567
Author: enehring <evan d nehring gmail com>
Date:   Sun Apr 26 11:28:05 2020 -0400

    Use libsoup for remote art retrieval
    
    Fixes #378

 gnomemusic/albumartcache.py | 18 +++++++++++++-----
 gnomemusic/artistart.py     | 19 ++++++++++++++-----
 2 files changed, 27 insertions(+), 10 deletions(-)
---
diff --git a/gnomemusic/albumartcache.py b/gnomemusic/albumartcache.py
index 8f454275..6c388711 100644
--- a/gnomemusic/albumartcache.py
+++ b/gnomemusic/albumartcache.py
@@ -30,8 +30,9 @@ import cairo
 import gi
 gi.require_version('GstTag', '1.0')
 gi.require_version('MediaArt', '2.0')
+gi.require_version("Soup", "2.4")
 from gi.repository import (Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk, MediaArt,
-                           Gst, GstTag, GstPbutils)
+                           Gst, GstTag, GstPbutils, Soup)
 
 from gnomemusic.musiclogger import MusicLogger
 
@@ -547,6 +548,7 @@ class RemoteArt(GObject.GObject):
         self._album = None
         self._coresong = None
         self._coregrilo = None
+        self._soup_session = Soup.Session.new()
 
     def query(self, coresong):
         """Start the remote query
@@ -633,8 +635,15 @@ class RemoteArt(GObject.GObject):
                 "Error: {}, {}".format(error.domain, error.message))
 
     def _read_callback(self, src, result, data):
+        if result.props.status_code != 200:
+            self._log.debug(
+                "Failed to get remote art for the album {} by {} : {}".format(
+                    self._album, self._artist, result.props.reason_phrase))
+            return
+
         try:
-            istream = src.read_finish(result)
+            istream = Gio.MemoryInputStream.new_from_bytes(
+                result.props.response_body_data)
         except GLib.Error as error:
             self._log.warning(
                 "Error: {}, {}".format(error.domain, error.message))
@@ -670,6 +679,5 @@ class RemoteArt(GObject.GObject):
             self.emit('unavailable')
             return
 
-        src = Gio.File.new_for_uri(thumb_uri)
-        src.read_async(
-            GLib.PRIORITY_LOW, None, self._read_callback, None)
+        msg = Soup.Message.new("GET", thumb_uri)
+        self._soup_session.queue_message(msg, self._read_callback, None)
diff --git a/gnomemusic/artistart.py b/gnomemusic/artistart.py
index 41716d0a..973c5369 100644
--- a/gnomemusic/artistart.py
+++ b/gnomemusic/artistart.py
@@ -28,7 +28,9 @@ from math import pi
 import cairo
 import gi
 gi.require_version("MediaArt", "2.0")
-from gi.repository import Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk, MediaArt
+gi.require_version("Soup", "2.4")
+from gi.repository import (Gdk, GdkPixbuf, Gio, GLib, GObject, Gtk, MediaArt,
+                           Soup)
 
 from gnomemusic.musiclogger import MusicLogger
 
@@ -134,6 +136,7 @@ class ArtistArt(GObject.GObject):
 
         self._coreartist = coreartist
         self._artist = self._coreartist.props.artist
+        self._soup_session = Soup.Session.new()
 
         if self._in_cache():
             return
@@ -162,13 +165,19 @@ class ArtistArt(GObject.GObject):
             self._coreartist.props.cached_thumbnail_uri = ""
             return
 
-        src = Gio.File.new_for_uri(uri)
-        src.read_async(
-            GLib.PRIORITY_LOW, None, self._read_callback, None)
+        msg = Soup.Message.new("GET", uri)
+        self._soup_session.queue_message(msg, self._read_callback, None)
 
     def _read_callback(self, src, result, data):
+        if result.props.status_code != 200:
+            self._log.debug(
+                "Failed to get remote art for the artist {} : {}".format(
+                    self._artist, result.props.reason_phrase))
+            return
+
         try:
-            istream = src.read_finish(result)
+            istream = Gio.MemoryInputStream.new_from_bytes(
+                result.props.response_body_data)
         except GLib.Error as error:
             self._log.warning(
                 "Error: {}, {}".format(error.domain, error.message))


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