dc: ready to use

This commit is contained in:
Lars Kiesow 2013-05-29 20:40:43 +02:00
parent c9e07f3e0c
commit 7981ce5884
2 changed files with 152 additions and 138 deletions

View file

@ -76,9 +76,21 @@ if __name__ == '__main__':
'consectetur adipiscing elit. ' + \ 'consectetur adipiscing elit. ' + \
'Verba tu fingas et ea dicas, quae non sentias?') 'Verba tu fingas et ea dicas, quae non sentias?')
fe.podcast.itunes_author('Lars Kiesow') fe.podcast.itunes_author('Lars Kiesow')
print fg.rss_str(pretty=True) print fg.rss_str(pretty=True)
elif arg == 'dc.atom':
fg.load_extension('dc')
fg.dc.dc_contributor('Lars Kiesow')
fe.dc.dc_contributor('Lars Kiesow')
print fg.atom_str(pretty=True)
elif arg == 'dc.rss':
fg.load_extension('dc')
fg.dc.dc_contributor('Lars Kiesow')
print fg.rss_str(pretty=True)
elif arg.endswith('atom'): elif arg.endswith('atom'):
fg.atom_file(arg) fg.atom_file(arg)
elif arg.endswith('rss'): elif arg.endswith('rss'):
fg.rss_file(arg) fg.rss_file(arg)

View file

