annotate gpp/oembed/core.py @ 552:9e42e6618168
For bitbucket issue #2, tweak the admin settings for the Post model to
reduce slow queries. Define our own queryset() method so we can control the
select_related(), and not have it cascade from post to topics to forums to
categories. Removed 'topic' from list_display because MySQL still sucked with
2 inner joins. Now it seems to be tolerable with only one join to User.
author |
Brian Neal <bgneal@gmail.com> |
date |
Wed, 25 Jan 2012 20:07:03 -0600 |
parents |
6d6fdc58487c |
children |
|
rev |
line source |
bgneal@285
|
1 """
|
bgneal@285
|
2 This module contains core functionality for the oembed application.
|
bgneal@285
|
3 """
|
bgneal@285
|
4 from __future__ import with_statement
|
bgneal@285
|
5 import urllib
|
bgneal@285
|
6 import urllib2
|
bgneal@285
|
7 import gzip
|
bgneal@285
|
8 try:
|
bgneal@285
|
9 from cStringIO import StringIO
|
bgneal@285
|
10 except ImportError:
|
bgneal@285
|
11 from StringIO import StringIO
|
bgneal@285
|
12
|
bgneal@285
|
13 import django.utils.simplejson as json
|
bgneal@285
|
14
|
bgneal@285
|
15
|
bgneal@285
|
16 USER_AGENT = 'gremmies python oembed'
|
bgneal@285
|
17
|
bgneal@285
|
18
|
bgneal@285
|
19 def get_oembed(api_endpoint, url, format='json', **opts):
|
bgneal@285
|
20 """
|
bgneal@285
|
21 Perform the GET request to retrieve the embedded media data from the given
|
bgneal@285
|
22 API endpoint for the given URL. Return the result as a Python dictionary.
|
bgneal@285
|
23
|
bgneal@285
|
24 format specifies the response format, and should be 'json' or 'xml'.
|
bgneal@285
|
25 opts are any additional GET options that should be present in the GET
|
bgneal@285
|
26 request.
|
bgneal@285
|
27
|
bgneal@285
|
28 """
|
bgneal@285
|
29 opts['url'] = url
|
bgneal@285
|
30 opts['format'] = format
|
bgneal@285
|
31 api_url = "%s?%s" % (api_endpoint, urllib.urlencode(opts))
|
bgneal@285
|
32
|
bgneal@285
|
33 headers = {
|
bgneal@361
|
34 'User-Agent': USER_AGENT,
|
bgneal@285
|
35 'Accept-Encoding': 'gzip',
|
bgneal@285
|
36 }
|
bgneal@285
|
37 request = urllib2.Request(api_url, headers=headers)
|
bgneal@285
|
38
|
bgneal@285
|
39 opener = urllib2.build_opener()
|
bgneal@285
|
40 f = opener.open(request)
|
bgneal@285
|
41 headers = f.info()
|
bgneal@285
|
42 result = f.read()
|
bgneal@285
|
43 f.close()
|
bgneal@285
|
44
|
bgneal@285
|
45 if headers.get('content-encoding') == 'gzip':
|
bgneal@361
|
46 f = gzip.GzipFile(fileobj=StringIO(result))
|
bgneal@361
|
47 result = f.read()
|
bgneal@361
|
48 f.close()
|
bgneal@285
|
49
|
bgneal@285
|
50 return json.loads(result)
|
bgneal@285
|
51
|
bgneal@285
|
52 if __name__ == "__main__":
|
bgneal@285
|
53 try:
|
bgneal@285
|
54 print get_oembed("http://www.youtube.com/oembed",
|
bgneal@361
|
55 "http://www.youtube.com/watch?v=7_IMzJldOf4")
|
bgneal@285
|
56 except urllib2.HTTPError, e:
|
bgneal@285
|
57 print e
|