From 3a899afcce8530fb368ad1597386ca4f282052d4 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 15 Aug 2025 11:10:14 -0400 Subject: [PATCH 1/3] Opds Improvements --- cps/opds.py | 68 ++++++++++++++++++++++++++++-------------- cps/templates/feed.xml | 61 ++++++++++++++++++++++++++++++++++++- 2 files changed, 105 insertions(+), 24 deletions(-) diff --git a/cps/opds.py b/cps/opds.py index 6dea544a..e8a40511 100644 --- a/cps/opds.py +++ b/cps/opds.py @@ -88,8 +88,8 @@ def feed_letter_books(book_id): letter, [db.Books.sort], 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/new") @@ -101,7 +101,8 @@ def feed_new(): entries, __, pagination = calibre_db.fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), 0, db.Books, True, [db.Books.timestamp.desc()], 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") @@ -112,7 +113,8 @@ def feed_discover(): 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) 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") @@ -125,7 +127,8 @@ def feed_best_rated(): db.Books, db.Books.ratings.any(db.Ratings.rating > 9), [db.Books.timestamp.desc()], 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") @@ -149,7 +152,8 @@ def feed_hot(): num_books = entries.__len__() pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), 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") @@ -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, entries.count()) 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/") @@ -197,7 +202,8 @@ def feed_publisherindex(): .limit(config.config_books_per_page).offset(off) pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, 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/") @@ -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, entries.count()) 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/") @@ -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, entries.count()) 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/") @@ -275,7 +283,8 @@ def feed_series(book_id): db.Books.series.any(db.Series.id == book_id), [db.Books.series_index], 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") @@ -297,7 +306,8 @@ def feed_ratingindex(): element = list() for entry in entries: 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/") @@ -321,7 +331,8 @@ def feed_formatindex(): element = list() for entry in entries: 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/") @@ -333,7 +344,8 @@ def feed_format(book_id): db.Books.data.any(db.Data.format == book_id.upper()), [db.Books.timestamp.desc()], 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") @@ -351,7 +363,8 @@ def feed_languagesindex(): 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, 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/") @@ -363,7 +376,8 @@ def feed_languages(book_id): db.Books.languages.any(db.Languages.id == book_id), [db.Books.timestamp.desc()], 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") @@ -377,7 +391,8 @@ def feed_shelfindex(): number = len(shelf) pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, 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/") @@ -417,7 +432,8 @@ def feed_shelf(book_id): except (OperationalError, InvalidRequestError) as e: ub.session.rollback() 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///") @@ -470,7 +486,8 @@ def feed_read_books(): return abort(403) off = request.args.get("offset") or 0 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") @@ -480,7 +497,8 @@ def feed_unread_books(): return abort(403) off = request.args.get("offset") or 0 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: @@ -502,7 +520,8 @@ def feed_search(term): entries, __, ___ = calibre_db.get_search_results(term, config=config) entries_count = len(entries) if len(entries) > 0 else 1 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: 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), [db.Books.timestamp.desc()], 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): @@ -545,7 +565,9 @@ def render_element_index(database_column, linked_table, folder): elements.append({'id': entry.id, 'name': entry.id}) pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, len(entries) + 1) + cc = calibre_db.get_cc_columns(config, filter_config_custom_read=True) return render_xml_template('feed.xml', letterelements=elements, folder=folder, - pagination=pagination) + pagination=pagination, + cc=cc) diff --git a/cps/templates/feed.xml b/cps/templates/feed.xml index eed76051..0bb9a3c6 100644 --- a/cps/templates/feed.xml +++ b/cps/templates/feed.xml @@ -63,7 +63,66 @@ term="{{tag.name}}" label="{{tag.name}}"/> {% endfor %} - {% if entry.Books.comments[0] %}{{entry.Books.comments[0].text|striptags}}{% endif %} + + {% if entry.Books.tags|length > 0 %} + TAGS: {% for tag in entry.Books.tags %}{{tag.name}}{{ ", " if not loop.last else "" }}{% endfor %} + + {% endif %} + {% if entry.Books.series.__len__() > 0 %} + SERIES: {{entry.Books.series[0].name}} [{{entry.Books.series_index|formatfloat(2)}}] + + {% endif %} + {% if entry.Books.ratings.__len__() > 0 %} + RATING: {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} + ★ + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + ★ + {% endfor %} + {% endif %} + {% endfor %} + + {% 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 %} + + {% endif %} + {% endfor %} + {% endif %} + + {% if entry.Books.comments[0] %} + {{entry.Books.comments[0].text|striptags}} + {% endif %} + {% if entry.Books.has_cover %} From 5cd914f007d12886829f169549de0b8268c885fd Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 15 Aug 2025 11:41:38 -0400 Subject: [PATCH 2/3] Fix newlines --- cps/templates/feed.xml | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/cps/templates/feed.xml b/cps/templates/feed.xml index 0bb9a3c6..d3d4e106 100644 --- a/cps/templates/feed.xml +++ b/cps/templates/feed.xml @@ -63,26 +63,25 @@ term="{{tag.name}}" label="{{tag.name}}"/> {% endfor %} - +
+ {% if entry.Books.ratings.__len__() > 0 %} + RATING: + {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} + ★ + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + ★ + {% endfor %} + {% endif %} + {% endfor %}
+ {% endif %} {% if entry.Books.tags|length > 0 %} - TAGS: {% for tag in entry.Books.tags %}{{tag.name}}{{ ", " if not loop.last else "" }}{% endfor %} - + TAGS: {% for tag in entry.Books.tags %}{{tag.name}}{{ ", " if not loop.last else "" }}{% endfor %}
{% endif %} {% if entry.Books.series.__len__() > 0 %} - SERIES: {{entry.Books.series[0].name}} [{{entry.Books.series_index|formatfloat(2)}}] - - {% endif %} - {% if entry.Books.ratings.__len__() > 0 %} - RATING: {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} - ★ - {% if loop.last and loop.index < 5 %} - {% for numer in range(5 - loop.index) %} - ★ - {% endfor %} - {% endif %} - {% endfor %} - + SERIES: {{entry.Books.series[0].name}} [{{entry.Books.series_index|formatfloat(2)}}]
{% endif %} + {% if cc|length > 0 %} {% for c in cc %} {% if entry.Books['custom_column_' ~ c.id]|length > 0 %} @@ -114,15 +113,15 @@ {% endif %} {% endif %} {% endfor %} - +
{% endif %} {% endfor %} {% endif %} - + {% if entry.Books.comments[0] %} - {{entry.Books.comments[0].text|striptags}} +

