Implement rating

This commit is contained in:
Kovid Goyal 2016-06-23 15:28:18 +05:30
parent dc9dd9c69b
commit b502499140
2 changed files with 55 additions and 1 deletions

View File

@ -590,6 +590,44 @@ def set_tags(root, prefixes, refines, val):
m.append(c) 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): def read_metadata(root):
ans = Metadata(_('Unknown'), [_('Unknown')]) ans = Metadata(_('Unknown'), [_('Unknown')])
prefixes, refines = read_prefixes(root), read_refines(root) 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.comments = read_comments(root, prefixes, refines) or ans.comments
ans.publisher = read_publisher(root, prefixes, refines) or ans.publisher ans.publisher = read_publisher(root, prefixes, refines) or ans.publisher
ans.tags = read_tags(root, prefixes, refines) or ans.tags ans.tags = read_tags(root, prefixes, refines) or ans.tags
ans.rating = read_rating(root, prefixes, refines) or ans.rating
return ans return ans
def get_metadata(stream): 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_comments(root, prefixes, refines, mi.comments)
set_publisher(root, prefixes, refines, mi.publisher) set_publisher(root, prefixes, refines, mi.publisher)
set_tags(root, prefixes, refines, mi.tags) set_tags(root, prefixes, refines, mi.tags)
set_rating(root, prefixes, refines, mi.rating)
pretty_print_opf(root) pretty_print_opf(root)

View File

@ -16,7 +16,8 @@ from calibre.ebooks.metadata.opf3 import (
read_authors, Author, set_authors, ensure_prefix, read_prefixes, read_authors, Author, set_authors, ensure_prefix, read_prefixes,
read_book_producers, set_book_producers, read_timestamp, set_timestamp, read_book_producers, set_book_producers, read_timestamp, set_timestamp,
read_pubdate, set_pubdate, CALIBRE_PREFIX, read_last_modified, read_comments, 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 = '''<package xmlns="http://www.idpf.org/2007/opf" version="3.0" prefix="calibre: %s" unique-identifier="uid"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">{metadata}</metadata></package>''' % CALIBRE_PREFIX # noqa TEMPLATE = '''<package xmlns="http://www.idpf.org/2007/opf" version="3.0" prefix="calibre: %s" unique-identifier="uid"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">{metadata}</metadata></package>''' % CALIBRE_PREFIX # noqa
@ -206,6 +207,19 @@ class TestOPF3(unittest.TestCase):
self.ae('1,2,3'.split(','), st(root, '1,2,3'.split(','))) 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('''<meta name="calibre:rating" content="3"/>''')
self.ae(3, rt(root))
root = self.get_opf('''<meta name="calibre:rating" content="3"/><meta property="calibre:rating">5</meta>''')
self.ae(5, rt(root))
self.ae(1, st(root,1))
# }}}
# Run tests {{{ # Run tests {{{
def suite(): def suite():