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) # }}}