atomresponder/atom_message.py (50 lines of code) (raw):

import json from collections import namedtuple class AssetInfo(object): """ Object to represent an asset entry in the media atom model. Provides a get_url() method to return a URL to the asset. """ def __init__(self, version, id, assetType="video", platform="youtube"): self.version = version self.external_id = id self.assetType = assetType self.platform = platform def get_url(self): if self.platform.lower() == "youtube": return "https://www.youtube.com/watch?v={0}".format(self.external_id) else: raise ValueError("Unrecognised platform {0}".format(self.platform)) class AtomMessage(object): """ Object that represents a parsed message from the media atom tool. Each proprty on the json object is accessible as a property on this object, for example: >> a = AtomMessage(content_string) >> a.description "atom description" Special properties are available for more complex objects: - posterImages - generator that yields poster images from the object - biggest_poster_image - finds the largest poster image specified and returns that """ def __init__(self, jsonstring): """ Initialises an instance with the data parsed from the given json string. Raises json exceptions if this is not valid. :param jsonstring: """ if not isinstance(jsonstring,str): raise TypeError self._content = json.loads(jsonstring) def __getattr__(self, item): """ Generic property getter. Raises ValueError if the property does not exist. :param item: proprty name to get :return: Value of the property or raises a ValueError """ if not item in self._content: raise ValueError("We don't have a value for {0}".format(item)) return self._content[item] @property def posterImages(self): """ Generator to yield image_info objects of each poster image image_info objects support mimeType, file, dimensions and size properties. :return: yields image_info objects """ image_info = namedtuple('image_info',"mimeType file dimensions size") for entry in self._content['posterImage']['assets']: yield image_info(entry['mimeType'], entry['file'], entry['dimensions'], entry['size']) def biggest_poster_image(self): """ Finds the biggest poster image on the content and returns it. :return: image_info object for the biggest poster image, or None if no images are defined. """ rtn = None for entry in self.posterImages: if rtn is None: rtn = entry continue if entry.size > rtn.size: rtn = entry return rtn @property def assets(self): """ Generator to yield asset_info objects of each asset :return: """ for entry in self._content['assets']: yield AssetInfo(entry['version'],entry['id'],entry['assetType'],entry['platform']) @property def latest_asset(self): """ Returns the asset_info of the most recent asset, or None if there are no assets. :return: asset_info or None """ rtn = None for asset in self.assets: if rtn is None: rtn = asset continue if asset.version > rtn.version: rtn = asset return rtn