Rewriting named queries based on obfuscated releases.toml - Thanks buovjaga.
This commit is contained in:
parent
b8052e08a7
commit
7f72b1a855
|
|
@ -9,6 +9,8 @@ import requests
|
||||||
import subprocess
|
import subprocess
|
||||||
import shlex
|
import shlex
|
||||||
from lxml import html
|
from lxml import html
|
||||||
|
from base64 import b64decode
|
||||||
|
import tomllib
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
DOWNLOADPAGE = "https://www.libreoffice.org/download/download/"
|
DOWNLOADPAGE = "https://www.libreoffice.org/download/download/"
|
||||||
|
|
@ -18,13 +20,21 @@ DAILY = "https://dev-builds.libreoffice.org/daily/master/"
|
||||||
PRERELEASE = "https://dev-builds.libreoffice.org/pre-releases/deb/x86_64/"
|
PRERELEASE = "https://dev-builds.libreoffice.org/pre-releases/deb/x86_64/"
|
||||||
|
|
||||||
SELECTORS = {
|
SELECTORS = {
|
||||||
'still': {
|
'latest': {
|
||||||
'URL': DOWNLOADPAGE,
|
'URL': '',
|
||||||
'xpath': '(//span[@class="dl_version_number"])[last()]/text()'
|
'selector': "latestMajor"
|
||||||
},
|
},
|
||||||
'fresh': {
|
'fresh': {
|
||||||
'URL': DOWNLOADPAGE,
|
'URL': '',
|
||||||
'xpath': '(//span[@class="dl_version_number"])[1]/text()'
|
'selector': "latestMajor"
|
||||||
|
},
|
||||||
|
'previous': {
|
||||||
|
'URL': '',
|
||||||
|
'selector': "previousMajor"
|
||||||
|
},
|
||||||
|
'still': {
|
||||||
|
'URL': '',
|
||||||
|
'selector': "previousMajor"
|
||||||
},
|
},
|
||||||
'prerelease': {
|
'prerelease': {
|
||||||
'URL': DOWNLOADPAGE,
|
'URL': DOWNLOADPAGE,
|
||||||
|
|
@ -44,6 +54,13 @@ def match_xpath(url: str, xpath: str):
|
||||||
parsed = html.fromstring(resource.content)
|
parsed = html.fromstring(resource.content)
|
||||||
return parsed.xpath(xpath)
|
return parsed.xpath(xpath)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_releases_as_dict() -> dict:
|
||||||
|
"""Official releases of LO via obfuscated releses.toml."""
|
||||||
|
RELEASE_OBFUSCATED = "https://git.libreoffice.org/infra/libreofficeorg/+/refs/heads/master/data/releases.toml?format=TEXT"
|
||||||
|
request = requests.get(RELEASE_OBFUSCATED)
|
||||||
|
return tomllib.loads(b64decode(request.text).decode('UTF-8'))
|
||||||
|
|
||||||
|
|
||||||
# Classes
|
# Classes
|
||||||
class Version():
|
class Version():
|
||||||
|
|
@ -114,7 +131,7 @@ class Solver():
|
||||||
solver = self
|
solver = self
|
||||||
if self.text in { 'current', 'yesterday', 'daily' }:
|
if self.text in { 'current', 'yesterday', 'daily' }:
|
||||||
solver = DailySolver(self.text, self.default_to_current)
|
solver = DailySolver(self.text, self.default_to_current)
|
||||||
elif self.text in { 'still', 'fresh', 'prerelease' }:
|
elif self.text in { 'still', 'fresh', 'prerelease', 'latest', 'previous' }:
|
||||||
solver = NamedSolver(self.text)
|
solver = NamedSolver(self.text)
|
||||||
elif '.' in self.text:
|
elif '.' in self.text:
|
||||||
solver = NumberedSolver(self.text)
|
solver = NumberedSolver(self.text)
|
||||||
|
|
@ -217,25 +234,33 @@ class NamedSolver(Solver):
|
||||||
|
|
||||||
def solve(self):
|
def solve(self):
|
||||||
"""Get versions from query."""
|
"""Get versions from query."""
|
||||||
xpath_query = SELECTORS[self.text]['xpath']
|
|
||||||
results = sorted(match_xpath(self.baseurl, xpath_query))
|
|
||||||
|
|
||||||
if len(results) > 0:
|
if 'selector' in SELECTORS[self.text].keys():
|
||||||
self.generalver = str(results[-1])
|
# Version parsed from releases.toml.
|
||||||
|
selector = SELECTORS[self.text]['selector']
|
||||||
|
self.generalver = get_releases_as_dict()[selector]
|
||||||
|
else:
|
||||||
|
# Release searched via xpath on URL
|
||||||
|
|
||||||
result: str = self.generalver
|
xpath_query = SELECTORS[self.text]['xpath']
|
||||||
xpath_string = f"//td/a[starts-with(text(),'{result}')]/text()"
|
results = sorted(match_xpath(self.baseurl, xpath_query))
|
||||||
archived_versions = sorted(match_xpath(ARCHIVE, xpath_string))
|
|
||||||
|
|
||||||
if len(archived_versions) == 0:
|
if len(results) > 0:
|
||||||
return self.version
|
self.generalver = str(results[-1])
|
||||||
|
|
||||||
# Return just the last versions
|
result: str = self.generalver
|
||||||
fullversion: str = str(archived_versions[-1])
|
xpath_string = f"//td/a[starts-with(text(),'{result}')]/text()"
|
||||||
self.baseurl = ARCHIVE + fullversion + 'deb/'
|
archived_versions = sorted(match_xpath(ARCHIVE, xpath_string))
|
||||||
self.version = fullversion.rstrip('/')
|
|
||||||
if self.branch == 'prerelease':
|
if len(archived_versions) == 0:
|
||||||
self.baseurl = PRERELEASE
|
return self.version
|
||||||
|
|
||||||
|
# Return just the last versions
|
||||||
|
fullversion: str = str(archived_versions[-1])
|
||||||
|
self.baseurl = ARCHIVE + fullversion + 'deb/'
|
||||||
|
self.version = fullversion.rstrip('/')
|
||||||
|
if self.branch == 'prerelease':
|
||||||
|
self.baseurl = PRERELEASE
|
||||||
|
|
||||||
return self.version
|
return self.version
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue