Category autoread by guid (#8673)

* Add configuration to mark same GUID as read in category.

Implement suggestion mentioned in #8641

Changes proposed in this pull request:

- Add a configuration to the categories to automatically mark entries as read if the same GUID is present in recent entries.  

How to test the feature manually:

1. Create a category. Check the option "Mark an article as read… if an identical GUID already exists [...]"  
2. Enable debug logs, or add an extension which registers to the hook `Minz_HookType::EntryAutoRead`.  
3. Add feeds which might have the same GUID.  
  For example: https://www.reddit.com/r/technology/hot.rss, https://www.reddit.com/r/technology/rising.rss, https://www.reddit.com/r/technology/best.rss, and https://www.reddit.com/r/technology/new.rss
4. See the logs "Mark GUID as read[...]", or the effect of the extension.  

* Implement behavior to mark same GUID as read in category.

* Update documentation

* Update i18n

* Fix PHP CS report

* Fix missing argument

* Fixes

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
This commit is contained in:
pe1uca
2026-04-05 13:41:37 -04:00
committed by GitHub
parent d5f3126d6c
commit c44cd2b08f
34 changed files with 88 additions and 5 deletions

View File

@@ -468,6 +468,8 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
$feedsCacheToRefresh = [];
/** @var array<int,array<string,true>> */
$categoriesEntriesTitle = [];
/** @var array<int,array<string,true>> */
$categoriesEntriesGuid = [];
$feeds = Minz_ExtensionManager::callHook(Minz_HookType::FeedsListBeforeActualize, $feeds);
if (is_array($feeds)) {
@@ -601,6 +603,12 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
true
);
}
if (!isset($categoriesEntriesGuid[$feed->categoryId()]) && $category !== null && $category->hasAttribute('read_when_same_guid_in_category')) {
$categoriesEntriesGuid[$feed->categoryId()] = array_fill_keys(
$catDAO->listGuids($feed->categoryId(), $category->attributeInt('read_when_same_guid_in_category') ?? 0),
true
);
}
$mark_updated_article_unread = $feed->attributeBoolean('mark_updated_article_unread') ?? FreshRSS_Context::userConf()->mark_updated_article_unread;
@@ -646,6 +654,9 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
if (isset($categoriesEntriesTitle[$feed->categoryId()])) {
$categoriesEntriesTitle[$feed->categoryId()][$entry->title()] = true;
}
if (isset($categoriesEntriesGuid[$feed->categoryId()])) {
$categoriesEntriesGuid[$feed->categoryId()][$entry->guid()] = true;
}
if (!$entry->isRead()) {
$needFeedCacheRefresh = true; //Maybe
@@ -674,13 +685,17 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
continue;
}
$entry->applyFilterActions(array_merge($titlesAsRead, $categoriesEntriesTitle[$feed->categoryId()] ?? []));
$entry->applyFilterActions(array_merge($titlesAsRead, $categoriesEntriesTitle[$feed->categoryId()] ?? []),
$categoriesEntriesGuid[$feed->categoryId()] ?? []);
if ($readWhenSameTitleInFeed > 0) {
$titlesAsRead[$entry->title()] = true;
}
if (isset($categoriesEntriesTitle[$feed->categoryId()])) {
$categoriesEntriesTitle[$feed->categoryId()][$entry->title()] = true;
}
if (isset($categoriesEntriesGuid[$feed->categoryId()])) {
$categoriesEntriesGuid[$feed->categoryId()][$entry->guid()] = true;
}
$needFeedCacheRefresh = true;