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

various itunes fixes for enclosure #505

Merged
merged 1 commit into from Sep 30, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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, []),
}