Merge remote-tracking branch 'adv/goodreads-more-by'
This commit is contained in:
commit
d5e1dba0fe
|
@ -77,7 +77,8 @@ input.pill:not(:checked) + label .glyphicon {
|
|||
}
|
||||
|
||||
.author-bio img {margin: 0 1em 1em 0;}
|
||||
.author-link img {display: inline-block;max-width: 100px;}
|
||||
.author-link {display: inline-block; margin-top: 10px; width: 100px;}
|
||||
.author-link img {display: block; height: 100%;}
|
||||
|
||||
#remove-from-shelves .btn,
|
||||
#shelf-action-errors {
|
||||
|
|
|
@ -11,16 +11,15 @@
|
|||
{%if author.about is not none %}
|
||||
<p>{{author.about|safe}}</p>
|
||||
{% endif %}
|
||||
</section>
|
||||
|
||||
<a href="{{author.link}}" class="author-link" target="_blank">
|
||||
<img src="{{ url_for('static', filename='img/goodreads.svg') }}" alt="Goodreads">
|
||||
</a>
|
||||
- {{_("via")}} <a href="{{author.link}}" class="author-link" target="_blank" rel="noopener">Goodreads</a>
|
||||
</section>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
{% endif %}
|
||||
|
||||
<div class="discover load-more">
|
||||
<h3>{{_("In Library")}}</h3>
|
||||
<div class="row">
|
||||
{% if entries[0] %}
|
||||
{% for entry in entries %}
|
||||
|
@ -62,4 +61,48 @@
|
|||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if other_books is not none %}
|
||||
<div class="discover">
|
||||
<h3>{{_("More by")}} {{ author.name|safe }}</h3>
|
||||
<div class="row">
|
||||
{% for entry in other_books %}
|
||||
<div class="col-sm-3 col-lg-2 col-xs-6 book">
|
||||
<div class="cover">
|
||||
<a href="https://www.goodreads.com/book/show/{{ entry.gid['#text'] }}" target="_blank" rel="noopener">
|
||||
<img src="{{ entry.image_url }}" />
|
||||
</a>
|
||||
</div>
|
||||
<div class="meta">
|
||||
<p class="title">{{entry.title|shortentitle}}</p>
|
||||
<p class="author">
|
||||
{% for author in entry.authors %}
|
||||
<a href="https://www.goodreads.com/author/show/{{ author.gid }}" target="_blank" rel="noopener">
|
||||
{{author.name}}
|
||||
</a>
|
||||
{% if not loop.last %}
|
||||
&
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</p>
|
||||
<div class="rating">
|
||||
{% for number in range((entry.average_rating)|float|round|int(2)) %}
|
||||
<span class="glyphicon glyphicon-star good"></span>
|
||||
{% if loop.last and loop.index < 5 %}
|
||||
{% for numer in range(5 - loop.index) %}
|
||||
<span class="glyphicon glyphicon-star"></span>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<a href="{{author.link}}" class="author-link" target="_blank" rel="noopener">
|
||||
<img src="{{ url_for('static', filename='img/goodreads.svg') }}" alt="Goodreads">
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
36
cps/web.py
36
cps/web.py
|
@ -8,11 +8,16 @@ except ImportError:
|
|||
gdrive_support = False
|
||||
|
||||
try:
|
||||
from goodreads import client as gr_client
|
||||
from goodreads.client import GoodreadsClient
|
||||
goodreads_support = True
|
||||
except ImportError:
|
||||
goodreads_support = False
|
||||
|
||||
try:
|
||||
from functools import reduce
|
||||
except ImportError:
|
||||
pass # We're not using Python 3
|
||||
|
||||
import mimetypes
|
||||
import logging
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
@ -1169,20 +1174,27 @@ def author_list():
|
|||
def author(book_id, page):
|
||||
entries, random, pagination = fill_indexpage(page, db.Books, db.Books.authors.any(db.Authors.id == book_id),
|
||||
db.Books.timestamp.desc())
|
||||
if entries:
|
||||
name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name
|
||||
|
||||
author_info = None
|
||||
if goodreads_support and config.config_use_goodreads:
|
||||
gc = gr_client.GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret)
|
||||
author_info = gc.find_author(author_name=name)
|
||||
|
||||
return render_title_template('author.html', entries=entries, pagination=pagination,
|
||||
title=name, author=author_info)
|
||||
else:
|
||||
if entries is None:
|
||||
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
|
||||
return redirect(url_for("index"))
|
||||
|
||||
name = db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name
|
||||
|
||||
author_info = None
|
||||
other_books = None
|
||||
if goodreads_support and config.config_use_goodreads:
|
||||
gc = GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret)
|
||||
author_info = gc.find_author(author_name=name)
|
||||
|
||||
# Get all identifiers (ISBN, Goodreads, etc) and filter author's books by that list so we show fewer duplicates
|
||||
# Note: Not all images will be shown, even though they're available on Goodreads.com.
|
||||
# See https://www.goodreads.com/topic/show/18213769-goodreads-book-images
|
||||
identifiers = reduce(lambda acc, book: acc + map(lambda identifier: identifier.val, book.identifiers), entries.all(), [])
|
||||
other_books = filter(lambda book: book.isbn not in identifiers and book.gid["#text"] not in identifiers, author_info.books)
|
||||
|
||||
return render_title_template('author.html', entries=entries, pagination=pagination,
|
||||
title=name, author=author_info, other_books=other_books)
|
||||
|
||||
|
||||
@app.route("/series")
|
||||
@login_required_if_no_ano
|
||||
|
|
Loading…
Reference in New Issue
Block a user