diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py
index c9ae5e8c58..529b9dfdb8 100644
--- a/src/calibre/ebooks/lrf/html/convert_from.py
+++ b/src/calibre/ebooks/lrf/html/convert_from.py
@@ -1948,7 +1948,8 @@ def try_opf(path, options, logger):
return
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:
title = opf.title
if title and not getattr(options, 'title', None):
@@ -1962,10 +1963,6 @@ def try_opf(path, options, logger):
publisher = opf.publisher
if 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:
orig_cover = getattr(options, 'cover', None)
options.cover = None
diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py
index 21e0730c8c..ce137ffa15 100644
--- a/src/calibre/ebooks/metadata/opf.py
+++ b/src/calibre/ebooks/metadata/opf.py
@@ -70,7 +70,7 @@ class Manifest(ResourceCollection):
@staticmethod
def from_opf_manifest_element(manifest, dir):
m = Manifest()
- for item in manifest.findAll('item'):
+ for item in manifest.findAll(re.compile('item')):
try:
m.append(ManifestItem.from_opf_manifest_item(item, dir))
id = item.get('id', '')
@@ -130,7 +130,7 @@ class Spine(ResourceCollection):
@staticmethod
def from_opf_spine_element(spine, manifest):
s = Spine(manifest)
- for itemref in spine.findAll('itemref'):
+ for itemref in spine.findAll(re.compile('itemref')):
if itemref.has_key('idref'):
r = Spine.Item(s.manifest.id_for_path,
s.manifest.path_for_id(itemref['idref']), is_path=True)
@@ -216,7 +216,7 @@ class standard_field(object):
def __get__(self, obj, typ=None):
return getattr(obj, 'get_'+self.name)()
-
+
class OPF(MetaInformation):
MIMETYPE = 'application/oebps-package+xml'
@@ -242,14 +242,27 @@ class OPF(MetaInformation):
def __init__(self):
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):
- title = self.soup.package.metadata.find('dc:title')
+ title = self.metadata.find('dc:title')
if title and title.string:
return self.ENTITY_PATTERN.sub(entity_to_unicode, title.string).strip()
return self.default_title.strip()
def get_authors(self):
- creators = self.soup.package.metadata.findAll('dc:creator')
+ creators = self.metadata.findAll('dc:creator')
for elem in creators:
role = elem.get('role')
if not role:
@@ -266,7 +279,7 @@ class OPF(MetaInformation):
return []
def get_author_sort(self):
- creators = self.soup.package.metadata.findAll('dc:creator')
+ creators = self.metadata.findAll('dc:creator')
for elem in creators:
role = elem.get('role')
if not role:
@@ -277,7 +290,7 @@ class OPF(MetaInformation):
return None
def get_title_sort(self):
- title = self.soup.package.find('dc:title')
+ title = self.package.find('dc:title')
if title:
if title.has_key('file-as'):
return title['file-as'].strip()
@@ -290,7 +303,7 @@ class OPF(MetaInformation):
return None
def get_uid(self):
- package = self.soup.find('package')
+ package = self.package
if package.has_key('unique-identifier'):
return package['unique-identifier']
@@ -307,7 +320,7 @@ class OPF(MetaInformation):
return None
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')
if not scheme:
scheme = item.get('opf:scheme')
@@ -316,13 +329,13 @@ class OPF(MetaInformation):
return None
def get_language(self):
- item = self.soup.package.metadata.find('dc:language')
+ item = self.metadata.find('dc:language')
if not item:
return _('Unknown')
return ''.join(item.findAll(text=True)).strip()
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)
if scheme is None:
scheme = item.get('opf:scheme', None)
@@ -342,7 +355,7 @@ class OPF(MetaInformation):
def possible_cover_prefixes(self):
isbn, ans = [], []
- for item in self.soup.package.metadata.findAll('dc:identifier'):
+ for item in self.metadata.findAll('dc:identifier'):
scheme = item.get('scheme')
if not scheme:
scheme = item.get('opf:scheme')
@@ -352,13 +365,13 @@ class OPF(MetaInformation):
return ans
def get_series(self):
- s = self.soup.package.metadata.find('series')
+ s = self.metadata.find('series')
if s is not None:
return str(s.string).strip()
return None
def get_series_index(self):
- s = self.soup.package.metadata.find('series-index')
+ s = self.metadata.find('series-index')
if s and s.string:
try:
return int(str(s.string).strip())
@@ -367,7 +380,7 @@ class OPF(MetaInformation):
return None
def get_rating(self):
- s = self.soup.package.metadata.find('rating')
+ s = self.metadata.find('rating')
if s and s.string:
try:
return int(str(s.string).strip())
@@ -400,17 +413,17 @@ class OPFReader(OPF):
if manage:
stream.close()
self.manifest = Manifest()
- m = self.soup.find('manifest')
+ m = self.soup.find(re.compile('manifest'))
if m is not None:
self.manifest = Manifest.from_opf_manifest_element(m, dir)
self.spine = None
- spine = self.soup.find('spine')
+ spine = self.soup.find(re.compile('spine'))
if spine is not None:
self.spine = Spine.from_opf_spine_element(spine, self.manifest)
self.toc = TOC(base_path=dir)
self.toc.read_from_opf(self)
- guide = self.soup.find('guide')
+ guide = self.soup.find(re.compile('guide'))
if guide is not None:
self.guide = Guide.from_opf_guide(guide, dir)
self.base_dir = dir