Fix #1379 (Unable to convert ePub file to LRF)

This commit is contained in:
Kovid Goyal 2008-12-11 19:41:53 -08:00
parent f976ad63be
commit a79a6c0df3
2 changed files with 33 additions and 23 deletions

View File

@ -1948,7 +1948,8 @@ def try_opf(path, options, logger):
return return
dirpath = os.path.dirname(os.path.abspath(opf)) dirpath = os.path.dirname(os.path.abspath(opf))
opf = OPFReader(open(opf, 'rb'), dirpath) from calibre.ebooks.metadata.opf2 import OPF as OPF2
opf = OPF2(open(opf, 'rb'), dirpath)
try: try:
title = opf.title title = opf.title
if title and not getattr(options, 'title', None): if title and not getattr(options, 'title', None):
@ -1962,10 +1963,6 @@ def try_opf(path, options, logger):
publisher = opf.publisher publisher = opf.publisher
if publisher: if publisher:
options.publisher = publisher options.publisher = publisher
if not getattr(options, 'category', None):
category = opf.category
if category:
options.category = category
if not getattr(options, 'cover', None) or options.use_metadata_cover: if not getattr(options, 'cover', None) or options.use_metadata_cover:
orig_cover = getattr(options, 'cover', None) orig_cover = getattr(options, 'cover', None)
options.cover = None options.cover = None

View File

@ -70,7 +70,7 @@ class Manifest(ResourceCollection):
@staticmethod @staticmethod
def from_opf_manifest_element(manifest, dir): def from_opf_manifest_element(manifest, dir):
m = Manifest() m = Manifest()
for item in manifest.findAll('item'): for item in manifest.findAll(re.compile('item')):
try: try:
m.append(ManifestItem.from_opf_manifest_item(item, dir)) m.append(ManifestItem.from_opf_manifest_item(item, dir))
id = item.get('id', '') id = item.get('id', '')
@ -130,7 +130,7 @@ class Spine(ResourceCollection):
@staticmethod @staticmethod
def from_opf_spine_element(spine, manifest): def from_opf_spine_element(spine, manifest):
s = Spine(manifest) s = Spine(manifest)
for itemref in spine.findAll('itemref'): for itemref in spine.findAll(re.compile('itemref')):
if itemref.has_key('idref'): if itemref.has_key('idref'):
r = Spine.Item(s.manifest.id_for_path, r = Spine.Item(s.manifest.id_for_path,
s.manifest.path_for_id(itemref['idref']), is_path=True) s.manifest.path_for_id(itemref['idref']), is_path=True)
@ -242,14 +242,27 @@ class OPF(MetaInformation):
def __init__(self): def __init__(self):
raise NotImplementedError('Abstract base class') raise NotImplementedError('Abstract base class')
@apply
def package():
def fget(self):
return self.soup.find(re.compile('package'))
return property(fget=fget)
@apply
def metadata():
def fget(self):
return self.package.find(re.compile('metadata'))
return property(fget=fget)
def get_title(self): def get_title(self):
title = self.soup.package.metadata.find('dc:title') title = self.metadata.find('dc:title')
if title and title.string: if title and title.string:
return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip() return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip()
return self.default_title.strip() return self.default_title.strip()
def get_authors(self): def get_authors(self):
creators = self.soup.package.metadata.findAll('dc:creator') creators = self.metadata.findAll('dc:creator')
for elem in creators: for elem in creators:
role = elem.get('role') role = elem.get('role')
if not role: if not role:
@ -266,7 +279,7 @@ class OPF(MetaInformation):
return [] return []
def get_author_sort(self): def get_author_sort(self):
creators = self.soup.package.metadata.findAll('dc:creator') creators = self.metadata.findAll('dc:creator')
for elem in creators: for elem in creators:
role = elem.get('role') role = elem.get('role')
if not role: if not role:
@ -277,7 +290,7 @@ class OPF(MetaInformation):
return None return None
def get_title_sort(self): def get_title_sort(self):
title = self.soup.package.find('dc:title') title = self.package.find('dc:title')
if title: if title:
if title.has_key('file-as'): if title.has_key('file-as'):
return title['file-as'].strip() return title['file-as'].strip()
@ -290,7 +303,7 @@ class OPF(MetaInformation):
return None return None
def get_uid(self): def get_uid(self):
package = self.soup.find('package') package = self.package
if package.has_key('unique-identifier'): if package.has_key('unique-identifier'):
return package['unique-identifier'] return package['unique-identifier']
@ -307,7 +320,7 @@ class OPF(MetaInformation):
return None return None
def get_isbn(self): def get_isbn(self):
for item in self.soup.package.metadata.findAll('dc:identifier'): for item in self.metadata.findAll('dc:identifier'):
scheme = item.get('scheme') scheme = item.get('scheme')
if not scheme: if not scheme:
scheme = item.get('opf:scheme') scheme = item.get('opf:scheme')
@ -316,13 +329,13 @@ class OPF(MetaInformation):
return None return None
def get_language(self): def get_language(self):
item = self.soup.package.metadata.find('dc:language') item = self.metadata.find('dc:language')
if not item: if not item:
return _('Unknown') return _('Unknown')
return ''.join(item.findAll(text=True)).strip() return ''.join(item.findAll(text=True)).strip()
def get_application_id(self): def get_application_id(self):
for item in self.soup.package.metadata.findAll('dc:identifier'): for item in self.metadata.findAll('dc:identifier'):
scheme = item.get('scheme', None) scheme = item.get('scheme', None)
if scheme is None: if scheme is None:
scheme = item.get('opf:scheme', None) scheme = item.get('opf:scheme', None)
@ -342,7 +355,7 @@ class OPF(MetaInformation):
def possible_cover_prefixes(self): def possible_cover_prefixes(self):
isbn, ans = [], [] isbn, ans = [], []
for item in self.soup.package.metadata.findAll('dc:identifier'): for item in self.metadata.findAll('dc:identifier'):
scheme = item.get('scheme') scheme = item.get('scheme')
if not scheme: if not scheme:
scheme = item.get('opf:scheme') scheme = item.get('opf:scheme')
@ -352,13 +365,13 @@ class OPF(MetaInformation):
return ans return ans
def get_series(self): def get_series(self):
s = self.soup.package.metadata.find('series') s = self.metadata.find('series')
if s is not None: if s is not None:
return str(s.string).strip() return str(s.string).strip()
return None return None
def get_series_index(self): def get_series_index(self):
s = self.soup.package.metadata.find('series-index') s = self.metadata.find('series-index')
if s and s.string: if s and s.string:
try: try:
return int(str(s.string).strip()) return int(str(s.string).strip())
@ -367,7 +380,7 @@ class OPF(MetaInformation):
return None return None
def get_rating(self): def get_rating(self):
s = self.soup.package.metadata.find('rating') s = self.metadata.find('rating')
if s and s.string: if s and s.string:
try: try:
return int(str(s.string).strip()) return int(str(s.string).strip())
@ -400,17 +413,17 @@ class OPFReader(OPF):
if manage: if manage:
stream.close() stream.close()
self.manifest = Manifest() self.manifest = Manifest()
m = self.soup.find('manifest') m = self.soup.find(re.compile('manifest'))
if m is not None: if m is not None:
self.manifest = Manifest.from_opf_manifest_element(m, dir) self.manifest = Manifest.from_opf_manifest_element(m, dir)
self.spine = None self.spine = None
spine = self.soup.find('spine') spine = self.soup.find(re.compile('spine'))
if spine is not None: if spine is not None:
self.spine = Spine.from_opf_spine_element(spine, self.manifest) self.spine = Spine.from_opf_spine_element(spine, self.manifest)
self.toc = TOC(base_path=dir) self.toc = TOC(base_path=dir)
self.toc.read_from_opf(self) self.toc.read_from_opf(self)
guide = self.soup.find('guide') guide = self.soup.find(re.compile('guide'))
if guide is not None: if guide is not None:
self.guide = Guide.from_opf_guide(guide, dir) self.guide = Guide.from_opf_guide(guide, dir)
self.base_dir = dir self.base_dir = dir