From 4cf4c4dfe668b2452e649da422d9ad28d3a8cc33 Mon Sep 17 00:00:00 2001 From: cjwin2000 Date: Fri, 10 Jan 2025 20:14:17 -0500 Subject: [PATCH 01/28] Update config_sql.py --- cps/config_sql.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cps/config_sql.py b/cps/config_sql.py index 7e7d033d1..1c816f277 100644 --- a/cps/config_sql.py +++ b/cps/config_sql.py @@ -117,6 +117,7 @@ class _Settings(_Base): config_use_goodreads = Column(Boolean, default=False) config_goodreads_api_key = Column(String) + config_googlebooks_api_key = Column(String, default='') config_register_email = Column(Boolean, default=False) config_login_type = Column(Integer, default=0) From 7e248909919d7a2f0fa1ddc87f3ce31ea281b520 Mon Sep 17 00:00:00 2001 From: cjwin2000 Date: Fri, 10 Jan 2025 20:20:08 -0500 Subject: [PATCH 02/28] Update admin.py --- cps/admin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cps/admin.py b/cps/admin.py index 71403e6c3..88f80f106 100644 --- a/cps/admin.py +++ b/cps/admin.py @@ -1833,6 +1833,9 @@ def _configuration_update_helper(): services.goodreads_support.connect(config.config_goodreads_api_key, config.config_use_goodreads) + # Google Books API configuration + _config_string(to_save, "config_googlebooks_api_key") + _config_int(to_save, "config_updatechannel") # Reverse proxy login configuration From bf31e675db16ba109306a8ff84af51f5062f57e6 Mon Sep 17 00:00:00 2001 From: cjwin2000 Date: Fri, 10 Jan 2025 20:28:09 -0500 Subject: [PATCH 03/28] Update config_edit.html --- cps/templates/config_edit.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cps/templates/config_edit.html b/cps/templates/config_edit.html index 4018db2e9..ab8448b6c 100644 --- a/cps/templates/config_edit.html +++ b/cps/templates/config_edit.html @@ -163,6 +163,10 @@ {% endif %} +
+ + +
From dbf104787cc444845eb01e86170c268702fbcfb6 Mon Sep 17 00:00:00 2001 From: cjwin2000 Date: Fri, 10 Jan 2025 20:31:17 -0500 Subject: [PATCH 04/28] Update google.py --- cps/metadata_provider/google.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cps/metadata_provider/google.py b/cps/metadata_provider/google.py index df9c0dc24..63a0a9519 100644 --- a/cps/metadata_provider/google.py +++ b/cps/metadata_provider/google.py @@ -23,7 +23,7 @@ from datetime import datetime import requests -from cps import logger +from cps import logger, config from cps.isoLanguages import get_lang3, get_language_name from cps.services.Metadata import MetaRecord, MetaSourceInfo, Metadata @@ -38,6 +38,7 @@ class Google(Metadata): BOOK_URL = "https://books.google.com/books?id=" SEARCH_URL = "https://www.googleapis.com/books/v1/volumes?q=" ISBN_TYPE = "ISBN_13" + API_KEY = "&key=" + config.config_googlebooks_api_key def search( self, query: str, generic_cover: str = "", locale: str = "en" @@ -50,7 +51,7 @@ class Google(Metadata): tokens = [quote(t.encode("utf-8")) for t in title_tokens] query = "+".join(tokens) try: - results = requests.get(Google.SEARCH_URL + query) + results = requests.get(Google.SEARCH_URL + query + Google.API_KEY) results.raise_for_status() except Exception as e: log.warning(e) From 7418c2c0b47208327b33e7a249a15cf2c24b3ed8 Mon Sep 17 00:00:00 2001 From: Peter Kraus Date: Fri, 15 Aug 2025 15:39:07 +0200 Subject: [PATCH 05/28] Update messages.po Dutch translations almost completely finished --- cps/translations/nl/LC_MESSAGES/messages.po | 40 ++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index bc0ab9fb2..874aba5fd 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -456,7 +456,7 @@ msgstr "{} Gebruiker succesvol geïmporteerd" #: cps/admin.py:1734 msgid "Books path not valid" -msgstr "" +msgstr "Boekpad is ongeldig" #: cps/admin.py:1740 msgid "DB Location is not Valid, Please Enter Correct Path" @@ -848,11 +848,11 @@ msgstr "Fout bij het uitvoeren van UnRar" #: cps/helper.py:1025 msgid "Could not find the specified directory" -msgstr "" +msgstr "Opgegeven map kon niet worden gevonden" #: cps/helper.py:1028 msgid "Please specify a directory, not a file" -msgstr "" +msgstr "Geef een map op, geen bestand" #: cps/helper.py:1042 #, fuzzy @@ -862,7 +862,7 @@ msgstr "Kan niet schrijven naar database" #: cps/helper.py:1051 #, python-format msgid "Missing calibre binaries: %(missing)s" -msgstr "" +msgstr "Ontbrekende calibre-programmabestanden: %(missing)s" #: cps/helper.py:1053 #, fuzzy, python-format @@ -1171,7 +1171,7 @@ msgstr "Dit boek maakt al deel uit van boekenplank: %(shelfname)s" #: cps/shelf.py:77 #, python-format msgid "%(book_id)s is a invalid Book Id. Could not be added to Shelf" -msgstr "" +msgstr "%(book_id)s is geen geldig Boek Id. Niet kunnen toevoegen aan boekenplank" #: cps/shelf.py:97 #, python-format @@ -1514,7 +1514,7 @@ msgstr "Geen geldig gmail.json bestand gevonden met OAuth informatie" #: cps/tasks/clean.py:29 msgid "Delete temp folder contents" -msgstr "" +msgstr "Inhoud van tijdelijke map verwijderen" #: cps/tasks/convert.py:112 #, fuzzy, python-format @@ -1962,7 +1962,7 @@ msgstr "Afmelden" #: cps/templates/basic_layout.html:35 msgid "Normal Theme" -msgstr "" +msgstr "Standaard Thema" #: cps/templates/book_edit.html:11 msgid "Delete Book" @@ -2256,7 +2256,7 @@ msgstr "Locatie van de Calibre-database" #: cps/templates/config_db.html:21 msgid "Separate Book Files from Library" -msgstr "" +msgstr "Scheid boekbestanden van de bibliotheek" #: cps/templates/config_db.html:34 msgid "Use Google Drive?" @@ -2341,7 +2341,7 @@ msgstr "Zet niet Engelse tekens in titel en auteur om tijdens het opslaan" #: cps/templates/config_edit.html:108 msgid "Embed Metadata to Ebook File on Download/Conversion/e-mail (needs Calibre/Kepubify binaries)" -msgstr "" +msgstr "Metadata insluiten in e-boekbestand bij downloaden/conversie/e-mail (Calibre/Kepubify bestanden/binaries benodigd)" #: cps/templates/config_edit.html:112 msgid "Enable Uploads" @@ -2559,15 +2559,15 @@ msgstr "Beperk aantal mislukte inlogpogingen" #: cps/templates/config_edit.html:372 msgid "Configure Backend for Limiter" -msgstr "" +msgstr "Configureer email server" #: cps/templates/config_edit.html:376 msgid "Options for Limiter Backend" -msgstr "" +msgstr "Opties voor email server" #: cps/templates/config_edit.html:382 msgid "Check if file extensions matches file content on upload" -msgstr "" +msgstr "Controleer bij upload of de bestandsextensie overeenkomt met bestandstype" #: cps/templates/config_edit.html:385 msgid "Session protection" @@ -2604,7 +2604,7 @@ msgstr "Forceer hoofdletter" #: cps/templates/config_edit.html:414 msgid "Enforce characters (needed For Chinese/Japanese/Korean Characters)" -msgstr "" +msgstr "Forceer tekens (vereist voor Chinese/Japanse/Koreaanse tekens)" #: cps/templates/config_edit.html:418 msgid "Enforce special characters" @@ -2748,7 +2748,7 @@ msgstr "Toevoegen aan archief" #: cps/templates/detail.html:275 msgid "Mark Book as archived or not, to hide it in Calibre-Web and delete it from Kobo Reader" -msgstr "" +msgstr "Markeer het boek als gearchiveerd of niet. Om het te verbergen in Calibre-Web en van de Kobo Reader te verwijderen" #: cps/templates/detail.html:275 #, fuzzy @@ -3162,7 +3162,7 @@ msgstr "Lettertypegrootte" #: cps/templates/read.html:105 msgid "Font" -msgstr "" +msgstr "Lettertype" #: cps/templates/read.html:106 #, fuzzy @@ -3194,7 +3194,7 @@ msgstr "Gelezen" #: cps/templates/read.html:114 msgid "Two columns" -msgstr "" +msgstr "Twee kolommen" #: cps/templates/read.html:115 #, fuzzy @@ -3400,11 +3400,11 @@ msgstr "Publicatiedatum tot" #: cps/templates/search_form.html:44 cps/templates/search_form.html:165 msgid "Any" -msgstr "" +msgstr "Elk(e)" #: cps/templates/search_form.html:45 cps/templates/search_form.html:166 msgid "Empty" -msgstr "" +msgstr "Leeg" #: cps/templates/search_form.html:60 msgid "Exclude Tags" @@ -3521,7 +3521,7 @@ msgstr "Systeeminformatie" #: cps/templates/stats.html:33 msgid "Program" -msgstr "" +msgstr "Programma" #: cps/templates/stats.html:34 msgid "Installed Version" @@ -3570,7 +3570,7 @@ msgstr "Gebruikerswachtwoord herstellen" #: cps/templates/user_edit.html:28 msgid "Send to eReader Email Address. Use comma to separate emails for multiple eReaders" -msgstr "" +msgstr "Stuur naar het eReader email adres. meerdere email met een komma scheiden voor meerdere eReaders" #: cps/templates/user_edit.html:43 msgid "Language of Books" From 3a899afcce8530fb368ad1597386ca4f282052d4 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Fri, 15 Aug 2025 11:10:14 -0400 Subject: [PATCH 06/28] 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 6dea544a2..e8a405116 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 eed76051f..0bb9a3c6c 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 07/28] 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 0bb9a3c6c..d3d4e1067 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 08/28] 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 d3d4e1067..64be917b3 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 %} From b632f1b9a2a8ebc42e4549f81e9eb16685edb6f3 Mon Sep 17 00:00:00 2001 From: rjaakke <11254908+rjaakke@users.noreply.github.com> Date: Mon, 18 Aug 2025 20:31:31 +0200 Subject: [PATCH 09/28] Update get_filtered_book call to include archived books. --- cps/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/helper.py b/cps/helper.py index 8fa9bbac9..7d38866cf 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -329,7 +329,7 @@ def edit_book_read_status(book_id, read_status=None): else: try: calibre_db.create_functions(config) - book = calibre_db.get_filtered_book(book_id) + book = calibre_db.get_filtered_book(book_id, True) book_read_status = getattr(book, 'custom_column_' + str(config.config_read_column)) if len(book_read_status): if read_status is None: From 9e7efb187bb73c1aa750adc7ec6be4dc9303aa2d Mon Sep 17 00:00:00 2001 From: Hot Garbage <97412179+HotGarbo@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:15:06 -0700 Subject: [PATCH 10/28] kobo: add Instapaper config Latest firmware version writes empty values for Instapaper parameters if missing from the /initialization response. Add default values to `NATIVE_KOBO_RESOURCES` --- cps/kobo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cps/kobo.py b/cps/kobo.py index 1a8dd9137..fabd05059 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -1201,6 +1201,9 @@ def NATIVE_KOBO_RESOURCES(): "image_host": "//cdn.kobo.com/book-images/", "image_url_quality_template": "https://cdn.kobo.com/book-images/{ImageId}/{Width}/{Height}/{Quality}/{IsGreyscale}/image.jpg", "image_url_template": "https://cdn.kobo.com/book-images/{ImageId}/{Width}/{Height}/false/image.jpg", + "instapaper_enabled": "True", + "instapaper_env_url": "https://www.instapaper.com/api/kobo", + "instapaper_link_account_start": "https://authorize.kobo.com/{region}/{language}/linkinstapaper", "kobo_audiobooks_credit_redemption": "False", "kobo_audiobooks_enabled": "True", "kobo_audiobooks_orange_deal_enabled": "False", From 714c19f55885228aad2dc742ecd2e3bf8ae802a3 Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Mon, 8 Sep 2025 17:31:43 +0200 Subject: [PATCH 11/28] Some code cosmetics --- cps/services/worker.py | 2 +- .../js/reading/locationchange-polyfill.js | 21 ------------------- cps/templates/layout.html | 3 +-- cps/templates/read.html | 1 - 4 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 cps/static/js/reading/locationchange-polyfill.js diff --git a/cps/services/worker.py b/cps/services/worker.py index a804f633b..2a0809cab 100644 --- a/cps/services/worker.py +++ b/cps/services/worker.py @@ -235,7 +235,7 @@ class CalibreTask: @property def dead(self): - """Determines whether this task can be garbage collected + """Determines whether or not this task can be garbage collected We have a separate dictating this because there may be certain tasks that want to override this """ diff --git a/cps/static/js/reading/locationchange-polyfill.js b/cps/static/js/reading/locationchange-polyfill.js deleted file mode 100644 index 4845ea846..000000000 --- a/cps/static/js/reading/locationchange-polyfill.js +++ /dev/null @@ -1,21 +0,0 @@ -// register new event emitter locationchange that fires on urlchange -// source: https://stackoverflow.com/a/52809105/21941129 -(() => { - let oldPushState = history.pushState; - history.pushState = function pushState() { - let ret = oldPushState.apply(this, arguments); - window.dispatchEvent(new Event('locationchange')); - return ret; - }; - - let oldReplaceState = history.replaceState; - history.replaceState = function replaceState() { - let ret = oldReplaceState.apply(this, arguments); - window.dispatchEvent(new Event('locationchange')); - return ret; - }; - - window.addEventListener('popstate', () => { - window.dispatchEvent(new Event('locationchange')); - }); -})(); diff --git a/cps/templates/layout.html b/cps/templates/layout.html index d433a5aaa..75d123676 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -41,8 +41,7 @@
{% endif %} {% if current_user.is_authenticated or g.allow_anonymous %} - -