1
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
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
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
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