/gdata/media/__init__.py
http://radioappz.googlecode.com/ · Python · 355 lines · 287 code · 27 blank · 41 comment · 8 complexity · cd781717889cae7e1a6e37c33c246d25 MD5 · raw file
- # -*-*- encoding: utf-8 -*-*-
- #
- # This is gdata.photos.media, implementing parts of the MediaRSS spec in gdata structures
- #
- # $Id: __init__.py 81 2007-10-03 14:41:42Z havard.gulldahl $
- #
- # Copyright 2007 H?vard Gulldahl
- # Portions copyright 2007 Google Inc.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Essential attributes of photos in Google Photos/Picasa Web Albums are
- expressed using elements from the `media' namespace, defined in the
- MediaRSS specification[1].
- Due to copyright issues, the elements herein are documented sparingly, please
- consult with the Google Photos API Reference Guide[2], alternatively the
- official MediaRSS specification[1] for details.
- (If there is a version conflict between the two sources, stick to the
- Google Photos API).
- [1]: http://search.yahoo.com/mrss (version 1.1.1)
- [2]: http://code.google.com/apis/picasaweb/reference.html#media_reference
- Keep in mind that Google Photos only uses a subset of the MediaRSS elements
- (and some of the attributes are trimmed down, too):
- media:content
- media:credit
- media:description
- media:group
- media:keywords
- media:thumbnail
- media:title
- """
- __author__ = u'havard@gulldahl.no'# (H?vard Gulldahl)' #BUG: api chokes on non-ascii chars in __author__
- __license__ = 'Apache License v2'
- import atom
- import gdata
- MEDIA_NAMESPACE = 'http://search.yahoo.com/mrss/'
- YOUTUBE_NAMESPACE = 'http://gdata.youtube.com/schemas/2007'
- class MediaBaseElement(atom.AtomBase):
- """Base class for elements in the MEDIA_NAMESPACE.
- To add new elements, you only need to add the element tag name to self._tag
- """
-
- _tag = ''
- _namespace = MEDIA_NAMESPACE
- _children = atom.AtomBase._children.copy()
- _attributes = atom.AtomBase._attributes.copy()
- def __init__(self, name=None, extension_elements=None,
- extension_attributes=None, text=None):
- self.name = name
- self.text = text
- self.extension_elements = extension_elements or []
- self.extension_attributes = extension_attributes or {}
- class Content(MediaBaseElement):
- """(attribute container) This element describes the original content,
- e.g. an image or a video. There may be multiple Content elements
- in a media:Group.
- For example, a video may have a
- <media:content medium="image"> element that specifies a JPEG
- representation of the video, and a <media:content medium="video">
- element that specifies the URL of the video itself.
-
- Attributes:
- url: non-ambigous reference to online object
- width: width of the object frame, in pixels
- height: width of the object frame, in pixels
- medium: one of `image' or `video', allowing the api user to quickly
- determine the object's type
- type: Internet media Type[1] (a.k.a. mime type) of the object -- a more
- verbose way of determining the media type. To set the type member
- in the contructor, use the content_type parameter.
- (optional) fileSize: the size of the object, in bytes
-
- [1]: http://en.wikipedia.org/wiki/Internet_media_type
- """
-
- _tag = 'content'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['url'] = 'url'
- _attributes['width'] = 'width'
- _attributes['height'] = 'height'
- _attributes['medium'] = 'medium'
- _attributes['type'] = 'type'
- _attributes['fileSize'] = 'fileSize'
- def __init__(self, url=None, width=None, height=None,
- medium=None, content_type=None, fileSize=None, format=None,
- extension_elements=None, extension_attributes=None, text=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes,
- text=text)
- self.url = url
- self.width = width
- self.height = height
- self.medium = medium
- self.type = content_type
- self.fileSize = fileSize
- def ContentFromString(xml_string):
- return atom.CreateClassFromXMLString(Content, xml_string)
- class Credit(MediaBaseElement):
- """(string) Contains the nickname of the user who created the content,
- e.g. `Liz Bennet'.
-
- This is a user-specified value that should be used when referring to
- the user by name.
- Note that none of the attributes from the MediaRSS spec are supported.
- """
-
- _tag = 'credit'
- def CreditFromString(xml_string):
- return atom.CreateClassFromXMLString(Credit, xml_string)
- class Description(MediaBaseElement):
- """(string) A description of the media object.
- Either plain unicode text, or entity-encoded html (look at the `type'
- attribute).
- E.g `A set of photographs I took while vacationing in Italy.'
-
- For `api' projections, the description is in plain text;
- for `base' projections, the description is in HTML.
-
- Attributes:
- type: either `text' or `html'. To set the type member in the contructor,
- use the description_type parameter.
- """
-
- _tag = 'description'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['type'] = 'type'
- def __init__(self, description_type=None,
- extension_elements=None, extension_attributes=None, text=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes,
- text=text)
-
- self.type = description_type
- def DescriptionFromString(xml_string):
- return atom.CreateClassFromXMLString(Description, xml_string)
- class Keywords(MediaBaseElement):
- """(string) Lists the tags associated with the entry,
- e.g `italy, vacation, sunset'.
-
- Contains a comma-separated list of tags that have been added to the photo, or
- all tags that have been added to photos in the album.
- """
-
- _tag = 'keywords'
- def KeywordsFromString(xml_string):
- return atom.CreateClassFromXMLString(Keywords, xml_string)
- class Thumbnail(MediaBaseElement):
- """(attributes) Contains the URL of a thumbnail of a photo or album cover.
-
- There can be multiple <media:thumbnail> elements for a given <media:group>;
- for example, a given item may have multiple thumbnails at different sizes.
- Photos generally have two thumbnails at different sizes;
- albums generally have one cropped thumbnail.
-
- If the thumbsize parameter is set to the initial query, this element points
- to thumbnails of the requested sizes; otherwise the thumbnails are the
- default thumbnail size.
-
- This element must not be confused with the <gphoto:thumbnail> element.
-
- Attributes:
- url: The URL of the thumbnail image.
- height: The height of the thumbnail image, in pixels.
- width: The width of the thumbnail image, in pixels.
- """
-
- _tag = 'thumbnail'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['url'] = 'url'
- _attributes['width'] = 'width'
- _attributes['height'] = 'height'
- def __init__(self, url=None, width=None, height=None,
- extension_attributes=None, text=None, extension_elements=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes,
- text=text)
- self.url = url
- self.width = width
- self.height = height
- def ThumbnailFromString(xml_string):
- return atom.CreateClassFromXMLString(Thumbnail, xml_string)
- class Title(MediaBaseElement):
- """(string) Contains the title of the entry's media content, in plain text.
-
- Attributes:
- type: Always set to plain. To set the type member in the constructor, use
- the title_type parameter.
- """
-
- _tag = 'title'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['type'] = 'type'
- def __init__(self, title_type=None,
- extension_attributes=None, text=None, extension_elements=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes,
- text=text)
- self.type = title_type
- def TitleFromString(xml_string):
- return atom.CreateClassFromXMLString(Title, xml_string)
- class Player(MediaBaseElement):
- """(string) Contains the embeddable player URL for the entry's media content
- if the media is a video.
-
- Attributes:
- url: Always set to plain
- """
-
- _tag = 'player'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['url'] = 'url'
-
- def __init__(self, player_url=None,
- extension_attributes=None, extension_elements=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes)
- self.url= player_url
- class Private(atom.AtomBase):
- """The YouTube Private element"""
- _tag = 'private'
- _namespace = YOUTUBE_NAMESPACE
- class Duration(atom.AtomBase):
- """The YouTube Duration element"""
- _tag = 'duration'
- _namespace = YOUTUBE_NAMESPACE
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['seconds'] = 'seconds'
- class Category(MediaBaseElement):
- """The mediagroup:category element"""
- _tag = 'category'
- _attributes = atom.AtomBase._attributes.copy()
- _attributes['term'] = 'term'
- _attributes['scheme'] = 'scheme'
- _attributes['label'] = 'label'
- def __init__(self, term=None, scheme=None, label=None, text=None,
- extension_elements=None, extension_attributes=None):
- """Constructor for Category
- Args:
- term: str
- scheme: str
- label: str
- text: str The text data in the this element
- extension_elements: list A list of ExtensionElement instances
- extension_attributes: dict A dictionary of attribute value string pairs
- """
- self.term = term
- self.scheme = scheme
- self.label = label
- self.text = text
- self.extension_elements = extension_elements or []
- self.extension_attributes = extension_attributes or {}
- class Group(MediaBaseElement):
- """Container element for all media elements.
- The <media:group> element can appear as a child of an album, photo or
- video entry."""
- _tag = 'group'
- _children = atom.AtomBase._children.copy()
- _children['{%s}content' % MEDIA_NAMESPACE] = ('content', [Content,])
- _children['{%s}credit' % MEDIA_NAMESPACE] = ('credit', Credit)
- _children['{%s}description' % MEDIA_NAMESPACE] = ('description', Description)
- _children['{%s}keywords' % MEDIA_NAMESPACE] = ('keywords', Keywords)
- _children['{%s}thumbnail' % MEDIA_NAMESPACE] = ('thumbnail', [Thumbnail,])
- _children['{%s}title' % MEDIA_NAMESPACE] = ('title', Title)
- _children['{%s}category' % MEDIA_NAMESPACE] = ('category', [Category,])
- _children['{%s}duration' % YOUTUBE_NAMESPACE] = ('duration', Duration)
- _children['{%s}private' % YOUTUBE_NAMESPACE] = ('private', Private)
- _children['{%s}player' % MEDIA_NAMESPACE] = ('player', Player)
- def __init__(self, content=None, credit=None, description=None, keywords=None,
- thumbnail=None, title=None, duration=None, private=None,
- category=None, player=None, extension_elements=None,
- extension_attributes=None, text=None):
- MediaBaseElement.__init__(self, extension_elements=extension_elements,
- extension_attributes=extension_attributes,
- text=text)
- self.content=content
- self.credit=credit
- self.description=description
- self.keywords=keywords
- self.thumbnail=thumbnail or []
- self.title=title
- self.duration=duration
- self.private=private
- self.category=category or []
- self.player=player
- def GroupFromString(xml_string):
- return atom.CreateClassFromXMLString(Group, xml_string)