summaryrefslogtreecommitdiff
path: root/nephilim/metadata_fetcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'nephilim/metadata_fetcher.py')
-rw-r--r--nephilim/metadata_fetcher.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/nephilim/metadata_fetcher.py b/nephilim/metadata_fetcher.py
new file mode 100644
index 0000000..9e18aac
--- /dev/null
+++ b/nephilim/metadata_fetcher.py
@@ -0,0 +1,79 @@
+#
+# Copyright (C) 2010 Anton Khirnov <anton@khirnov.net>
+#
+# Nephilim 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 3 of the License, or
+# (at your option) any later version.
+#
+# Nephilim 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 Nephilim. If not, see <http://www.gnu.org/licenses/>.
+#
+
+from PyQt4 import QtCore, QtNetwork
+from PyQt4.QtCore import pyqtSignal as Signal
+
+from song import Song
+
+class MetadataFetcher(QtCore.QObject):
+ """A basic class for metadata fetchers. Provides a fetch(song) function,
+ emits a finished(song, metadata) signal when done; lyrics is either a Python
+ unicode string or None if not found."""
+ #public, read-only
+ logger = None
+ name = ''
+
+ #private
+ nam = None # NetworkAccessManager
+ rep = None # current NetworkReply.
+ song = None # current song
+
+ # SIGNALS
+ finished = Signal([Song, object])
+
+ #### private ####
+ def __init__(self, plugin):
+ QtCore.QObject.__init__(self, plugin)
+
+ self.nam = QtNetwork.QNetworkAccessManager()
+ self.logger = plugin.logger
+
+ def fetch2(self, song, url):
+ """A private convenience function to initiate fetch process."""
+ # abort any existing connections
+ self.abort()
+ self.song = song
+
+ self.logger.info('Searching %s: %s.'%(self. name, url.toString()))
+ self.rep = self.nam.get(QtNetwork.QNetworkRequest(url))
+ self.rep.error.connect(self.handle_error)
+
+ def finish(self, metadata = None):
+ """A private convenience function to clean up and emit finished().
+ Feel free to reimplement/not use it."""
+ self.rep = None
+ self.finished.emit(self.song, metadata)
+ self.song = None
+
+ def handle_error(self):
+ """Print the error and abort."""
+ self.logger.error(self.rep.errorString())
+ self.abort()
+ self.finish()
+
+ #### public ####
+ def fetch(self, song):
+ """Reimplement this in subclasses."""
+ pass
+
+ def abort(self):
+ """Abort all downloads currently in progress."""
+ if self.rep:
+ self.rep.blockSignals(True)
+ self.rep.abort()
+ self.rep = None