Skip to content
This repository has been archived by the owner on Oct 30, 2018. It is now read-only.

Commit

Permalink
Merge pull request #505 from peterbe/various-itunes-fixes-for-enclosure
Browse files Browse the repository at this point in the history
various itunes fixes for enclosure
  • Loading branch information
Peter Bengtsson committed Sep 30, 2015
2 parents 3f1dd6e + fb5d7b8 commit 286a30e
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 20 deletions.
21 changes: 19 additions & 2 deletions airmozilla/main/tests/views/test_feeds.py
@@ -1,5 +1,6 @@
import datetime

import mock
from nose.tools import eq_, ok_

from django.conf import settings
Expand All @@ -15,6 +16,7 @@
Template,
Tag,
)
from airmozilla.base.tests.testbase import Response
from airmozilla.base.tests.testbase import DjangoTestCase


Expand Down Expand Up @@ -296,7 +298,22 @@ def test_itunes_feed(self):
ok_('<itunes:name>' in response.content)
ok_('<itunes:image href="http' in response.content)

def test_itunes_feed_item(self):
@mock.patch('requests.head')
def test_itunes_feed_item(self, rhead):

def mocked_head(url):
if url == 'http://cdn.vidly/file.mp4':
return Response('', 302, headers={
'Content-Type': 'video/mp5',
'Content-Length': '1234567',
})
else:
return Response('', 302, headers={
'Location': 'http://cdn.vidly/file.mp4',
})

rhead.side_effect = mocked_head

event = Event.objects.get(title='Test event')
event.archive_time = timezone.now()
event.template_environment = {'tag': 'abc123'}
Expand Down Expand Up @@ -324,4 +341,4 @@ def test_itunes_feed_item(self):
event.description.replace('<', '&lt;').replace('>', '&gt;') in xml_
)
ok_('<itunes:duration>01:01:01</itunes:duration>' in xml_)
ok_('<itunes:keywords>Tag1, Tag2</itunes:keywords>' in xml_)
ok_('<itunes:keywords>Tag1,Tag2</itunes:keywords>' in xml_)
67 changes: 49 additions & 18 deletions airmozilla/main/views/feeds.py
@@ -1,10 +1,13 @@
from collections import defaultdict

import requests

from django.conf import settings
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Rss201rev2Feed
from django.shortcuts import get_object_or_404
from django.utils import timezone
from django.core.cache import cache

from funfactory.urlresolvers import reverse

Expand Down Expand Up @@ -130,35 +133,59 @@ def add_root_elements(self, handler):
'text': 'Technology'
})

handler.addQuickElement('description', self.feed['description'])
handler.addQuickElement('itunes:summary', self.feed['description'])
handler.addQuickElement('itunes:explicit', 'clean')

def add_item_elements(self, handler, item):
"""extra elements to the <item> tag"""
super(ITunesElements, self).add_item_elements(handler, item)

# A slug can change, an ID can't
handler.addQuickElement('guid', str(item['id']), attrs={
'isPermaLink': 'false'}
)

handler.addQuickElement('itunes:author', 'Air Mozilla')
handler.addQuickElement('itunes:subtitle', item['subtitle'])

handler.addQuickElement('itunes:summary', item['summary'])

vidly_url = (
'https://vid.ly/%s?content=video&format=hd_mp4' % item['vidly_tag']
)
data = self.get_video_redirect_info(vidly_url)
handler.addQuickElement('enclosure', attrs={
'url': data['url'],
'length': data['length'],
'type': data['type'],
})
handler.addQuickElement('guid', vidly_url, attrs={
'isPermaLink': 'false'}
)

handler.addQuickElement(
'itunes:duration',
format_duration(item['duration'])
)
if item['tags']:
handler.addQuickElement(
'itunes:keywords',
', '.join(item['tags'])
','.join(item['tags'])
)
handler.addQuickElement('itunes:explicit', 'clean')

def get_video_redirect_info(self, vidly_url):
cache_key = 'vidly-redirect-info%s' % vidly_url
data = cache.get(cache_key)
if data is None:
data = self._get_video_redirect_info(vidly_url)
cache.set(cache_key, data, 60 * 60)
return data

def _get_video_redirect_info(self, vidly_url):
r = requests.head(vidly_url)
assert r.status_code == 302, (r.status_code, vidly_url)
r2 = requests.head(r.headers['Location'])
return {
'url': r.headers['Location'].split('?t=')[0],
'length': r2.headers['Content-Length'],
'type': r2.headers['Content-Type'],
}

def namespace_attributes(self):
return {'xmlns:itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'}

Expand All @@ -185,7 +212,7 @@ def title(self):
if self._root_url != 'https://air.mozilla.org':
# This extra title makes it easier for us to test the
# feed on stage and dev etc.
title += ' (testing on: {})'.format(self._root_url)
title += ' ({})'.format(self._root_url)
return title

def get_object(self, request):
Expand Down Expand Up @@ -250,15 +277,18 @@ def item_link(self, event):
def item_description(self, event):
return event.description

def item_enclosure_url(self, event):
tag = event.template_environment['tag']
return 'https://vid.ly/%s?content=video&format=hd_mp4' % tag

def item_enclosure_mime_type(self, event):
return 'video/mp4'

def item_enclosure_length(self, event):
return event.duration
# def item_enclosure_url(self, event):
# print 'item_enclosure_url()'
# tag = event.template_environment['tag']
# return 'https://vid.ly/%s?content=video&format=hd_mp4' % tag
#
# def item_enclosure_mime_type(self, event):
# return 'video/mp4'
#
# def item_enclosure_length(self, event):
# print 'item_enclosure_length()'
# # XXX this needs to be the FILE SIZE
# return event.duration

def item_author_name(self, event): # override the super
return None
Expand All @@ -269,5 +299,6 @@ def item_extra_kwargs(self, event):
'subtitle': short_desc(event),
'summary': event.description,
'duration': event.duration,
'vidly_tag': event.template_environment['tag'],
'tags': self.all_tags.get(event.id, []),
}

0 comments on commit 286a30e

Please sign in to comment.