@@ -18,10 +18,7 @@
#
from datetime import datetime
import itertools
import operator
from django.conf import settings
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.syndication.views import Feed, add_domain
from django.shortcuts import render
@@ -53,36 +50,43 @@ class CastFeedBase(Feed):
if hasattr(getattr(item, attr), 'year'):
year = getattr(getattr(item, attr), 'year')
break
return { 'year' : year }
return {'year': year}
def for_podcast_feed_extra_kwargs(self, obj):
return { 'managingEditorNames' : 'Bradley and Karen',
'rssImage' : { 'url' : 'http://faif.us/img/cast/faif_144x144.jpg',
'width' : '144', 'height' : '144' },
'webMaster' : 'oggcast@faif.us (Bradley and Karen)',
'dcCreator' : 'oggcast@faif.us (Bradley and Karen)',
'iTunesExplicit' : 'No',
'iTunesBlock' : 'No',
'iTunesImage' : { 'url' : 'http://faif.us/img/cast/faif_300x300.jpg',
'title' : 'The Corresponding Source (formerly Free as in Freedom)',
'link' : self.author_link,
'type' : 'video/jpg'},
'category' : { 'name' : 'Government & Organizations', 'scheme' : 'http://www.itunes.com/dtds/podcast-1.0.dtd',
'subcats' : [ 'Non-Profit' ] },
'keywords' : 'open source, opensource, freesoftware, software freedom, legal, law, linux, free, license, gpl, lgpl, agpl, bsd',
'iTunesAuthor' : 'Software Freedom Conservancy',
'iTunesSubtitle' : 'Bi-Weekly Discussion of Legal, Policy, and Any other Issues in the Free, Libre, and Open Source Software (FLOSS) Community',
'copyrightHolder' : self.copyright_holder(),
'copyrightLicense' : self.license_no_html() }
return {
'managingEditorNames': 'Bradley and Karen',
'rssImage': {'url': 'http://faif.us/img/cast/faif_144x144.jpg',
'width': '144', 'height': '144'},
'webMaster': 'oggcast@faif.us (Bradley and Karen)',
'dcCreator': 'oggcast@faif.us (Bradley and Karen)',
'iTunesExplicit': 'No',
'iTunesBlock': 'No',
'iTunesImage': {'url': 'http://faif.us/img/cast/faif_300x300.jpg',
'title': 'The Corresponding Source (formerly Free as in Freedom)',
'link': self.author_link,
'type': 'video/jpg'},
'category': {'name': 'Government & Organizations', 'scheme': 'http://www.itunes.com/dtds/podcast-1.0.dtd',
'subcats': ['Non-Profit']},
'keywords': 'open source, opensource, freesoftware, software freedom, legal, law, linux, free, license, gpl, lgpl, agpl, bsd',
'iTunesAuthor': 'Software Freedom Conservancy',
'iTunesSubtitle': 'Bi-Weekly Discussion of Legal, Policy, and Any other Issues in the Free, Libre, and Open Source Software (FLOSS) Community',
'copyrightHolder': self.copyright_holder(),
'copyrightLicense': self.license_no_html(),
}
def for_podcast_item_extra_kwargs(self, item):
return { 'duration' : item.duration,
'year' : item.date_created.year,
'intheitembkuhn' : item.__dict__.__str__()}
'duration': item.duration,
'year': item.date_created.year,
'intheitembkuhn': item.__dict__.__str__(),
def podcast_helper_add_root_elements(self, handler):
handler.addQuickElement('managingEditor', self.feed['author_email']
+ ' (' + self.feed['managingEditorNames'] + ')')
handler.startElement('image', {})
handler.addQuickElement('url', self.feed['rssImage']['url'])
@@ -91,54 +95,55 @@ def podcast_helper_add_root_elements(self, handler):
handler.addQuickElement('width', self.feed['rssImage']['width'])
handler.addQuickElement('height', self.feed['rssImage']['height'])
handler.endElement('image')
handler.addQuickElement('webMaster', self.feed['webMaster'])
# handler.addQuickElement('dc:creator', self.feed['dcCreator'])
handler.addQuickElement('itunes:explicit', self.feed['iTunesExplicit'])
handler.addQuickElement('itunes:block', self.feed['iTunesBlock'])
handler.addQuickElement('generator', 'http://www.faif.us/code')
handler.addQuickElement('media:thumbnail', '' , { 'url' : self.feed['rssImage']['url'] })
handler.addQuickElement('itunes:image', '' , { 'href' : self.feed['iTunesImage']['url']})
# handler.addQuickElement('itunes:link', '', { 'href' : self.feed['iTunesImage']['url'],
# 'type' : self.feed['iTunesImage']['type']})
handler.addQuickElement("media:category", self.feed['category']['name'],
{ 'scheme': self.feed['category']['scheme']})
if not (self.feed['category']['subcats'] and len(self.feed['category']['subcats']) > 0):
handler.addQuickElement("itunes:category", '', { 'text': self.feed['category']['name']})
{'scheme': self.feed['category']['scheme']})
handler.addQuickElement("itunes:category", '', {'text': self.feed['category']['name']})
else:
handler.startElement("itunes:category", { 'text': self.feed['category']['name']})
handler.startElement("itunes:category", {'text': self.feed['category']['name']})
for cc in self.feed['category']['subcats']:
handler.addQuickElement("itunes:category", '', { 'text': cc })
handler.addQuickElement("itunes:category", '', {'text': cc})
handler.endElement("itunes:category")
handler.addQuickElement("media:keywords", self.feed['keywords'].replace(" ", ","))
handler.startElement("itunes:owner", {})
handler.addQuickElement("itunes:email", self.feed['author_email'])
handler.addQuickElement("itunes:name", self.feed['author_name'])
handler.endElement("itunes:owner")
handler.addQuickElement("itunes:summary", self.feed['description'])
handler.addQuickElement("itunes:subtitle", self.feed['iTunesSubtitle'])
handler.addQuickElement("itunes:author", self.feed['iTunesAuthor'])
handler.addQuickElement('atom:link', '', { 'rel' : "self", 'href' : self.feed['feed_url'],
'type' : "application/rss+xml"})
handler.addQuickElement('atom:link', '', {'rel': "self", 'href': self.feed['feed_url'],
'type': "application/rss+xml"})
years = {}
for ii in self.items: years[ii['year']] = 1
copyrightString = ""
ll = years.keys()
sorted(ll)
for yy in ll: copyrightString += "%d, " % yy
copyrightString += "%s. %s" % (self.feed['copyrightHolder'], self.feed['copyrightLicense'])
handler.addQuickElement('copyright', copyrightString)
handler.addQuickElement('media:copyright', "Copyright (C) " + copyrightString)
def podcast_helper_add_item_elements(self, handler, item):
handler.addQuickElement("itunes:explicit", self.feed['iTunesExplicit'])
handler.addQuickElement("itunes:block", self.feed['iTunesBlock'])
@@ -147,9 +152,9 @@ def podcast_helper_add_item_elements(self, handler, item):
handler.addQuickElement("itunes:author", item['author_name'])
handler.addQuickElement("itunes:duration", item['duration'])
if 'enclosure' in item:
handler.addQuickElement('media:content', '', { 'url' : item['enclosure'].url,
'fileSize' : item['enclosure'].length,
'type' : item['enclosure'].mime_type})
handler.addQuickElement('media:content', '', {'url': item['enclosure'].url,
'fileSize': item['enclosure'].length,
'type': item['enclosure'].mime_type})
# http://www.feedforall.com/itune-tutorial-tags.htm
# http://www.feedforall.com/mediarss.htm
@@ -210,7 +215,7 @@ class CastFeed(CastFeedBase):
return "http://faif.us"
def item_categories(self, item):
return ('Technology',)
def copyright_holder(self): return "Software Freedom Conservancy"
@@ -222,7 +227,7 @@ class CastFeed(CastFeedBase):
def item_extra_kwargs(self, item):
return for_podcast_item_extra_kwargs(self, item)
# FIXME:
# GUEST NAME GOES HERE!!!
#<itunes:author>
# If applicable, at the item level, this tag can contain information
@@ -236,6 +241,7 @@ class Mp3CastFeed(CastFeed):
def item_enclosure_length(self, item):
return item.mp3_length
class OggCastFeed(CastFeed):
def item_enclosure_mime_type(self): return "audio/ogg"
def item_enclosure_url(self, item):
@@ -243,6 +249,7 @@ class OggCastFeed(CastFeed):
return item.ogg_length
feed_dict = {
'cast-ogg': OggCastFeed,
'cast-mp3': Mp3CastFeed,
@@ -252,6 +259,7 @@ feed_dict = {
for k, v in feed_dict.items():
v.get_absolute_url = '/feeds/%s/' % k
def view(request):
"""Listing of all available feeds
"""