~ubuntu-branches/ubuntu/karmic/calibre/karmic

« back to all changes in this revision

Viewing changes to src/calibre/ebooks/metadata/mobi.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2009-02-12 12:31:44 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090212123144-z8khnpqth2btbypd
Tags: 0.4.136+dfsg-0ubuntu1
* New upstream release.
* Add new build/binary dependency python-dateutil, now required by
  this new version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
    def __init__(self, stream, start=0, stop=None):
24
24
        self._stream = stream
25
25
        self.start = start
26
 
        if stop is None: 
27
 
            stream.seek(0, 2)        
 
26
        if stop is None:
 
27
            stream.seek(0, 2)
28
28
            stop = stream.tell()
29
29
        self.stop = stop
30
30
        self._len = stop - start
74
74
        raise TypeError("stream indices must be integers")
75
75
 
76
76
    
77
 
class MetadataUpdater(object):    
 
77
class MetadataUpdater(object):
78
78
    def __init__(self, stream):
79
79
        self.stream = stream
80
80
        data = self.data = StreamSlicer(stream)
86
86
        image_base, = unpack('>I', record0[108:112])
87
87
        flags, = unpack('>I', record0[128:132])
88
88
        have_exth = self.have_exth = (flags & 0x40) != 0
 
89
        self.cover_record = self.thumbnail_record = None
89
90
        if not have_exth:
90
91
            return
91
 
        self.cover_record = self.thumbnail_record = None
92
92
        exth_off = unpack('>I', record0[20:24])[0] + 16 + record0.start
93
93
        exth = self.exth = StreamSlicer(stream, exth_off, record0.stop)
94
94
        nitems, = unpack('>I', exth[8:12])
143
143
        exth = ['EXTH', pack('>II', len(exth) + 12, len(recs)), exth, pad]
144
144
        exth = ''.join(exth)
145
145
        title = (mi.title or _('Unknown')).encode(self.codec, 'replace')
 
146
        if getattr(self, 'exth', None) is None:
 
147
            raise MobiError('No existing EXTH record. Cannot update metadata.')
146
148
        title_off = (self.exth.start - self.record0.start) + len(exth)
147
149
        title_len = len(title)
148
150
        trail = len(self.exth) - len(exth) - len(title)
151
153
        self.exth[:] = ''.join([exth, title, '\0' * trail])
152
154
        self.record0[84:92] = pack('>II', title_off, title_len)
153
155
        self.record0[92:96] = iana2mobi(mi.language)
154
 
        if mi.cover_data[1]:
155
 
            data =  mi.cover_data[1]
156
 
            if self.cover_record is not None:
157
 
                size = len(self.cover_record)
158
 
                cover = rescale_image(data, size)
159
 
                cover += '\0' * (size - len(cover))
160
 
                self.cover_record[:] = cover
161
 
            if self.thumbnail_record is not None:
162
 
                size = len(self.thumbnail_record)
163
 
                thumbnail = rescale_image(data, size, dimen=MAX_THUMB_DIMEN)
164
 
                thumbnail += '\0' * (size - len(thumbnail))
165
 
                self.thumbnail_record[:] = thumbnail
 
156
        if mi.cover_data[1] or mi.cover:
 
157
            try:
 
158
                data =  mi.cover_data[1] if mi.cover_data[1] else open(mi.cover, 'rb').read()
 
159
            except:
 
160
                pass
 
161
            else:
 
162
                if self.cover_record is not None:
 
163
                    size = len(self.cover_record)
 
164
                    cover = rescale_image(data, size)
 
165
                    cover += '\0' * (size - len(cover))
 
166
                    self.cover_record[:] = cover
 
167
                if self.thumbnail_record is not None:
 
168
                    size = len(self.thumbnail_record)
 
169
                    thumbnail = rescale_image(data, size, dimen=MAX_THUMB_DIMEN)
 
170
                    thumbnail += '\0' * (size - len(thumbnail))
 
171
                    self.thumbnail_record[:] = thumbnail
166
172
        return
167
173
 
168
174
def set_metadata(stream, mi):