diff oembed/views.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/oembed/views.py@6d6fdc58487c
children 89b240fe9297
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/oembed/views.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,91 @@
+"""
+Views for the oembed application.
+"""
+import re
+import urllib2
+
+from django.http import HttpResponse
+from django.http import HttpResponseBadRequest
+from django.http import HttpResponseForbidden
+import django.utils.simplejson as json
+from django.conf import settings
+
+from oembed.models import Provider
+from oembed.models import Oembed
+from oembed.core import get_oembed
+
+
+def fetch_media(request):
+    """
+    This view returns the HTML media of an embeddable resource as
+    JSON. This view is the target of an AJAX request.
+    """
+    if not request.user.is_authenticated():
+        return HttpResponseForbidden('Please login or register.')
+
+    url = request.POST.get('q')
+
+    if not url:
+        return HttpResponseBadRequest('Please provide a valid URL.')
+
+    # Is this already in our database?
+    try:
+        oembed = Oembed.objects.get(url=url)
+    except Oembed.DoesNotExist:
+        pass
+    else:
+        data = dict(id=oembed.id, embed=oembed.html)
+        return HttpResponse(json.dumps(data), content_type='application/json')
+
+    # It isn't in the database, try to find it from our providers
+    providers = Provider.objects.all()
+    for provider in providers:
+        if re.match(provider.url_regex, url):
+            try:
+                data = get_oembed(provider.api_endpoint,
+                        url,
+                        maxwidth=settings.OEMBED_MAXWIDTH,
+                        maxheight=settings.OEMBED_MAXHEIGHT)
+            except IOError, e:
+                return HttpResponseBadRequest(
+                    "Sorry, we could not retrieve your video (%s)" % e)
+
+            if 'type' not in data or data['type'] != 'video':
+                return HttpResponseBadRequest(
+                    "Hey, this doesn't look like a video..??")
+
+            oembed = Oembed(url=url,
+                    type=Oembed.VIDEO,
+                    title=data.get('title', ''),
+                    width=int(data.get('width', 0)),
+                    height=int(data.get('height', 0)),
+                    html=data.get('html', ''))
+            oembed.save()
+
+            data = dict(id=oembed.id, embed=oembed.html)
+            return HttpResponse(json.dumps(data),
+                    content_type='application/json')
+
+    return HttpResponseBadRequest("Sorry, we couldn't find that video.")
+
+
+def fetch_saved_media(request):
+    """
+    This view returns the HTML embed information for previously saved Oembed
+    objects as JSON. This view is the target of an AJAX request.
+    """
+    if not request.user.is_authenticated():
+        return HttpResponseForbidden('Please login or register.')
+
+    embed_ids = request.GET.getlist('embeds')
+    if not embed_ids:
+        return HttpResponseBadRequest('Missing embed list.')
+
+    embeds = Oembed.objects.in_bulk(embed_ids)
+
+    # build results in order
+    results = []
+    for pk in embeds:
+        results.append(dict(id=pk, html=embeds[pk].html))
+
+    return HttpResponse(json.dumps(results), content_type='application/json')