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

« back to all changes in this revision

Viewing changes to src/calibre/ebooks/oeb/transforms/metadata.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2009-07-30 12:49:41 UTC
  • mto: This revision was merged to the branch mainline in revision 13.
  • Revision ID: james.westby@ubuntu.com-20090730124941-kviipg9ypwgppulc
Tags: upstream-0.6.3+dfsg
ImportĀ upstreamĀ versionĀ 0.6.3+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
 
3
from __future__ import with_statement
 
4
 
 
5
__license__   = 'GPL v3'
 
6
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
 
7
__docformat__ = 'restructuredtext en'
 
8
 
 
9
import os
 
10
from datetime import datetime
 
11
 
 
12
def meta_info_to_oeb_metadata(mi, m, log):
 
13
    from calibre.ebooks.oeb.base import OPF
 
14
    if mi.title:
 
15
        m.clear('title')
 
16
        m.add('title', mi.title)
 
17
    if mi.title_sort:
 
18
        if not m.title:
 
19
            m.add('title', mi.title_sort)
 
20
        m.title[0].file_as = mi.title_sort
 
21
    if mi.authors:
 
22
        m.filter('creator', lambda x : x.role.lower() in ['aut', ''])
 
23
        for a in mi.authors:
 
24
            attrib = {'role':'aut'}
 
25
            if mi.author_sort:
 
26
                attrib[OPF('file-as')] = mi.author_sort
 
27
            m.add('creator', a, attrib=attrib)
 
28
    if mi.book_producer:
 
29
        m.filter('contributor', lambda x : x.role.lower() == 'bkp')
 
30
        m.add('contributor', mi.book_producer, role='bkp')
 
31
    if mi.comments:
 
32
        m.clear('description')
 
33
        m.add('description', mi.comments)
 
34
    if mi.publisher:
 
35
        m.clear('publisher')
 
36
        m.add('publisher', mi.publisher)
 
37
    if mi.series:
 
38
        m.clear('series')
 
39
        m.add('series', mi.series)
 
40
    if mi.isbn:
 
41
        has = False
 
42
        for x in m.identifier:
 
43
            if x.scheme.lower() == 'isbn':
 
44
                x.content = mi.isbn
 
45
                has = True
 
46
        if not has:
 
47
            m.add('identifier', mi.isbn, scheme='ISBN')
 
48
    if mi.language:
 
49
        m.clear('language')
 
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:
 
55
        m.clear('rating')
 
56
        m.add('rating', '%.2f'%mi.rating)
 
57
    if mi.tags:
 
58
        m.clear('subject')
 
59
        for t in mi.tags:
 
60
            m.add('subject', t)
 
61
    if mi.pubdate is not None:
 
62
        m.clear('date')
 
63
        m.add('date', mi.pubdate.isoformat())
 
64
    if mi.timestamp is not None:
 
65
        m.clear('timestamp')
 
66
        m.add('timestamp', mi.timestamp.isoformat())
 
67
    if mi.rights is not None:
 
68
        m.clear('rights')
 
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)
 
73
    if not m.timestamp:
 
74
        m.add('timestamp', datetime.utcnow().isoformat())
 
75
 
 
76
 
 
77
class MergeMetadata(object):
 
78
    'Merge in user metadata, including cover'
 
79
 
 
80
    def __call__(self, oeb, mi, opts):
 
81
        self.oeb, self.log = oeb, oeb.log
 
82
        m = self.oeb.metadata
 
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)
 
86
        m.clear('cover')
 
87
        if cover_id is not None:
 
88
            m.add('cover', cover_id)
 
89
 
 
90
 
 
91
    def set_cover(self, mi, prefer_metadata_cover):
 
92
        cdata = ''
 
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]
 
97
        id = old_cover = None
 
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:
 
101
            cdata = ''
 
102
        if cdata:
 
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]
 
108
                if not cdata:
 
109
                    return item.id
 
110
                self.oeb.manifest.remove(item)
 
111
            elif not cdata:
 
112
                id = self.oeb.manifest.generate(id='cover')
 
113
                self.oeb.manifest.add(id, old_cover.href, 'image/jpeg')
 
114
                return id
 
115
        if cdata:
 
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)
 
119
        return id
 
120