diff --git a/conservancy/podjango/feeds.py b/conservancy/podjango/feeds.py index 7c4b84e463bb880844a53c022ad7bcd354bb258d..601434fe572fc05f3d157eb4e2ae42e3cb5bbd0a 100644 --- a/conservancy/podjango/feeds.py +++ b/conservancy/podjango/feeds.py @@ -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, - 'dcCreator' : 'oggcast@faif.us (Bradley and Karen)', - 'intheitembkuhn' : item.__dict__.__str__()} + return { + 'duration': item.duration, + 'year': item.date_created.year, + 'dcCreator': 'oggcast@faif.us (Bradley and Karen)', + 'intheitembkuhn': item.__dict__.__str__(), + } + def podcast_helper_add_root_elements(self, handler): - handler.addQuickElement('managingEditor', self.feed['author_email'] + 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']}) + if not (self.feed['category']['subcats'] and len(self.feed['category']['subcats']) > 0): + 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',) + 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: +# FIXME: # GUEST NAME GOES HERE!!! # # 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): def item_enclosure_length(self, item): 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 """