Enable Multiple media:thumbnail Elements

As with media:content, there can be multiple media:thumbnail elements in
an item and in multiple groups. This patch adds the ability to do this
in the same manner as with the content.

Part of #58
This commit is contained in:
Lars Kiesow 2017-05-21 23:46:36 +02:00
parent 4970dab6d7
commit 4a0a2663e9
No known key found for this signature in database
GPG key ID: 5DAFE8D9C823CE73
2 changed files with 83 additions and 26 deletions

View file

@ -31,7 +31,7 @@ class MediaEntryExtension(BaseEntryExtension):
def __init__(self):
self.__media_content = []
self.__media_thumbnail = None
self.__media_thumbnail = []
def extend_atom(self, entry):
'''Add additional fields to an RSS item.
@ -54,16 +54,17 @@ class MediaEntryExtension(BaseEntryExtension):
if media_content.get(attr):
content.set(attr, media_content[attr])
if self.__media_thumbnail:
for media_thumbnail in self.__media_thumbnail:
# Define current media:group
group = groups.get(media_thumbnail.get('group'))
if group is None:
group = etree.SubElement(entry, '{%s}group' % MEDIA_NS)
groups[media_thumbnail.get('group')] = group
# Add thumbnails
thumbnail = etree.SubElement(group, '{%s}thumbnail' % MEDIA_NS)
if self.__media_thumbnail.get('url'):
thumbnail.set('url', self.__media_thumbnail.get('url'))
if self.__media_thumbnail.get('height'):
thumbnail.set('height', self.__media_thumbnail.get('height'))
if self.__media_thumbnail.get('width'):
thumbnail.set('width', self.__media_thumbnail.get('width'))
if self.__media_thumbnail.get('lang'):
thumbnail.set('lang', self.__media_thumbnail.get('lang'))
for attr in ('url', 'height', 'width', 'time'):
if media_thumbnail.get(attr):
thumbnail.set(attr, media_thumbnail[attr])
return entry
@ -134,28 +135,50 @@ class MediaEntryExtension(BaseEntryExtension):
set(['url', 'group']))
return self.__media_content
def thumbnail(self, url=None, height=None, width=None, time=None):
'''Allows particular images to be used as representative images for
def thumbnail(self, thumbnail=None, replace=False, group='default',
**kwargs):
'''Get or set media:thumbnail data.
This method can be called with:
- the fields of a media:content as keyword arguments
- the fields of a media:content as a dictionary
- a list of dictionaries containing the media:content fields
Allows particular images to be used as representative images for
the media object. If multiple thumbnails are included, and time
coding is not at play, it is assumed that the images are in order
of importance. It has one required attribute and three optional
attributes.
:param url: should specify the direct URL to the media object.
:param height: height of the media object.
:param width: width of the media object.
:param time: specifies the time offset in relation to the media object.
media:thumbnail has the following fields:
- *url* should specify the direct URL to the media object.
- *height* height of the media object.
- *width* width of the media object.
- *time* specifies the time offset in relation to the media object.
:param thumbnail: Dictionary or list of dictionaries with thumbnail
data.
:param replace: Add or replace old data.
:param group: Media group to put this content in.
:returns: The media thumbnail tag.
'''
if url is not None:
self.__media_thumbnail = {'url': url}
if height is not None:
self.__media_thumbnail['height'] = height
if width is not None:
self.__media_thumbnail['width'] = width
if time is not None:
self.__media_thumbnail['time'] = time
# Handle kwargs
if thumbnail is None and kwargs:
thumbnail = kwargs
# Handle new data
if thumbnail is not None:
# Reset data if we want to replace them
if replace or self.__media_thumbnail is None:
self.__media_thumbnail = []
# Ensure list
if not isinstance(thumbnail, list):
thumbnail = [thumbnail]
# Define media group
for t in thumbnail:
t['group'] = t.get('group', group)
self.__media_thumbnail += ensure_format(
thumbnail,
set(['url', 'height', 'width', 'time', 'group']),
set(['url', 'group']))
return self.__media_thumbnail

View file

@ -238,3 +238,37 @@ class TestExtensionMedia(unittest.TestCase):
fe.media.content(content=[], replace=True)
assert fe.media.content() == []
def test_media_thumbnail(self):
fe = self.fg.add_item()
fe.id('id')
fe.title('title')
fe.content('content')
fe.media.thumbnail(url='file1.xy')
fe.media.thumbnail(url='file2.xy')
fe.media.thumbnail(url='file1.xy', group=2)
fe.media.thumbnail(url='file2.xy', group=2)
fe.media.thumbnail(url='file.xy', group=None)
ns = {'media': 'http://search.yahoo.com/mrss/',
'a': 'http://www.w3.org/2005/Atom'}
# Check that we have the item in the resulting RSS
root = etree.fromstring(self.fg.rss_str())
url = root.xpath(
'/rss/channel/item/media:group/media:thumbnail[1]/@url',
namespaces=ns)
assert url == ['file1.xy', 'file1.xy']
# There is one without a group
url = root.xpath('/rss/channel/item/media:thumbnail[1]/@url',
namespaces=ns)
assert url == ['file.xy']
# Check that we have the item in the resulting Atom feed
root = etree.fromstring(self.fg.atom_str())
url = root.xpath('/a:feed/a:entry/media:group/media:thumbnail[1]/@url',
namespaces=ns)
assert url == ['file1.xy', 'file1.xy']
fe.media.thumbnail(thumbnail=[], replace=True)
assert fe.media.thumbnail() == []