From b5024991408c7d3d13e7dd4b978078b6b3710ec6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Jun 2016 15:28:18 +0530 Subject: [PATCH] Implement rating --- src/calibre/ebooks/metadata/opf3.py | 40 ++++++++++++++++++++++++ src/calibre/ebooks/metadata/opf3_test.py | 16 +++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py index 716a10a458..108d3215a7 100644 --- a/src/calibre/ebooks/metadata/opf3.py +++ b/src/calibre/ebooks/metadata/opf3.py @@ -590,6 +590,44 @@ def set_tags(root, prefixes, refines, val): m.append(c) # }}} +# Rating {{{ + +def read_rating(root, prefixes, refines): + pq = '%s:rating' % CALIBRE_PREFIX + for meta in XPath('./opf:metadata/opf:meta[@property]')(root): + val = (meta.text or '').strip() + if val: + prop = expand_prefix(meta.get('property'), prefixes) + if prop.lower() == pq: + try: + return float(val) + except Exception: + continue + for meta in XPath('./opf:metadata/opf:meta[@name="calibre:rating"]')(root): + val = meta.get('content') + if val: + try: + return float(val) + except Exception: + continue + +def set_rating(root, prefixes, refines, val): + pq = '%s:rating' % CALIBRE_PREFIX + for meta in XPath('./opf:metadata/opf:meta[@name="calibre:rating"]')(root): + remove_element(meta, refines) + for meta in XPath('./opf:metadata/opf:meta[@property]')(root): + prop = expand_prefix(meta.get('property'), prefixes) + if prop.lower() == pq: + remove_element(meta, refines) + if val: + ensure_prefix(root, prefixes, 'calibre', CALIBRE_PREFIX) + m = XPath('./opf:metadata')(root)[0] + if val: + d = m.makeelement(OPF('meta'), attrib={'property':'calibre:rating'}) + d.text = '%.2g' % val + m.append(d) +# }}} + def read_metadata(root): ans = Metadata(_('Unknown'), [_('Unknown')]) prefixes, refines = read_prefixes(root), read_refines(root) @@ -624,6 +662,7 @@ def read_metadata(root): ans.comments = read_comments(root, prefixes, refines) or ans.comments ans.publisher = read_publisher(root, prefixes, refines) or ans.publisher ans.tags = read_tags(root, prefixes, refines) or ans.tags + ans.rating = read_rating(root, prefixes, refines) or ans.rating return ans def get_metadata(stream): @@ -645,6 +684,7 @@ def apply_metadata(root, mi, cover_prefix='', cover_data=None, apply_null=False, set_comments(root, prefixes, refines, mi.comments) set_publisher(root, prefixes, refines, mi.publisher) set_tags(root, prefixes, refines, mi.tags) + set_rating(root, prefixes, refines, mi.rating) pretty_print_opf(root) diff --git a/src/calibre/ebooks/metadata/opf3_test.py b/src/calibre/ebooks/metadata/opf3_test.py index ac7be784a5..7629f7e2fe 100644 --- a/src/calibre/ebooks/metadata/opf3_test.py +++ b/src/calibre/ebooks/metadata/opf3_test.py @@ -16,7 +16,8 @@ from calibre.ebooks.metadata.opf3 import ( read_authors, Author, set_authors, ensure_prefix, read_prefixes, read_book_producers, set_book_producers, read_timestamp, set_timestamp, read_pubdate, set_pubdate, CALIBRE_PREFIX, read_last_modified, read_comments, - set_comments, read_publisher, set_publisher, read_tags, set_tags + set_comments, read_publisher, set_publisher, read_tags, set_tags, read_rating, + set_rating ) TEMPLATE = '''{metadata}''' % CALIBRE_PREFIX # noqa @@ -206,6 +207,19 @@ class TestOPF3(unittest.TestCase): self.ae('1,2,3'.split(','), st(root, '1,2,3'.split(','))) # }}} + def test_rating(self): # {{{ + def rt(root): + return read_rating(root, read_prefixes(root), read_refines(root)) + def st(root, val): + set_rating(root, read_prefixes(root), read_refines(root), val) + return rt(root) + root = self.get_opf('''''') + self.ae(3, rt(root)) + root = self.get_opf('''5''') + self.ae(5, rt(root)) + self.ae(1, st(root,1)) + # }}} + # Run tests {{{ def suite():