From d77a92cb829925110f7fada1da4ddc9e40f581fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Fri, 17 Oct 2025 15:03:24 +0200 Subject: [PATCH 1/5] docs: copy-paste mishaps in README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ead8668..88dba43 100644 --- a/README.md +++ b/README.md @@ -53,14 +53,13 @@ The now read articles can (surprisingly) be found in the trash. After marking an #### Reading read articles -If you want to re-read your favorites articles directly in the Feather reader director, you can configure Feather to write articles files for read articles too: +If you want to re-read your favorites articles directly in the Feather reader directory, you can configure Feather to write articles files for read articles too: ```toml -# Write article HTML files for read articles [html] +# Write article HTML files for read articles write_read_articles = true # Add a checkmark in the article filename indicating the read status -[html] filename_template = "{% if unread %}☐{% else %}☑{% endif %} [{{ feed_title }}]\t{{ title }} ({{ published }}).html" ``` @@ -73,8 +72,8 @@ Note that this also change the mark-as-unread behavior: since it is no longer po By default, Feather will only grab unread articles from the server, so the read articles you have access to locally are only the articles kept for the 3 days grace period after marking them as read (see the [handling read articles chapter](#handling-read-articles)). If you want to have access to _all_ articles from the server, you can add to your configuration: ```toml -# Grab both read and unread articles from the server [server] +# Grab both read and unread articles from the server only_sync_unread_articles = false ``` From 0db9881d092e271962a89cadbf42d93bac7c7fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Sat, 18 Oct 2025 15:39:28 +0200 Subject: [PATCH 2/5] fix: mark-as-read articles that were read on the server when only_sync_unread_articles = true --- src/feather/app.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/feather/app.py b/src/feather/app.py index 3ef5697..22cde0a 100755 --- a/src/feather/app.py +++ b/src/feather/app.py @@ -160,20 +160,26 @@ class FeatherApp: article.write() updated_articles += 1 - # Remove articles that we didn't get from the server but are in the JSON directory + # Remove or mark-as-read articles that we didn't get from the server but are in the JSON directory removed_articles = 0 article_cutoff_timestamp = ( datetime.now().timestamp() - config.keep_read_articles_for ) for article in self.iter_articles(): - if ( - # we sync all articles: remove all articles that aren't on the server - not config.only_sync_unread_articles - # we only sync unread: only remove articles that are too old - or article.last_write < article_cutoff_timestamp - ) and article.id not in grabbed_article_paths: - article.delete() - removed_articles += 1 + if article.id not in grabbed_article_paths: + # we only sync unread: articles we didn't get from the server were read or purged + if config.only_sync_unread_articles: + if article.last_write < article_cutoff_timestamp: + article.delete() + removed_articles += 1 + elif article.unread: + article.unread = False + article.regenerate() + updated_articles += 1 + # we sync all articles: articles we didn't get from the server were purged + else: + article.delete() + removed_articles += 1 print( f"Synchronization successful ({new_articles} new articles, {updated_articles} updated, {removed_articles} removed)" From 595be10876be35adf5d744121bacb23670a3efdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Sat, 18 Oct 2025 15:55:19 +0200 Subject: [PATCH 3/5] feat: bump version to v1.1.1 --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e79f8f0..ad7c326 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "feather" -version = "1.1.0" +version = "1.1.1" authors = [ { name = 'Étienne "Reuh" Fildadut' } ] description = "file-based RSS reader client" readme = "README.md" diff --git a/uv.lock b/uv.lock index a68fce4..3e036bc 100644 --- a/uv.lock +++ b/uv.lock @@ -69,7 +69,7 @@ wheels = [ [[package]] name = "feather" -version = "1.1.0" +version = "1.1.1" source = { editable = "." } dependencies = [ { name = "google-reader" }, From 0cf1bc5003fcf594c4e0bf4b7c10b90e0939861b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Sat, 18 Oct 2025 19:08:05 +0200 Subject: [PATCH 4/5] docs: missing env var names in configuration documentation --- src/feather/config.default.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/feather/config.default.toml b/src/feather/config.default.toml index 1b12c4a..5487dd4 100644 --- a/src/feather/config.default.toml +++ b/src/feather/config.default.toml @@ -6,6 +6,7 @@ [server] # (Required) Server API to use. Either "googlereader" for the Google Reader API (FreshRSS, Miniflux, etc.) or "ttrss" for the TinyTiny-RSS API. # The Google Reader API do not support nested categories. +# Can be set through the environment variable SERVER_API. api = "googlereader" # (Required) URL of your server's Google Reader API endpoint # Can be set through the environment variable SERVER_URL. @@ -138,6 +139,7 @@ hide_empty_categories = true # Can be set through the environment variable HTML_MAX_FILENAME_LENGTH. max_filename_length = 250 # Table mapping characters to what they will be replaced with in filenames. Useful to remove/replace characters that are not allowed in filename by your filesystem. The default should be fine for most Unix filesystems. +# Can not be set through environment variables, sorry! filename_replacement = { "/" = "⧸", "\u0000" = "" } [datetime] From 13d82f991374bc2bf75c85d79cc97bce1e3cc8b7 Mon Sep 17 00:00:00 2001 From: Reuh Date: Sat, 25 Oct 2025 12:15:43 +0200 Subject: [PATCH 5/5] feat: center videos in default css --- src/feather/app.py | 6 +++--- src/feather/config.default.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/feather/app.py b/src/feather/app.py index 22cde0a..e67a9c7 100755 --- a/src/feather/app.py +++ b/src/feather/app.py @@ -128,7 +128,7 @@ class FeatherApp: print("Synchronizing from server...") new_articles, updated_articles = 0, 0 - grabbed_article_paths: set[ArticleId] = set() + grabbed_article_ids: set[ArticleId] = set() categories = client_session.list_categories() for category in categories: @@ -148,7 +148,7 @@ class FeatherApp: remaining = False for article in articles: - grabbed_article_paths.add(article.id) + grabbed_article_ids.add(article.id) json_path = article.json_path if not json_path.exists(): article.write() @@ -166,7 +166,7 @@ class FeatherApp: datetime.now().timestamp() - config.keep_read_articles_for ) for article in self.iter_articles(): - if article.id not in grabbed_article_paths: + if article.id not in grabbed_article_ids: # we only sync unread: articles we didn't get from the server were read or purged if config.only_sync_unread_articles: if article.last_write < article_cutoff_timestamp: diff --git a/src/feather/config.default.toml b/src/feather/config.default.toml index 5487dd4..a07f3d6 100644 --- a/src/feather/config.default.toml +++ b/src/feather/config.default.toml @@ -85,7 +85,7 @@ article_template = '''