diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py
index 9600fc9bc9..66a245f4af 100644
--- a/src/calibre/ebooks/metadata/opf3.py
+++ b/src/calibre/ebooks/metadata/opf3.py
@@ -79,7 +79,7 @@ def properties_for_id(item_id, refines):
def properties_for_id_with_scheme(item_id, prefixes, refines):
- ans = {}
+ ans = defaultdict(list)
if item_id:
for elem in refines[item_id]:
key = elem.get('property')
@@ -95,7 +95,7 @@ def properties_for_id_with_scheme(item_id, prefixes, refines):
if ns:
scheme_ns = ns
scheme = r
- ans[key] = (scheme_ns, scheme, val)
+ ans[key].append((scheme_ns, scheme, val))
return ans
@@ -420,10 +420,10 @@ Author = namedtuple('Author', 'name sort')
def is_relators_role(props, q):
- role = props.get('role')
- if role:
- scheme_ns, scheme, role = role
- return role.lower() == q and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators'))
+ for role in props.get('role'):
+ if role:
+ scheme_ns, scheme, role = role
+ return role.lower() == q and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators'))
return False
@@ -434,7 +434,7 @@ def read_authors(root, prefixes, refines):
aus = None
file_as = props.get('file-as')
if file_as:
- aus = file_as[-1]
+ aus = file_as[-1][-1]
else:
aus = item.get(OPF('file-as')) or None
return Author(normalize_whitespace(val), normalize_whitespace(aus))
diff --git a/src/calibre/ebooks/metadata/opf3_test.py b/src/calibre/ebooks/metadata/opf3_test.py
index ed03e30270..258454dae6 100644
--- a/src/calibre/ebooks/metadata/opf3_test.py
+++ b/src/calibre/ebooks/metadata/opf3_test.py
@@ -149,6 +149,10 @@ class TestOPF3(unittest.TestCase):
root = self.get_opf('''a bc d''')
self.ae([Author('c d', None)], rl(root))
self.ae(authors, st(root, authors))
+ root = self.get_opf('''a b'''
+ '''aut'''
+ '''cow''')
+ self.ae([Author('a b', None)], rl(root))
# }}}
def test_book_producer(self): # {{{
@@ -562,6 +566,7 @@ class TestRunner(unittest.main):
def run(verbosity=4):
TestRunner(verbosity=verbosity, exit=False)
+
if __name__ == '__main__':
run(verbosity=4)
# }}}