mirror of
https://github.com/janeczku/calibre-web
synced 2025-10-27 05:17:41 +00:00
Merge remote-tracking branch 'opds/opds_improvements'
This commit is contained in:
68
cps/opds.py
68
cps/opds.py
@@ -88,8 +88,8 @@ def feed_letter_books(book_id):
|
|||||||
letter,
|
letter,
|
||||||
[db.Books.sort],
|
[db.Books.sort],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/new")
|
@opds.route("/opds/new")
|
||||||
@@ -101,7 +101,8 @@ def feed_new():
|
|||||||
entries, __, pagination = calibre_db.fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), 0,
|
entries, __, pagination = calibre_db.fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), 0,
|
||||||
db.Books, True, [db.Books.timestamp.desc()],
|
db.Books, True, [db.Books.timestamp.desc()],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/discover")
|
@opds.route("/opds/discover")
|
||||||
@@ -112,7 +113,8 @@ def feed_discover():
|
|||||||
query = calibre_db.generate_linked_query(config.config_read_column, db.Books)
|
query = calibre_db.generate_linked_query(config.config_read_column, db.Books)
|
||||||
entries = query.filter(calibre_db.common_filters()).order_by(func.random()).limit(config.config_books_per_page)
|
entries = query.filter(calibre_db.common_filters()).order_by(func.random()).limit(config.config_books_per_page)
|
||||||
pagination = Pagination(1, config.config_books_per_page, int(config.config_books_per_page))
|
pagination = Pagination(1, config.config_books_per_page, int(config.config_books_per_page))
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/rated")
|
@opds.route("/opds/rated")
|
||||||
@@ -125,7 +127,8 @@ def feed_best_rated():
|
|||||||
db.Books, db.Books.ratings.any(db.Ratings.rating > 9),
|
db.Books, db.Books.ratings.any(db.Ratings.rating > 9),
|
||||||
[db.Books.timestamp.desc()],
|
[db.Books.timestamp.desc()],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/hot")
|
@opds.route("/opds/hot")
|
||||||
@@ -149,7 +152,8 @@ def feed_hot():
|
|||||||
num_books = entries.__len__()
|
num_books = entries.__len__()
|
||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1),
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1),
|
||||||
config.config_books_per_page, num_books)
|
config.config_books_per_page, num_books)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/author")
|
@opds.route("/opds/author")
|
||||||
@@ -174,7 +178,8 @@ def feed_letter_author(book_id):
|
|||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
entries.count())
|
entries.count())
|
||||||
entries = entries.limit(config.config_books_per_page).offset(off).all()
|
entries = entries.limit(config.config_books_per_page).offset(off).all()
|
||||||
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_author', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_author', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/author/<int:book_id>")
|
@opds.route("/opds/author/<int:book_id>")
|
||||||
@@ -197,7 +202,8 @@ def feed_publisherindex():
|
|||||||
.limit(config.config_books_per_page).offset(off)
|
.limit(config.config_books_per_page).offset(off)
|
||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
len(calibre_db.session.query(db.Publishers).all()))
|
len(calibre_db.session.query(db.Publishers).all()))
|
||||||
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_publisher', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_publisher', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/publisher/<int:book_id>")
|
@opds.route("/opds/publisher/<int:book_id>")
|
||||||
@@ -230,7 +236,8 @@ def feed_letter_category(book_id):
|
|||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
entries.count())
|
entries.count())
|
||||||
entries = entries.offset(off).limit(config.config_books_per_page).all()
|
entries = entries.offset(off).limit(config.config_books_per_page).all()
|
||||||
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_category', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_category', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/category/<int:book_id>")
|
@opds.route("/opds/category/<int:book_id>")
|
||||||
@@ -263,7 +270,8 @@ def feed_letter_series(book_id):
|
|||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
entries.count())
|
entries.count())
|
||||||
entries = entries.offset(off).limit(config.config_books_per_page).all()
|
entries = entries.offset(off).limit(config.config_books_per_page).all()
|
||||||
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_series', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=entries, folder='opds.feed_series', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/series/<int:book_id>")
|
@opds.route("/opds/series/<int:book_id>")
|
||||||
@@ -275,7 +283,8 @@ def feed_series(book_id):
|
|||||||
db.Books.series.any(db.Series.id == book_id),
|
db.Books.series.any(db.Series.id == book_id),
|
||||||
[db.Books.series_index],
|
[db.Books.series_index],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/ratings")
|
@opds.route("/opds/ratings")
|
||||||
@@ -297,7 +306,8 @@ def feed_ratingindex():
|
|||||||
element = list()
|
element = list()
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
element.append(FeedObject(entry[0].id, _("{} Stars").format(entry.name)))
|
element.append(FeedObject(entry[0].id, _("{} Stars").format(entry.name)))
|
||||||
return render_xml_template('feed.xml', listelements=element, folder='opds.feed_ratings', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=element, folder='opds.feed_ratings', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/ratings/<book_id>")
|
@opds.route("/opds/ratings/<book_id>")
|
||||||
@@ -321,7 +331,8 @@ def feed_formatindex():
|
|||||||
element = list()
|
element = list()
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
element.append(FeedObject(entry.format, entry.format))
|
element.append(FeedObject(entry.format, entry.format))
|
||||||
return render_xml_template('feed.xml', listelements=element, folder='opds.feed_format', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=element, folder='opds.feed_format', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/formats/<book_id>")
|
@opds.route("/opds/formats/<book_id>")
|
||||||
@@ -333,7 +344,8 @@ def feed_format(book_id):
|
|||||||
db.Books.data.any(db.Data.format == book_id.upper()),
|
db.Books.data.any(db.Data.format == book_id.upper()),
|
||||||
[db.Books.timestamp.desc()],
|
[db.Books.timestamp.desc()],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/language")
|
@opds.route("/opds/language")
|
||||||
@@ -351,7 +363,8 @@ def feed_languagesindex():
|
|||||||
languages[0].name = isoLanguages.get_language_name(get_locale(), languages[0].lang_code)
|
languages[0].name = isoLanguages.get_language_name(get_locale(), languages[0].lang_code)
|
||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
len(languages))
|
len(languages))
|
||||||
return render_xml_template('feed.xml', listelements=languages, folder='opds.feed_languages', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=languages, folder='opds.feed_languages', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/language/<int:book_id>")
|
@opds.route("/opds/language/<int:book_id>")
|
||||||
@@ -363,7 +376,8 @@ def feed_languages(book_id):
|
|||||||
db.Books.languages.any(db.Languages.id == book_id),
|
db.Books.languages.any(db.Languages.id == book_id),
|
||||||
[db.Books.timestamp.desc()],
|
[db.Books.timestamp.desc()],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/shelfindex")
|
@opds.route("/opds/shelfindex")
|
||||||
@@ -377,7 +391,8 @@ def feed_shelfindex():
|
|||||||
number = len(shelf)
|
number = len(shelf)
|
||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
number)
|
number)
|
||||||
return render_xml_template('feed.xml', listelements=shelf, folder='opds.feed_shelf', pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', listelements=shelf, folder='opds.feed_shelf', pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/shelf/<int:book_id>")
|
@opds.route("/opds/shelf/<int:book_id>")
|
||||||
@@ -417,7 +432,8 @@ def feed_shelf(book_id):
|
|||||||
except (OperationalError, InvalidRequestError) as e:
|
except (OperationalError, InvalidRequestError) as e:
|
||||||
ub.session.rollback()
|
ub.session.rollback()
|
||||||
log.error_or_exception("Settings Database error: {}".format(e))
|
log.error_or_exception("Settings Database error: {}".format(e))
|
||||||
return render_xml_template('feed.xml', entries=result, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=result, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/download/<book_id>/<book_format>/")
|
@opds.route("/opds/download/<book_id>/<book_format>/")
|
||||||
@@ -470,7 +486,8 @@ def feed_read_books():
|
|||||||
return abort(403)
|
return abort(403)
|
||||||
off = request.args.get("offset") or 0
|
off = request.args.get("offset") or 0
|
||||||
result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, True, True)
|
result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, True, True)
|
||||||
return render_xml_template('feed.xml', entries=result, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=result, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
@opds.route("/opds/unreadbooks")
|
@opds.route("/opds/unreadbooks")
|
||||||
@@ -480,7 +497,8 @@ def feed_unread_books():
|
|||||||
return abort(403)
|
return abort(403)
|
||||||
off = request.args.get("offset") or 0
|
off = request.args.get("offset") or 0
|
||||||
result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, False, True)
|
result, pagination = render_read_books(int(off) / (int(config.config_books_per_page)) + 1, False, True)
|
||||||
return render_xml_template('feed.xml', entries=result, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=result, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
class FeedObject:
|
class FeedObject:
|
||||||
@@ -502,7 +520,8 @@ def feed_search(term):
|
|||||||
entries, __, ___ = calibre_db.get_search_results(term, config=config)
|
entries, __, ___ = calibre_db.get_search_results(term, config=config)
|
||||||
entries_count = len(entries) if len(entries) > 0 else 1
|
entries_count = len(entries) if len(entries) > 0 else 1
|
||||||
pagination = Pagination(1, entries_count, entries_count)
|
pagination = Pagination(1, entries_count, entries_count)
|
||||||
return render_xml_template('feed.xml', searchterm=term, entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', searchterm=term, entries=entries, pagination=pagination, cc=cc)
|
||||||
else:
|
else:
|
||||||
return render_xml_template('feed.xml', searchterm="")
|
return render_xml_template('feed.xml', searchterm="")
|
||||||
|
|
||||||
@@ -524,7 +543,8 @@ def render_xml_dataset(data_table, book_id):
|
|||||||
getattr(db.Books, data_table.__tablename__).any(data_table.id == book_id),
|
getattr(db.Books, data_table.__tablename__).any(data_table.id == book_id),
|
||||||
[db.Books.timestamp.desc()],
|
[db.Books.timestamp.desc()],
|
||||||
True, config.config_read_column)
|
True, config.config_read_column)
|
||||||
return render_xml_template('feed.xml', entries=entries, pagination=pagination)
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
|
return render_xml_template('feed.xml', entries=entries, pagination=pagination, cc=cc)
|
||||||
|
|
||||||
|
|
||||||
def render_element_index(database_column, linked_table, folder):
|
def render_element_index(database_column, linked_table, folder):
|
||||||
@@ -545,7 +565,9 @@ def render_element_index(database_column, linked_table, folder):
|
|||||||
elements.append({'id': entry.id, 'name': entry.id})
|
elements.append({'id': entry.id, 'name': entry.id})
|
||||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page,
|
||||||
len(entries) + 1)
|
len(entries) + 1)
|
||||||
|
cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True)
|
||||||
return render_xml_template('feed.xml',
|
return render_xml_template('feed.xml',
|
||||||
letterelements=elements,
|
letterelements=elements,
|
||||||
folder=folder,
|
folder=folder,
|
||||||
pagination=pagination)
|
pagination=pagination,
|
||||||
|
cc=cc)
|
||||||
|
|||||||
@@ -63,7 +63,57 @@
|
|||||||
term="{{tag.name}}"
|
term="{{tag.name}}"
|
||||||
label="{{tag.name}}"/>
|
label="{{tag.name}}"/>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if entry.Books.comments[0] %}<summary>{{entry.Books.comments[0].text|striptags}}</summary>{% endif %}
|
<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
{% if entry.Books.ratings.__len__() > 0 %}
|
||||||
|
RATING: {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %}★{% endfor %}<br/>
|
||||||
|
{% endif %}
|
||||||
|
{% if entry.Books.tags|length > 0 %}
|
||||||
|
TAGS: {% for tag in entry.Books.tags %}{{tag.name}}{{ ", " if not loop.last else "" }}{% endfor %}<br/>
|
||||||
|
{% endif %}
|
||||||
|
{% if entry.Books.series.__len__() > 0 %}
|
||||||
|
SERIES: {{entry.Books.series[0].name}} [{{entry.Books.series_index|formatfloat(2)}}]<br/>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if cc|length > 0 %}
|
||||||
|
{% for c in cc %}
|
||||||
|
{% if entry.Books['custom_column_' ~ c.id]|length > 0 %}
|
||||||
|
{{ c.name }}:
|
||||||
|
{% for column in entry.Books['custom_column_' ~ c.id] %}
|
||||||
|
{% if c.datatype == 'rating' %}
|
||||||
|
{{ (column.value / 2)|formatfloat }}
|
||||||
|
{% else %}
|
||||||
|
{% if c.datatype == 'bool' %}
|
||||||
|
{% if column.value == true %}
|
||||||
|
✓
|
||||||
|
{% else %}
|
||||||
|
✕
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if c.datatype == 'float' %}
|
||||||
|
{{ column.value|formatfloat(2) }}
|
||||||
|
{% elif c.datatype == 'datetime' %}
|
||||||
|
{{ column.value|formatdate }}
|
||||||
|
{% elif c.datatype == 'comments' %}
|
||||||
|
{{ column.value|safe }}
|
||||||
|
{% elif c.datatype == 'series' %}
|
||||||
|
{{ '%s [%s]' % (column.value, column.extra|formatfloat(2)) }}
|
||||||
|
{% elif c.datatype == 'text' %}
|
||||||
|
{{ column.value.strip() }}{% if not loop.last %}, {% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ column.value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
<br/>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if entry.Books.comments[0] %}
|
||||||
|
<p>{{entry.Books.comments[0].text}}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div></content>
|
||||||
{% if entry.Books.has_cover %}
|
{% if entry.Books.has_cover %}
|
||||||
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.Books.id)}}" rel="http://opds-spec.org/image"/>
|
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.Books.id)}}" rel="http://opds-spec.org/image"/>
|
||||||
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.Books.id)}}" rel="http://opds-spec.org/image/thumbnail"/>
|
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.Books.id)}}" rel="http://opds-spec.org/image/thumbnail"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user