1
0
Fork 0
mirror of https://codeberg.org/Reuh/feather.git synced 2025-10-27 10:09: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
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
```

View file

@ -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"

View file

@ -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)"

View file

@ -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 = '''
<body style="background-color:black; color:white; font-family:sans-serif; overflow-x:hidden;">
<style>
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>
<article style="max-width:min(60rem,100%); margin:auto;">
<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.
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]

2
uv.lock generated
View file

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