1
0
Fork 0
mirror of https://codeberg.org/Reuh/feather.git synced 2025-10-27 18:19:32 +00:00

Compare commits

...

5 commits
v1.1.0 ... main

5 changed files with 25 additions and 18 deletions

View file

@ -53,14 +53,13 @@ The now read articles can (surprisingly) be found in the trash. After marking an
#### Reading read articles #### 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 ```toml
# Write article HTML files for read articles
[html] [html]
# Write article HTML files for read articles
write_read_articles = true write_read_articles = true
# Add a checkmark in the article filename indicating the read status # Add a checkmark in the article filename indicating the read status
[html]
filename_template = "{% if unread %}☐{% else %}☑{% endif %} [{{ feed_title }}]\t{{ title }} ({{ published }}).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: 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 ```toml
# Grab both read and unread articles from the server
[server] [server]
# Grab both read and unread articles from the server
only_sync_unread_articles = false only_sync_unread_articles = false
``` ```

View file

@ -1,6 +1,6 @@
[project] [project]
name = "feather" name = "feather"
version = "1.1.0" version = "1.1.1"
authors = [ { name = 'Étienne "Reuh" Fildadut' } ] authors = [ { name = 'Étienne "Reuh" Fildadut' } ]
description = "file-based RSS reader client" description = "file-based RSS reader client"
readme = "README.md" readme = "README.md"

View file

@ -128,7 +128,7 @@ class FeatherApp:
print("Synchronizing from server...") print("Synchronizing from server...")
new_articles, updated_articles = 0, 0 new_articles, updated_articles = 0, 0
grabbed_article_paths: set[ArticleId] = set() grabbed_article_ids: set[ArticleId] = set()
categories = client_session.list_categories() categories = client_session.list_categories()
for category in categories: for category in categories:
@ -148,7 +148,7 @@ class FeatherApp:
remaining = False remaining = False
for article in articles: for article in articles:
grabbed_article_paths.add(article.id) grabbed_article_ids.add(article.id)
json_path = article.json_path json_path = article.json_path
if not json_path.exists(): if not json_path.exists():
article.write() article.write()
@ -160,20 +160,26 @@ class FeatherApp:
article.write() article.write()
updated_articles += 1 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 removed_articles = 0
article_cutoff_timestamp = ( article_cutoff_timestamp = (
datetime.now().timestamp() - config.keep_read_articles_for datetime.now().timestamp() - config.keep_read_articles_for
) )
for article in self.iter_articles(): for article in self.iter_articles():
if ( if article.id not in grabbed_article_ids:
# we sync all articles: remove all articles that aren't on the server # we only sync unread: articles we didn't get from the server were read or purged
not config.only_sync_unread_articles if config.only_sync_unread_articles:
# we only sync unread: only remove articles that are too old if article.last_write < article_cutoff_timestamp:
or article.last_write < article_cutoff_timestamp article.delete()
) and article.id not in grabbed_article_paths: removed_articles += 1
article.delete() elif article.unread:
removed_articles += 1 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( print(
f"Synchronization successful ({new_articles} new articles, {updated_articles} updated, {removed_articles} removed)" f"Synchronization successful ({new_articles} new articles, {updated_articles} updated, {removed_articles} removed)"

View file

@ -6,6 +6,7 @@
[server] [server]
# (Required) Server API to use. Either "googlereader" for the Google Reader API (FreshRSS, Miniflux, etc.) or "ttrss" for the TinyTiny-RSS API. # (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. # The Google Reader API do not support nested categories.
# Can be set through the environment variable SERVER_API.
api = "googlereader" api = "googlereader"
# (Required) URL of your server's Google Reader API endpoint # (Required) URL of your server's Google Reader API endpoint
# Can be set through the environment variable SERVER_URL. # Can be set through the environment variable SERVER_URL.
@ -84,7 +85,7 @@ article_template = '''
<body style="background-color:black; color:white; font-family:sans-serif; overflow-x:hidden;"> <body style="background-color:black; color:white; font-family:sans-serif; overflow-x:hidden;">
<style> <style>
a {color:palevioletred; text-decoration:none;} a {color:palevioletred; text-decoration:none;}
.feather-content img {display:block; margin-left:50%; transform:translateX(-50%); max-width:100vw;} .feather-content img, .feather-content video {display:block; margin-left:50%; transform:translateX(-50%); max-width:100vw;}
</style> </style>
<article style="max-width:min(60rem,100%); margin:auto;"> <article style="max-width:min(60rem,100%); margin:auto;">
<p style="display:flex; flex-direction:row; justify-content:space-between;"> <p style="display:flex; flex-direction:row; justify-content:space-between;">
@ -138,6 +139,7 @@ hide_empty_categories = true
# Can be set through the environment variable HTML_MAX_FILENAME_LENGTH. # Can be set through the environment variable HTML_MAX_FILENAME_LENGTH.
max_filename_length = 250 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. # 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" = "" } filename_replacement = { "/" = "", "\u0000" = "" }
[datetime] [datetime]

2
uv.lock generated
View file

@ -69,7 +69,7 @@ wheels = [
[[package]] [[package]]
name = "feather" name = "feather"
version = "1.1.0" version = "1.1.1"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "google-reader" }, { name = "google-reader" },