Package amplee :: Package atompub :: Package member :: Module media
[hide private]
[frames] | no frames]

Source Code for Module amplee.atompub.member.media

  1  # -*- coding: utf-8 -*- 
  2   
  3  __doc__ = """ 
  4  This module defines a set of member classes aiming at 
  5  dealing with media formats supported by the Hachoir library: 
  6  http://hachoir.org/wiki/hachoir-parser 
  7   
  8  Therefore this module requires the Hachoir library (core and meta_data): 
  9  http://hachoir.org/ 
 10  """ 
 11   
 12  from datetime import datetime 
 13  import os 
 14  from xml.sax.saxutils import escape 
 15   
 16  from bridge import Element, Attribute 
 17  from bridge.common import ATOM10_PREFIX, ATOMPUB_PREFIX, XML_PREFIX, XML_NS, \ 
 18       ATOM10_NS, ATOMPUB_NS 
 19   
 20  from amplee.utils import generate_uuid_uri, get_isodate 
 21  from amplee.error import MemberMediaError 
 22  from amplee.atompub.member import MediaMember 
 23  from amplee.atompub.member.helper import MemberHelper 
 24   
 25  from hachoir.error import HachoirError 
 26  from hachoir.stream import InputStreamError, InputSubStream 
 27  from hachoir_parser import guessParser 
 28  from hachoir_metadata import extractMetadata 
 29   
30 -class HachoirMember(MediaMember):
31 - def __init__(self, collection, source, slug=None, title=None, 32 description=None, media_type=None, ext=None, 33 entry_id_creator=None, name_creator=None, **kwargs):
34 """ 35 Creates a member based Hachoir capabilities. 36 37 Keyword arguments 38 collection -- parent collection 39 source -- fileobj of data to handle 40 title -- title to use for the Atom entry. If not provided it will be extracted 41 from the resource metadat if any. 42 description -- summary to use for the Atom entry. If not provided it will 43 extracted from the metadata if any. 44 name_creator -- callable to generate the last segment of URIs used for 45 this resource 46 ext -- extension to use for the media resource 47 media_type -- mime type of the media resource 48 entry_id_creator -- callable which will return the id 49 to use in the atom:id element (as an unicode object) 50 51 The name_creator and the entry_id_creator function must takes the following parameters: 52 collection, abs_path, metadata (a hachoir_metadata.metadata instance), slug, ext 53 """ 54 MediaMember.__init__(self, collection, media_type=media_type) 55 56 metadata = self.__get_meta_data(source) 57 58 name = slug 59 if callable(name_creator): 60 name = name_creator(collection, abs_path, metadata, slug, ext) 61 62 media_id = member_id = name 63 if self.collection.member_extension: 64 member_id = u'%s.%s' % (name, self.collection.member_extension) 65 66 self.media_id = media_id 67 self.member_id = member_id 68 69 if callable(entry_id_creator): 70 id = entry_id_creator(collection, abs_path, metadata, slug, ext) 71 else: 72 id = generate_uuid_uri() 73 74 mh = MemberHelper(self.collection) 75 mh.initiate(id=id) 76 mh.add_element('title', content=name, attributes={u'type': u'text'}) 77 mh.add_element('summary', unicode(description), attributes={u'type': u'text'}) 78 author_name = self.__clean_value(metadata, 'author') 79 author = mh.add_element('author') 80 mh.add_element('name', content=author_name, parent=author) 81 82 attr = {u'rel': u'edit', u'type': self.collection.member_media_type, 83 u'href': unicode(escape("%s/%s" % (self.collection.base_edit_uri, 84 member_id))),} 85 mh.add_element('link', attributes=attr) 86 87 attr = {u'rel': u'edit-media', u'type': self.media_type, 88 u'href': unicode(escape("%s/%s" % (self.collection.base_media_edit_uri, 89 media_id)))} 90 link = mh.add_element('link', attributes=attr) 91 92 attr = {u'src': unicode(escape("%s/%s" % (self.collection.base_uri, media_id))), 93 u'type': self.media_type} 94 mh.add_element('content', attributes=attr) 95 96 self.entry = mh.entry 97 del mh
98
99 - def __clean_value(self, metadata, name):
100 value = getattr(metadata, name, None) 101 102 if not value: 103 value = u'' 104 105 elif isinstance(value, list): 106 value = unicode(', '.join(value)) 107 elif isinstance(value, basetring): 108 value = unicode(value) 109 110 return value
111
112 - def __get_meta_data(self, source):
113 parser = None 114 try: 115 parser = guessParser(input=StringInputStream(source)) 116 except InputStreamError, err: 117 raise unicode(err) 118 if not parser: 119 raise "Could not parse '%s'" % filepath 120 121 try: 122 metadata = extractMetadata(parser) 123 except HachoirError, err: 124 raise unicode(err) 125 126 return metadata
127