Rewriting named queries based on obfuscated releases.toml - Thanks buovjaga.

This commit is contained in:
emiliano.vavassori 2026-05-02 17:12:20 +02:00
parent b8052e08a7
commit 7f72b1a855
1 changed files with 46 additions and 21 deletions

View File

@ -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