diff options
| -rw-r--r-- | Aggrofile | 18 | ||||
| -rw-r--r-- | plugins/DigestPlugin.py | 93 |
2 files changed, 110 insertions, 1 deletions
@@ -19,6 +19,12 @@ "plugin": "MapPlugin", "map_expr": "set_field(item, 'author', 'Marius Schulz')" }, + "mariusschulz_digest": { + "plugin": "DigestPlugin", + "schedule_expr": "schedule.every(30).seconds", + "digest_title": "Marius Schulz digest", + "digest_description": "Marius Schulz digest" + }, "concat": { "plugin": "ConcatPlugin" }, @@ -31,6 +37,12 @@ "feed_id": "test_feed", "feed_title": "Only Typescript posts", "feed_description": "Feed where all posts have Typescript in the title" + }, + "mariusschulz_digest_feed": { + "plugin": "FeedSinkPlugin", + "feed_id": "marius_digest_feed", + "feed_title": "Marius Schulz digest", + "feed_description": "Marius Schulz digest" } }, "graph": { @@ -44,13 +56,17 @@ "mariusschulz_add_author" ], "mariusschulz_add_author": [ - "concat" + "concat", + "mariusschulz_digest" ], "concat": [ "title_filter" ], "title_filter": [ "output_feed" + ], + "mariusschulz_digest": [ + "mariusschulz_digest_feed" ] } }
\ No newline at end of file diff --git a/plugins/DigestPlugin.py b/plugins/DigestPlugin.py index e69de29..97b954b 100644 --- a/plugins/DigestPlugin.py +++ b/plugins/DigestPlugin.py @@ -0,0 +1,93 @@ +from typing import Any +import time + +from tinydb import Query +from app.Item import Item +from app.PluginInterface import Params, PluginInterface +from app.DatabaseManager import database_manager +from app.utils import ItemDict, dict_to_item, get_param, item_to_dict + + +def remove_duplicates_by_key(lst: list[ItemDict], key: str) -> list[ItemDict]: + return list({x[key]: x for x in lst}.values()) + + +class Plugin(PluginInterface): + def __init__(self, id: str, params: Params) -> None: + super().__init__(id, params) + self.digest_title = get_param("digest_title", params) + self.digest_description = get_param("digest_description", params) + print(f"[DigestPlugin#{self.id}] initialized") + + def item_sort_key(self, item: Item) -> time.struct_time: + if item.pub_date is None: + return time.localtime() + + return item.pub_date + + def make_digest(self) -> list[Item]: + plugin_state_q = Query().plugin_id == self.id + _d: Any = database_manager.plugin_states.get(plugin_state_q) # type: ignore + data: dict[str, Any] = ( + _d if _d is not None else {"plugin_id": self.id, "state": []} + ) + state: list[ItemDict] = data["state"] + items_to_digest = map(dict_to_item, state) + + digest_desc = ( + f"{self.digest_description}<br><br>" if self.digest_description else "" + ) + + for item in items_to_digest: + pub_date_stamp = ( + time.strftime("%a, %d %b %Y %H:%M:%S +0000", item.pub_date) + if item.pub_date + else "" + ) + author = item.author if item.author else "" + digest_desc += f"<strong>{item.title}</strong><br>" + digest_desc += f"<small>{pub_date_stamp} <i>{author}</i></small><br><br>" + digest_desc += item.description if item.description else "" + digest_desc += "<br><br>" + + digest_item: Item = Item( + title=self.digest_title, + description=digest_desc, + link=None, + author=None, + pub_date=time.localtime(), + category=None, + comments=None, + enclosures=[], + ) + + database_manager.plugin_states.upsert( # type: ignore + {"plugin_id": self.id, "state": []}, plugin_state_q + ) + + return [digest_item] + + def add_to_state(self, source_id: str, items: list[Item]) -> list[Item]: + plugin_state_q = Query().plugin_id == self.id + _d: Any = database_manager.plugin_states.get(plugin_state_q) # type: ignore + data: dict[str, Any] = ( + _d if _d is not None else {"plugin_id": self.id, "state": []} + ) + state: list[ItemDict] = data["state"] + + items_as_dicts = list(map(item_to_dict, items)) + state += items_as_dicts + state = remove_duplicates_by_key(state, "link") + + database_manager.plugin_states.upsert( # type: ignore + {"plugin_id": self.id, "state": state}, plugin_state_q + ) + + return [] + + def process(self, source_id: str | None, items: list[Item]) -> list[Item]: + print(f"[DigestPlugin#{self.id}] process called, n={len(items)}") + if source_id is None: + return self.make_digest() + else: + return self.add_to_state(source_id, items) |
