import os import re import requests from html.parser import HTMLParser BUILDBOT_URL = "https://builder.blender.org/" BUILDBOT_DOWNLOAD_URL = BUILDBOT_URL + "download/" class BuildbotHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self._is_inside_official_table = False self._is_official_table_finished = False self.official_builds = [] def handle_starttag(self, tag, attrs): tag_lower = tag.lower() if tag_lower == 'a': if self._is_inside_official_table: for attr in attrs: if attr[0].lower() == 'href': href = attr[1] self.official_builds.append(href) elif tag_lower == 'table': classes = () for attr in attrs: if attr[0].lower() == 'class': classes = attr[1].lower().split() if 'table-striped' in classes: if self._is_inside_official_table: self._is_inside_official_table = False self._is_official_table_finished = True else: if not self._is_official_table_finished: self._is_inside_official_table = True def handle_endtag(self, tag): pass def handle_data(self, data): pass def _getBuildbotPlatformRegex(platform, bitness): platform_lower = platform.lower() if platform_lower in ("linux", "lin"): if bitness.startswith("64"): return re.compile(".*linux-glibc[0-9]+-x86_64.*") elif bitness.startswith("32"): return re.compile(".*linux-glibc[0-9]+-i686.*") else: # TOGO(sergey): Needs implementation pass return None def buildbotGetLatetsVersion(platform, bitness): """ Get latest Blender version URL from buildbot website. Returns None if something is wrong. """ # Get content of the page. r = requests.get(BUILDBOT_DOWNLOAD_URL) if r.status_code != requests.codes.ok: return None # Parse the page. parser = BuildbotHTMLParser() parser.feed(r.text) official_builds = parser.official_builds # Get build which corresponds to requested platform. regex = _getBuildbotPlatformRegex(platform, bitness) if not regex: return None for build in official_builds: if regex.match(build): return BUILDBOT_DOWNLOAD_URL + build return None