bgneal@285: """
bgneal@285: Views for the oembed application.
bgneal@679: 
bgneal@285: """
bgneal@679: import json
bgneal@285: import re
bgneal@285: 
bgneal@285: from django.http import HttpResponse
bgneal@285: from django.http import HttpResponseBadRequest
bgneal@285: from django.http import HttpResponseForbidden
bgneal@361: from django.conf import settings
bgneal@285: 
bgneal@285: from oembed.models import Provider
bgneal@285: from oembed.models import Oembed
bgneal@285: from oembed.core import get_oembed
bgneal@285: 
bgneal@285: 
bgneal@285: def fetch_media(request):
bgneal@285:     """
bgneal@286:     This view returns the HTML media of an embeddable resource as
bgneal@286:     JSON. This view is the target of an AJAX request.
bgneal@285:     """
bgneal@285:     if not request.user.is_authenticated():
bgneal@285:         return HttpResponseForbidden('Please login or register.')
bgneal@285: 
bgneal@285:     url = request.POST.get('q')
bgneal@285: 
bgneal@285:     if not url:
bgneal@285:         return HttpResponseBadRequest('Please provide a valid URL.')
bgneal@285: 
bgneal@285:     # Is this already in our database?
bgneal@285:     try:
bgneal@285:         oembed = Oembed.objects.get(url=url)
bgneal@285:     except Oembed.DoesNotExist:
bgneal@285:         pass
bgneal@285:     else:
bgneal@285:         data = dict(id=oembed.id, embed=oembed.html)
bgneal@285:         return HttpResponse(json.dumps(data), content_type='application/json')
bgneal@285: 
bgneal@285:     # It isn't in the database, try to find it from our providers
bgneal@285:     providers = Provider.objects.all()
bgneal@285:     for provider in providers:
bgneal@285:         if re.match(provider.url_regex, url):
bgneal@285:             try:
bgneal@361:                 data = get_oembed(provider.api_endpoint,
bgneal@907:                                   url,
bgneal@907:                                   maxwidth=settings.OEMBED_MAXWIDTH,
bgneal@907:                                   maxheight=settings.OEMBED_MAXHEIGHT,
bgneal@907:                                   scheme='https')
bgneal@285:             except IOError, e:
bgneal@285:                 return HttpResponseBadRequest(
bgneal@285:                     "Sorry, we could not retrieve your video (%s)" % e)
bgneal@285: 
bgneal@907:             if data.get('type') != 'video':
bgneal@285:                 return HttpResponseBadRequest(
bgneal@285:                     "Hey, this doesn't look like a video..??")
bgneal@285: 
bgneal@285:             oembed = Oembed(url=url,
bgneal@907:                             type=Oembed.VIDEO,
bgneal@907:                             title=data.get('title', ''),
bgneal@907:                             width=int(data.get('width', 0)),
bgneal@907:                             height=int(data.get('height', 0)),
bgneal@907:                             html=data.get('html', ''))
bgneal@285:             oembed.save()
bgneal@285: 
bgneal@285:             data = dict(id=oembed.id, embed=oembed.html)
bgneal@285:             return HttpResponse(json.dumps(data),
bgneal@285:                     content_type='application/json')
bgneal@285: 
bgneal@287:     return HttpResponseBadRequest("Sorry, we couldn't find that video.")
bgneal@286: 
bgneal@286: 
bgneal@286: def fetch_saved_media(request):
bgneal@286:     """
bgneal@286:     This view returns the HTML embed information for previously saved Oembed
bgneal@286:     objects as JSON. This view is the target of an AJAX request.
bgneal@286:     """
bgneal@286:     if not request.user.is_authenticated():
bgneal@286:         return HttpResponseForbidden('Please login or register.')
bgneal@286: 
bgneal@286:     embed_ids = request.GET.getlist('embeds')
bgneal@286:     if not embed_ids:
bgneal@286:         return HttpResponseBadRequest('Missing embed list.')
bgneal@286: 
bgneal@286:     embeds = Oembed.objects.in_bulk(embed_ids)
bgneal@286: 
bgneal@286:     # build results in order
bgneal@286:     results = []
bgneal@286:     for pk in embeds:
bgneal@286:         results.append(dict(id=pk, html=embeds[pk].html))
bgneal@286: 
bgneal@286:     return HttpResponse(json.dumps(results), content_type='application/json')