2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
3
from __future__ import with_statement
6
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
7
__docformat__ = 'restructuredtext en'
10
from datetime import datetime
12
def meta_info_to_oeb_metadata(mi, m, log):
13
from calibre.ebooks.oeb.base import OPF
16
m.add('title', mi.title)
19
m.add('title', mi.title_sort)
20
m.title[0].file_as = mi.title_sort
22
m.filter('creator', lambda x : x.role.lower() in ['aut', ''])
24
attrib = {'role':'aut'}
26
attrib[OPF('file-as')] = mi.author_sort
27
m.add('creator', a, attrib=attrib)
29
m.filter('contributor', lambda x : x.role.lower() == 'bkp')
30
m.add('contributor', mi.book_producer, role='bkp')
32
m.clear('description')
33
m.add('description', mi.comments)
36
m.add('publisher', mi.publisher)
39
m.add('series', mi.series)
42
for x in m.identifier:
43
if x.scheme.lower() == 'isbn':
47
m.add('identifier', mi.isbn, scheme='ISBN')
50
m.add('language', mi.language)
51
if mi.series_index is not None:
52
m.clear('series_index')
53
m.add('series_index', mi.format_series_index())
54
if mi.rating is not None:
56
m.add('rating', '%.2f'%mi.rating)
61
if mi.pubdate is not None:
63
m.add('date', mi.pubdate.isoformat())
64
if mi.timestamp is not None:
66
m.add('timestamp', mi.timestamp.isoformat())
67
if mi.rights is not None:
69
m.add('rights', mi.rights)
70
if mi.publication_type is not None:
71
m.clear('publication_type')
72
m.add('publication_type', mi.publication_type)
74
m.add('timestamp', datetime.utcnow().isoformat())
77
class MergeMetadata(object):
78
'Merge in user metadata, including cover'
80
def __call__(self, oeb, mi, opts):
81
self.oeb, self.log = oeb, oeb.log
83
meta_info_to_oeb_metadata(mi, m, oeb.log)
84
self.log('Merging user specified metadata...')
85
cover_id = self.set_cover(mi, opts.prefer_metadata_cover)
87
if cover_id is not None:
88
m.add('cover', cover_id)
91
def set_cover(self, mi, prefer_metadata_cover):
93
if mi.cover and os.access(mi.cover, os.R_OK):
94
cdata = open(mi.cover, 'rb').read()
95
elif mi.cover_data and mi.cover_data[-1]:
96
cdata = mi.cover_data[1]
98
if 'cover' in self.oeb.guide:
99
old_cover = self.oeb.guide['cover']
100
if prefer_metadata_cover and old_cover is not None:
103
self.oeb.guide.remove('cover')
104
self.oeb.guide.remove('titlepage')
105
if old_cover is not None:
106
if old_cover.href in self.oeb.manifest.hrefs:
107
item = self.oeb.manifest.hrefs[old_cover.href]
110
self.oeb.manifest.remove(item)
112
id = self.oeb.manifest.generate(id='cover')
113
self.oeb.manifest.add(id, old_cover.href, 'image/jpeg')
116
id, href = self.oeb.manifest.generate('cover', 'cover.jpg')
117
self.oeb.manifest.add(id, href, 'image/jpeg', data=cdata)
118
self.oeb.guide.add('cover', 'Cover', href)