diff --git a/src/common/http.py b/src/common/http.py index 50fdfcf9..64827b7b 100644 --- a/src/common/http.py +++ b/src/common/http.py @@ -62,7 +62,7 @@ def fetch_html(url: str, data: any = None, user_agent: str = ENDOFLIFE_BOT_USER_ return BeautifulSoup(response.text, features=features) def fetch_json(url: str, data: any = None, user_agent: str = ENDOFLIFE_BOT_USER_AGENT, - max_retries: int = 10, backoff_factor: float = 0.5, timeout: int = 30) -> Document: + max_retries: int = 10, backoff_factor: float = 0.5, timeout: int = 30) -> dict: response = fetch_url(url, data, user_agent, max_retries, backoff_factor, timeout) return response.json() diff --git a/src/nvidia-releases.py b/src/nvidia-releases.py new file mode 100644 index 00000000..cae73d3f --- /dev/null +++ b/src/nvidia-releases.py @@ -0,0 +1,44 @@ +import logging +import re + +from common import http +from common.releasedata import ProductData, config_from_argv + +WINDOWS_VERSION_REGEX = re.compile(r'Version .+\(Linux\)/(?P.+)\(Windows\)') + +config = config_from_argv() +with ProductData(config.product) as product_data: + data = http.fetch_json(config.url) + for release_name in data: + release_data = data[release_name] + latest_version_data = release_data.get('driver_info')[0] + latest = latest_version_data['release_version'] + latest_release_data = latest_version_data['release_date'] + link = latest_version_data['release_notes'] + + # Only linux releases are documented in the JSON document. + release = product_data.get_release(f"r{release_name}-linux") + release.set_field('latest', latest) + release.set_field('latestReleaseDate', latest_release_data) + release.set_field('link', link) + + # Windows releases are documented in the release notes. + if not link.startswith('https://docs.nvidia.com'): + logging.debug("Skipping windows release %s, link %s does not start with https://docs.nvidia.com", release_name, link) + continue + + release_note_html = http.fetch_html(link) + release_note_title = release_note_html.select_one('h2.title.topictitle1') + if not release_note_title: + logging.warning("Skipping windows release %s, could not find release note title in '%s'", release_name, link) + continue + + windows_version_match = WINDOWS_VERSION_REGEX.search(release_note_title.text) + if not windows_version_match: + logging.warning("Skipping windows release %s, could not find version in release note title '%s'", release_name, release_note_title.text) + continue + + release = product_data.get_release(f"r{release_name}-windows") + release.set_field('latest', windows_version_match.group('version')) + release.set_field('latestReleaseDate', latest_release_data) + release.set_field('link', link)