@ -3,7 +3,7 @@
feedgen.ext.podcast feedgen.ext.podcast
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Extends the FeedGenerator to produce podcasts. Extends the FeedGenerator to add Dubline Core Elements to the feeds.
Descriptions partly taken from Descriptions partly taken from
http://dublincore.org/documents/dcmi-terms/#elements-coverage http://dublincore.org/documents/dcmi-terms/#elements-coverage
@ -14,11 +14,11 @@
''' '''
from lxml import etree from lxml import etree
from feedgen.ext.base import BaseExtension from feedgen.ext.base import BaseExtension, BaseEntryExtension
class PodcastExtension(BaseExtension): class DcBaseExtension(BaseExtension):
'''FeedGenerator extension for podcasts. '''Dublin Core Elements extension for podcasts.
''' '''
@ -26,21 +26,55 @@ class PodcastExtension(BaseExtension):
# http://dublincore.org/documents/usageguide/elements.shtml # http://dublincore.org/documents/usageguide/elements.shtml
# http://dublincore.org/documents/dces/ # http://dublincore.org/documents/dces/
# http://dublincore.org/documents/dcmi-terms/ # http://dublincore.org/documents/dcmi-terms/
self.__dcelem_contributor = None self._dcelem_contributor = None
self.__dcelem_coverage = None self._dcelem_coverage = None
self.__dcelem_creator = None self._dcelem_creator = None
self.__dcelem_date = None self._dcelem_date = None
self.__dcelem_description = None self._dcelem_description = None
self.__dcelem_format = None self._dcelem_format = None
self.__dcelem_identifier = None self._dcelem_identifier = None
self.__dcelem_language = None self._dcelem_language = None
self.__dcelem_publisher = None self._dcelem_publisher = None
self.__dcelem_relation = None self._dcelem_relation = None
self.__dcelem_rights = None self._dcelem_rights = None
self.__dcelem_source = None self._dcelem_source = None
self.__dcelem_subject = None self._dcelem_subject = None
self.__dcelem_title = None self._dcelem_title = None
self.__dcelem_type = None self._dcelem_type = None
def extend_atom(self, atom_feed):
'''Create an Atom feed xml structure containing all previously set fields.
:returns: Tuple containing the feed root element
'''
DCELEMENTS_NS = 'http://purl.org/dc/elements/1.1/'
# Replace the root element to add the new namespace
nsmap = atom_feed.nsmap
nsmap['dc'] = DCELEMENTS_NS
feed = etree.Element('feed', nsmap=nsmap)
if '{http://www.w3.org/XML/1998/namespace}lang' in atom_feed.attrib:
feed.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = \
atom_feed.attrib['{http://www.w3.org/XML/1998/namespace}lang']
feed[:] = atom_feed[:]
for elem in ['contributor', 'coverage', 'creator', 'date', 'description',
'language', 'publisher', 'relation', 'rights', 'source', 'subject',
'title', 'type']:
if hasattr(self, '_dcelem_%s' % elem):
for val in getattr(self, '_dcelem_%s' % elem) or []:
node = etree.SubElement(feed, '{%s}%s' % (DCELEMENTS_NS,elem))
node.text = val
if self._dcelem_format:
node = etree.SubElement(feed, '{%s}format' % DCELEMENTS_NS)
node.text = format
if self._dcelem_identifier:
node = etree.SubElement(feed, '{%s}identifier' % DCELEMENTS_NS)
node.text = identifier
return feed
def extend_rss(self, rss_feed): def extend_rss(self, rss_feed):
@ -56,72 +90,22 @@ class PodcastExtension(BaseExtension):
feed[:] = rss_feed[:] feed[:] = rss_feed[:]
channel = feed[0] channel = feed[0]
for elem in ('contributor'): for elem in ['contributor', 'coverage', 'creator', 'date', 'description',
if hasattr(self, '__dcelem_%s' % elem): 'language', 'publisher', 'relation', 'rights', 'source', 'subject',
for val in getattr(self, '__dcelem_%s' % elem) or []: 'title', 'type']:
if hasattr(self, '_dcelem_%s' % elem):
for val in getattr(self, '_dcelem_%s' % elem) or []:
node = etree.SubElement(channel, '{%s}%s' % (DCELEMENTS_NS,elem)) node = etree.SubElement(channel, '{%s}%s' % (DCELEMENTS_NS,elem))
node.text = val node.text = val
for contributor in self.__dcelem_contributor or []: if self._dcelem_format:
node = etree.SubElement(channel, '{%s}contributor' % DCELEMENTS_NS)
node.text = contributor
for coverage in self.__dcelem_coverage or []:
node = etree.SubElement(channel, '{%s}coverage' % DCELEMENTS_NS)
node.text = coverage
for creator in self.__dcelem_creator or []:
node = etree.SubElement(channel, '{%s}creator' % DCELEMENTS_NS)
node.text = creator
for date in self.__dcelem_date or []:
node = etree.SubElement(channel, '{%s}date' % DCELEMENTS_NS)
node.text = date
for description in self.__dcelem_description or []:
node = etree.SubElement(channel, '{%s}description' % DCELEMENTS_NS)
node.text = description
if self.__dcelem_format:
node = etree.SubElement(channel, '{%s}format' % DCELEMENTS_NS) node = etree.SubElement(channel, '{%s}format' % DCELEMENTS_NS)
node.text = format node.text = format
if self.__dcelem_identifier: if self._dcelem_identifier:
node = etree.SubElement(channel, '{%s}identifier' % DCELEMENTS_NS) node = etree.SubElement(channel, '{%s}identifier' % DCELEMENTS_NS)
node.text = identifier node.text = identifier
for language in self.__dcelem_language or []:
node = etree.SubElement(channel, '{%s}language' % DCELEMENTS_NS)
node.text = language
for publisher in self.__dcelem_publisher or []:
node = etree.SubElement(channel, '{%s}publisher' % DCELEMENTS_NS)
node.text = publisher
for relation in self.__dcelem_relation or []:
node = etree.SubElement(channel, '{%s}relation' % DCELEMENTS_NS)
node.text = relation
for rights in self.__dcelem_rights or []:
node = etree.SubElement(channel, '{%s}rights' % DCELEMENTS_NS)
node.text = rights
for source in self.__dcelem_source or []:
node = etree.SubElement(channel, '{%s}source' % DCELEMENTS_NS)
node.text = source
for subject in self.__dcelem_subject or []:
node = etree.SubElement(channel, '{%s}subject' % DCELEMENTS_NS)
node.text = subject
for title in self.__dcelem_title or []:
node = etree.SubElement(channel, '{%s}title' % DCELEMENTS_NS)
node.text = title
for type in self.__dcelem_type or []:
node = etree.SubElement(channel, '{%s}type' % DCELEMENTS_NS)
node.text = type
return feed return feed
@ -139,10 +123,10 @@ class PodcastExtension(BaseExtension):
if not contributor is None: if not contributor is None:
if not isinstance(contributor, list): if not isinstance(contributor, list):
contributor = [contributor] contributor = [contributor]
if replace or not self.__dcelem_contributor: if replace or not self._dcelem_contributor:
self.__dcelem_contributor = [] self._dcelem_contributor = []
self.__dcelem_contributor += contributor self._dcelem_contributor += contributor
return self.__dcelem_contributor return self._dcelem_contributor
def dc_coverage(self, coverage=None, replace=True): def dc_coverage(self, coverage=None, replace=True):
@ -168,10 +152,10 @@ class PodcastExtension(BaseExtension):
if not coverage is None: if not coverage is None:
if not isinstance(coverage, list): if not isinstance(coverage, list):
coverage = [coverage] coverage = [coverage]
if replace or not self.__dcelem_coverage: if replace or not self._dcelem_coverage:
self.__dcelem_coverage = [] self._dcelem_coverage = []
self.__dcelem_coverage = coverage self._dcelem_coverage = coverage
return self.__dcelem_coverage return self._dcelem_coverage
def dc_creator(self, creator=None, replace=False): def dc_creator(self, creator=None, replace=False):
@ -188,10 +172,10 @@ class PodcastExtension(BaseExtension):
if not creator is None: if not creator is None:
if not isinstance(creator, list): if not isinstance(creator, list):
creator = [creator] creator = [creator]
if replace or not self.__dcelem_creator: if replace or not self._dcelem_creator:
self.__dcelem_creator = [] self._dcelem_creator = []
self.__dcelem_creator += creator self._dcelem_creator += creator
return self.__dcelem_creator return self._dcelem_creator
def dc_date(self, date=None, replace=True): def dc_date(self, date=None, replace=True):
@ -208,10 +192,10 @@ class PodcastExtension(BaseExtension):
if not date is None: if not date is None:
if not isinstance(date, list): if not isinstance(date, list):
date = [date] date = [date]
if replace or not self.__dcelem_date: if replace or not self._dcelem_date:
self.__dcelem_date = [] self._dcelem_date = []
self.__dcelem_date += date self._dcelem_date += date
return self.__dcelem_date return self._dcelem_date
def dc_description(self, description=None, replace=True): def dc_description(self, description=None, replace=True):
@ -227,28 +211,33 @@ class PodcastExtension(BaseExtension):
if not description is None: if not description is None:
if not isinstance(description, list): if not isinstance(description, list):
description = [description] description = [description]
if replace or not self.__dcelem_description: if replace or not self._dcelem_description:
self.__dcelem_description = [] self._dcelem_description = []
self.__dcelem_description += description self._dcelem_description += description
return self.__dcelem_description return self._dcelem_description
def dc_format(self, format=None): def dc_format(self, format=None, replace=True):
'''Get or set the dc:format which describes the file format, physical '''Get or set the dc:format which describes the file format, physical
medium, or dimensions of the resource. medium, or dimensions of the resource.
For more information see: For more information see:
http://dublincore.org/documents/dcmi-terms/#elements-format http://dublincore.org/documents/dcmi-terms/#elements-format
:param format: Format of the resource. :param format: Format of the resource or list of formats.
:param replace: Replace alredy set format (deault: True).
:returns: Format of the resource. :returns: Format of the resource.
''' '''
if not format is None: if not format is None:
self.__dcelem_format = format if not isinstance(format, list):
return self.__dcelem_format format = [format]
if replace or not self._dcelem_format:
self._dcelem_format = []
self._dcelem_format += format
return self._dcelem_format
def dc_identifier(self, identifier=None): def dc_identifier(self, identifier=None, replace=True):
'''Get or set the dc:identifier which should be an unambiguous reference '''Get or set the dc:identifier which should be an unambiguous reference
to the resource within a given context. to the resource within a given context.
@ -258,12 +247,16 @@ class PodcastExtension(BaseExtension):
For more inidentifierion see: For more inidentifierion see:
http://dublincore.org/documents/dcmi-terms/#elements-identifier http://dublincore.org/documents/dcmi-terms/#elements-identifier
:param identifier: Identifier of the resource. :param identifier: Identifier of the resource or list of identifiers.
:returns: Identifier of the resource. :param replace: Replace alredy set format (deault: True).
:returns: Identifiers of the resource.
''' '''
if not identifier is None: if not identifier is None:
self.__dcelem_identifier = identifier if not isinstance(identifier, list):
return self.__dcelem_identifier identifier = [identifier]
if replace or not self._dcelem_identifier:
self._dcelem_identifier = []
self._dcelem_identifier += identifier
def dc_language(self, language=None, replace=True): def dc_language(self, language=None, replace=True):
@ -279,10 +272,10 @@ class PodcastExtension(BaseExtension):
if not language is None: if not language is None:
if not isinstance(language, list): if not isinstance(language, list):
language = [language] language = [language]
if replace or not self.__dcelem_language: if replace or not self._dcelem_language:
self.__dcelem_language = [] self._dcelem_language = []
self.__dcelem_language += language self._dcelem_language += language
return self.__dcelem_language return self._dcelem_language
def dc_publisher(self, publisher=None, replace=False): def dc_publisher(self, publisher=None, replace=False):
@ -299,10 +292,10 @@ class PodcastExtension(BaseExtension):
if not publisher is None: if not publisher is None:
if not isinstance(publisher, list): if not isinstance(publisher, list):
publisher = [publisher] publisher = [publisher]
if replace or not self.__dcelem_publisher: if replace or not self._dcelem_publisher:
self.__dcelem_publisher = [] self._dcelem_publisher = []
self.__dcelem_publisher += publisher self._dcelem_publisher += publisher
return self.__dcelem_publisher return self._dcelem_publisher
def dc_relation(self, relation=None, replace=False): def dc_relation(self, relation=None, replace=False):
@ -318,10 +311,10 @@ class PodcastExtension(BaseExtension):
if not relation is None: if not relation is None:
if not isinstance(relation, list): if not isinstance(relation, list):
relation = [relation] relation = [relation]
if replace or not self.__dcelem_relation: if replace or not self._dcelem_relation:
self.__dcelem_relation = [] self._dcelem_relation = []
self.__dcelem_relation += relation self._dcelem_relation += relation
return self.__dcelem_relation return self._dcelem_relation
def dc_rights(self, rights=None, replace=False): def dc_rights(self, rights=None, replace=False):
@ -338,10 +331,10 @@ class PodcastExtension(BaseExtension):
if not rights is None: if not rights is None:
if not isinstance(rights, list): if not isinstance(rights, list):
rights = [rights] rights = [rights]
if replace or not self.__dcelem_rights: if replace or not self._dcelem_rights:
self.__dcelem_rights = [] self._dcelem_rights = []
self.__dcelem_rights += rights self._dcelem_rights += rights
return self.__dcelem_rights return self._dcelem_rights
def dc_source(self, source=None, replace=False): def dc_source(self, source=None, replace=False):
@ -363,10 +356,10 @@ class PodcastExtension(BaseExtension):
if not source is None: if not source is None:
if not isinstance(source, list): if not isinstance(source, list):
source = [source] source = [source]
if replace or not self.__dcelem_source: if replace or not self._dcelem_source:
self.__dcelem_source = [] self._dcelem_source = []
self.__dcelem_source += source self._dcelem_source += source
return self.__dcelem_source return self._dcelem_source
def dc_subject(self, subject=None, replace=False): def dc_subject(self, subject=None, replace=False):
@ -382,10 +375,10 @@ class PodcastExtension(BaseExtension):
if not subject is None: if not subject is None:
if not isinstance(subject, list): if not isinstance(subject, list):
subject = [subject] subject = [subject]
if replace or not self.__dcelem_subject: if replace or not self._dcelem_subject:
self.__dcelem_subject = [] self._dcelem_subject = []
self.__dcelem_subject += subject self._dcelem_subject += subject
return self.__dcelem_subject return self._dcelem_subject
def dc_title(self, title=None, replace=True): def dc_title(self, title=None, replace=True):
@ -401,10 +394,10 @@ class PodcastExtension(BaseExtension):
if not title is None: if not title is None:
if not isinstance(title, list): if not isinstance(title, list):
title = [title] title = [title]
if replace or not self.__dcelem_title: if replace or not self._dcelem_title:
self.__dcelem_title = [] self._dcelem_title = []
self.__dcelem_title += title self._dcelem_title += title
return self.__dcelem_title return self._dcelem_title
def dc_type(self, type=None, replace=False): def dc_type(self, type=None, replace=False):
@ -421,7 +414,16 @@ class PodcastExtension(BaseExtension):
if not type is None: if not type is None:
if not isinstance(type, list): if not isinstance(type, list):
type = [type] type = [type]
if replace or not self.__dcelem_type: if replace or not self._dcelem_type:
self.__dcelem_type = [] self._dcelem_type = []
self.__dcelem_type += type self._dcelem_type += type
return self.__dcelem_type return self._dcelem_type
class DcExtension(DcBaseExtension):
'''Dublin Core Elements extension for podcasts.
'''
class DcEntryExtension(DcBaseExtension):
'''Dublin Core Elements extension for podcasts.
'''