aboutsummaryrefslogtreecommitdiff
path: root/data-collection/components/subscriptions
diff options
context:
space:
mode:
Diffstat (limited to 'data-collection/components/subscriptions')
-rw-r--r--data-collection/components/subscriptions/main.py36
-rw-r--r--data-collection/components/subscriptions/typing.py12
2 files changed, 48 insertions, 0 deletions
diff --git a/data-collection/components/subscriptions/main.py b/data-collection/components/subscriptions/main.py
new file mode 100644
index 0000000..352cf1b
--- /dev/null
+++ b/data-collection/components/subscriptions/main.py
@@ -0,0 +1,36 @@
+from dataclasses import dataclass, field
+from datetime import datetime
+from sys import stderr
+from typing import TypedDict, List
+from bson.objectid import ObjectId
+from feedparser import parse # type: ignore
+import requests
+import schedule
+from components.videos import VideoTuple
+
+@dataclass
+class Subscription:
+ id: str
+ link: str
+ time_between_fetches: int
+ last_update: datetime = datetime.min
+ videos: List[VideoTuple] = field(default_factory=list)
+ subscribers: List[ObjectId] = field(default_factory=list)
+
+ def __post_init__(self) -> None:
+ self._job: schedule.Job = schedule.every(self.time_between_fetches).second.do(self.update)
+
+ def update(self) -> None:
+ try:
+ for entry in parse(self.link)["entries"]:
+ self.videos.append(VideoTuple(
+ id = entry.id,
+ link = entry.link,
+ title = entry.title,
+ published = datetime.fromisoformat(entry.published),
+ updated = datetime.fromisoformat(entry.updated),
+ thumbnail = entry.media_thumbnail[0]["url"],
+ summary = entry.summary,
+ ))
+ except Exception as e:
+ print("Ran into exception", e, file=stderr)
diff --git a/data-collection/components/subscriptions/typing.py b/data-collection/components/subscriptions/typing.py
new file mode 100644
index 0000000..eebcece
--- /dev/null
+++ b/data-collection/components/subscriptions/typing.py
@@ -0,0 +1,12 @@
+from datetime import datetime
+from typing import TypedDict, List
+from bson.objectid import ObjectId
+from components.videos import VideoTuple
+
+class SubsDict(TypedDict):
+ id: str
+ link: str
+ time_between_fetches: int # In hours.
+ last_update: datetime
+ videos: List[VideoTuple]
+ subscribers: List[ObjectId]