dc: ready to use
This commit is contained in:
parent
c9e07f3e0c
commit
7981ce5884
2 changed files with 152 additions and 138 deletions
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue