mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix #1379 (Unable to convert ePub file to LRF)
This commit is contained in:
parent
f976ad63be
commit
a79a6c0df3
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user