[rhythmbox] artsearch: re-add embedded cover art search
- From: Jonathan Matthew <jmatthew src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rhythmbox] artsearch: re-add embedded cover art search
- Date: Fri, 1 Mar 2013 12:19:52 +0000 (UTC)
commit f3df303622e9a4c0dd571a6c916a73b4fbbaa8ae
Author: Jonathan Matthew <jonathan d14n org>
Date: Fri Mar 1 22:12:32 2013 +1000
artsearch: re-add embedded cover art search
plugins/artsearch/Makefile.am | 1 +
plugins/artsearch/artsearch.py | 2 +
plugins/artsearch/embedded.py | 80 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 83 insertions(+), 0 deletions(-)
---
diff --git a/plugins/artsearch/Makefile.am b/plugins/artsearch/Makefile.am
index f53410f..69a0f2c 100644
--- a/plugins/artsearch/Makefile.am
+++ b/plugins/artsearch/Makefile.am
@@ -4,6 +4,7 @@ plugindir = $(PLUGINDIR)/artsearch
plugindatadir = $(PLUGINDATADIR)/artsearch
plugin_PYTHON = \
artsearch.py \
+ embedded.py \
lastfm.py \
local.py \
musicbrainz.py \
diff --git a/plugins/artsearch/artsearch.py b/plugins/artsearch/artsearch.py
index 3ded61b..990fca2 100644
--- a/plugins/artsearch/artsearch.py
+++ b/plugins/artsearch/artsearch.py
@@ -33,6 +33,7 @@ import oldcache
from lastfm import LastFMSearch
from local import LocalSearch
from musicbrainz import MusicBrainzSearch
+from embedded import EmbeddedSearch
class Search(object):
def __init__(self, store, key, last_time, searches):
@@ -76,6 +77,7 @@ class ArtSearchPlugin (GObject.GObject, Peas.Activatable):
searches = []
if oldcache.USEFUL:
searches.append(oldcache.OldCacheSearch())
+ searches.append(EmbeddedSearch())
searches.append(LocalSearch())
searches.append(MusicBrainzSearch())
searches.append(LastFMSearch())
diff --git a/plugins/artsearch/embedded.py b/plugins/artsearch/embedded.py
new file mode 100644
index 0000000..169536f
--- /dev/null
+++ b/plugins/artsearch/embedded.py
@@ -0,0 +1,80 @@
+# -*- Mode: python; coding: utf-8; tab-width: 8; indent-tabs-mode: t; -*-
+#
+# Copyright (C) 2013 - Jonathan Matthew <jonathan d14n org>
+#
+# This program 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, or (at your option)
+# any later version.
+#
+# The Rhythmbox authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and Rhythmbox. This permission is above and beyond the permissions granted
+# by the GPL license by which Rhythmbox 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.
+#
+# This program 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 this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from gi.repository import RB
+from gi.repository import Gst, GstPbutils
+
+class EmbeddedSearch(object):
+
+ def finished_cb(self, discoverer):
+ self.callback(self.callback_args)
+
+ def discovered_cb(self, discoverer, info, error):
+ tags = info.get_tags()
+ for tagname in ('image', 'preview-image'):
+ (found, sample) = tags.get_sample(tagname)
+ if not found:
+ print "no %s" % tagname
+ continue
+
+ pixbuf = RB.gst_process_embedded_image(tags, tagname)
+ if not pixbuf:
+ print "no pixbuf in %s" % tagname
+ continue
+
+ print "trying to store pixbuf from %s" % tagname
+ key = RB.ExtDBKey.create_storage("album", self.search_key.get_field("album"))
+ artists = self.search_key.get_field_values("artist")
+ key.add_field("artist", artists[0])
+ self.store.store(key, RB.ExtDBSourceType.EMBEDDED, pixbuf)
+ return
+
+
+ def search (self, key, last_time, store, callback, args):
+ location = key.get_info("location")
+ if location is None:
+ print "not searching, we don't have a location"
+ callback(args)
+ return
+
+ if location.startswith("file://") is False:
+ print "not searching in non-local file %s" % location
+ callback(args)
+ return
+
+ # should avoid checking the playing entry, since the player already handles that
+
+ self.callback = callback
+ self.callback_args = args
+ self.store = store
+ self.search_key = key
+
+ print "discovering %s" % location
+ self.discoverer = GstPbutils.Discoverer(timeout=Gst.SECOND*5)
+ self.discoverer.connect('finished', self.finished_cb)
+ self.discoverer.connect('discovered', self.discovered_cb)
+ self.discoverer.start()
+ self.discoverer.discover_uri_async(location)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]