{{entry.Books.comments[0].text|striptags}}

{% endif %} -
+ {% if entry.Books.has_cover %} From 9aab6d90f7ebfef9410f2f5fd71361f2c51710d2 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 15 Aug 2025 11:51:14 -0400 Subject: [PATCH 3/3] Keep tags since its now in html --- cps/templates/feed.xml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/cps/templates/feed.xml b/cps/templates/feed.xml index d3d4e106..64be917b 100644 --- a/cps/templates/feed.xml +++ b/cps/templates/feed.xml @@ -65,15 +65,13 @@ {% endfor %}
{% if entry.Books.ratings.__len__() > 0 %} - RATING: - {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} - ★ - {% if loop.last and loop.index < 5 %} - {% for numer in range(5 - loop.index) %} - ★ - {% endfor %} - {% endif %} - {% endfor %}
+ RATING: {% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} + ★{% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + ★ + {% endfor %} + {% endif %} + {% endfor %}
{% endif %} {% if entry.Books.tags|length > 0 %} TAGS: {% for tag in entry.Books.tags %}{{tag.name}}{{ ", " if not loop.last else "" }}{% endfor %}
@@ -119,7 +117,7 @@ {% endif %} {% if entry.Books.comments[0] %} -

{{entry.Books.comments[0].text|striptags}}

+

{{entry.Books.comments[0].text}}

{% endif %}
{% if entry.Books.has_cover %}