From 434ec98074b8cc6418bed057b790c4e1c176ab53 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sun, 3 Sep 2023 21:36:37 +0300 Subject: Add DigestPlugin --- plugins/DigestPlugin.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) (limited to 'plugins') 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}

" 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"{item.title}
" + digest_desc += f"{pub_date_stamp} {author}

" + digest_desc += item.description if item.description else "" + digest_desc += "

" + + 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) -- cgit v1.3