Show "More by" on author page
Uses Goodread's list of author's books, filtering out the books that are already in the user's library. Requires the Goodreads dependency and API information.
This commit is contained in:
parent
bd02c92162
commit
a682c95ec1
|
@ -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 %}
|
||||
|
|
26
cps/web.py
26
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
|
||||
|
@ -1167,19 +1172,26 @@ 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:
|
||||
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 = gr_client.GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret)
|
||||
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)
|
||||
else:
|
||||
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
|
||||
return redirect(url_for("index"))
|
||||
title=name, author=author_info, other_books=other_books)
|
||||
|
||||
|
||||
@app.route("/series")
|
||||
|
|
Loading…
Reference in New Issue
Block a user