diff --git a/nix_update/version/__init__.py b/nix_update/version/__init__.py index 78b134a..902a6f6 100644 --- a/nix_update/version/__init__.py +++ b/nix_update/version/__init__.py @@ -22,6 +22,7 @@ from .rubygems import fetch_rubygem_versions from .savannah import fetch_savannah_versions from .sourcehut import fetch_sourcehut_snapshots, fetch_sourcehut_versions +from .sparkle import fetch_sparkle_versions from .version import Version, VersionPreference @@ -71,6 +72,7 @@ def __call__( fetch_rubygem_versions, fetch_savannah_versions, fetch_sourcehut_versions, + fetch_sparkle_versions, fetch_bitbucket_versions, # all entries below perform requests to check if the target url is of that type fetch_gitea_versions, diff --git a/nix_update/version/sparkle.py b/nix_update/version/sparkle.py new file mode 100644 index 0000000..f7681de --- /dev/null +++ b/nix_update/version/sparkle.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import xml.etree.ElementTree as ET +from typing import TYPE_CHECKING + +from nix_update.utils import info + +from .http import DEFAULT_TIMEOUT, urlopen + +if TYPE_CHECKING: + from urllib.parse import ParseResult + + from .version import Version + + +def fetch_sparkle_versions(url: ParseResult) -> list[Version]: + # https://fork.dev/update/feed-stable.xml + # if the URL isn't an xml document, it can't be sparkle + if not url.path.endswith(".xml"): + return [] + + with urlopen(url.geturl(), timeout=DEFAULT_TIMEOUT) as resp: + xml = resp.read() + info(f"xml: {xml}") + tree = ET.fromstring(xml) + + # tree.findall("enclosure").sort(key=lambda enc: enc.attrib["sparkle:version"]) + versions = tree.findall(".//channel/item/enclosure") + info(versions) + # for enclosure in tree.findall("enclosure"): + + return [versions[0].attrib["sparkle:version"]]