summaryrefslogtreecommitdiff
path: root/lib/utils/APIClients.py
diff options
context:
space:
mode:
authorluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-06-12 20:33:36 +0000
committerluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-06-12 20:33:36 +0000
commit6657ae24658383a9841450329a518327638651c0 (patch)
tree82e7fd81486a4b9154f58ed5ffe6ad48e4d8fbdb /lib/utils/APIClients.py
parent865f8c58c8c29aaf431076bfffb4cfc4e8116b2d (diff)
reorganized lib
Diffstat (limited to 'lib/utils/APIClients.py')
-rw-r--r--lib/utils/APIClients.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/lib/utils/APIClients.py b/lib/utils/APIClients.py
new file mode 100644
index 0000000..24ab97b
--- /dev/null
+++ b/lib/utils/APIClients.py
@@ -0,0 +1,104 @@
+# APIClients for grabbing data from popular web services
+# By Scott Gilbertson
+# Copyright is lame, take what you want, except for those portions noted
+
+# Dependencies:
+import sys, urllib
+import xml.etree.cElementTree as xml_parser
+
+
+DEBUG = 0
+
+"""
+base class -- handles GoodReads.com, but works for any rss feed, just send an empty string for anything you don't need
+"""
+class APIClient:
+ def __init__(self, base_path, api_key):
+ self.api_key = api_key
+ self.base_path = base_path
+
+ def __getattr__(self, method):
+ def method(_self=self, _method=method, **params):
+ url = "%s%s?%s&" % (self.base_path, self.api_key, urllib.urlencode(params))
+ if DEBUG: print url
+ data = self.fetch(url)
+ return data
+
+ return method
+
+ def fetch(self, url):
+ u = urllib.FancyURLopener(None)
+ usock = u.open(url)
+ rawdata = usock.read()
+ if DEBUG: print rawdata
+ usock.close()
+ return xml_parser.fromstring(rawdata)
+
+"""
+ Extend APIClient to work with the ma.gnolia.com API
+ (http://wiki.ma.gnolia.com/Ma.gnolia_API)
+ Adds some error handling as well
+"""
+class MagnoliaError(Exception):
+ def __init__(self, code, message):
+ self.code = code
+ self.message = message
+
+ def __str__(self):
+ return 'Magnolia Error %s: %s' % (self.code, self.message)
+
+
+class MagnoliaClient(APIClient):
+ def __getattr__(self, method):
+ def method(_self=self, _method=method, **params):
+ url = "%s%s?%s&api_key=%s" % (self.base_path, _method, urllib.urlencode(params), self.api_key)
+ if DEBUG: print url
+ data = APIClient.fetch(self, url)
+ return data
+ return method
+
+
+"""
+ Extend APIClient to work with the Flickr API
+ (http://www.flickr.com/services/api/)
+ Adds error handling as well
+"""
+
+class FlickrError(Exception):
+ def __init__(self, code, message):
+ self.code = code
+ self.message = message
+
+ def __str__(self):
+ return 'Flickr Error %s: %s' % (self.code, self.message)
+
+class FlickrClient(APIClient):
+ def __getattr__(self, method):
+ def method(_self=self, _method=method, **params):
+ _method = _method.replace("_", ".")
+ url = "%s?method=%s&%s&api_key=%s" % (self.base_path, _method, urllib.urlencode(params), self.api_key)
+ if DEBUG: print url
+ data = APIClient.fetch(self, url)
+ return data
+ return method
+
+class TumblrClient:
+ def __init__(self, base_path):
+ self.base_path = base_path
+
+ def __getattr__(self, method):
+ def method(_self=self, _method=method, **params):
+ url = "%s" % (self.base_path)
+ if DEBUG: print url
+ data = self.fetch(url)
+ return data
+
+ return method
+
+ def fetch(self, url):
+ u = urllib.FancyURLopener(None)
+ usock = u.open(url)
+ rawdata = usock.read()
+ if DEBUG: print rawdata
+ usock.close()
+ return xml_parser.fromstring(rawdata)