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 ``` 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/src/feather/app.py b/src/feather/app.py index 3ef5697..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() @@ -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_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: + 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)" diff --git a/src/feather/config.default.toml b/src/feather/config.default.toml index 1b12c4a..a07f3d6 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. @@ -84,7 +85,7 @@ article_template = '''

@@ -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] 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" },