diff --git a/updates_notifier/fetchers/atom_rss_fetcher.py b/updates_notifier/fetchers/atom_rss_fetcher.py new file mode 100644 index 0000000000000000000000000000000000000000..2dc6eef32708715b86c31027b1c1825ffe6fe98c --- /dev/null +++ b/updates_notifier/fetchers/atom_rss_fetcher.py @@ -0,0 +1,48 @@ +import logging +from typing import List + +import defusedxml.ElementTree as ET +import requests + +from ..entry import Entry +from .project_fetcher import ProjectFetcher + +logger = logging.getLogger(__name__) + +_ATOM_STANDARD = "{http://www.w3.org/2005/Atom}" +_ATOM_ENTRY = f"{_ATOM_STANDARD}entry" +_ATOM_TAG_ID = f"{_ATOM_STANDARD}id" +_ATOM_TAG_VERSION = f"{_ATOM_STANDARD}title" +_ATOM_TAG_URL = f"{_ATOM_STANDARD}link" + + +class AtomRSSFetcher(ProjectFetcher): + def __init__(self, feed_id: int, name: str, stream_url: str): + super().__init__(feed_id, name) + + self.stream_url = stream_url + + def fetch_entries(self) -> List[Entry]: + req = requests.get(self.stream_url) + if req.status_code != requests.codes.ok: + logger.error( + "Failed to get %s RSS file at %s, server returned %s.", + self.name, + self.stream_url, + req.status_code, + ) + return [] + + entries: List[Entry] = [] + + root = ET.fromstring(req.content) + + ET.fromstring(req.content) + for entry in root.findall(_ATOM_ENTRY): + tag_id = entry.findtext(_ATOM_TAG_ID) + version = entry.findtext(_ATOM_TAG_VERSION) + url = entry.find(_ATOM_TAG_URL) + + entries.append(Entry(self.feed_id, tag_id, self.name, version, url)) + + return entries diff --git a/updates_notifier/fetchers/github_fetcher.py b/updates_notifier/fetchers/github_fetcher.py index 0b572fdf7fa85d81ee0863af48611e46485b9ff1..721a0a468fe965f22240b59b95d9f66cd43ec6cf 100644 --- a/updates_notifier/fetchers/github_fetcher.py +++ b/updates_notifier/fetchers/github_fetcher.py @@ -1,7 +1,8 @@ import logging -import requests from typing import List +import requests + from ..entry import Entry from .project_fetcher import ProjectFetcher diff --git a/updates_notifier/fetchers/gitlab_fetcher.py b/updates_notifier/fetchers/gitlab_fetcher.py index e058e634056470737a20ce3a0425b61fed4f690c..47caa99cb02ba6531977e181fb4a0067940c8c66 100644 --- a/updates_notifier/fetchers/gitlab_fetcher.py +++ b/updates_notifier/fetchers/gitlab_fetcher.py @@ -1,8 +1,9 @@ import logging -import requests from typing import List import urllib.parse +import requests + from ..entry import Entry from .project_fetcher import ProjectFetcher