77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
|
#!/usr/bin/env python
|
||
|
# encoding: utf-8
|
||
|
|
||
|
import urllib.request
|
||
|
from lxml import etree
|
||
|
from packaging.version import parse as parse_version
|
||
|
|
||
|
class BuildVersion(object):
|
||
|
ARCHIVE = "https://downloadarchive.documentfoundation.org/libreoffice/old/"
|
||
|
RELEASE = "https://download.documentfoundation.org/libreoffice/stable/"
|
||
|
DAILY = "https://dev-builds.libreoffice.org/daily/master/Linux-rpm_deb-x86_64@tb87-TDF/current/"
|
||
|
|
||
|
def __init__(self, query):
|
||
|
self.query = query
|
||
|
self.version = ''
|
||
|
self.basedirurl = {}
|
||
|
|
||
|
# Parsing the query input.
|
||
|
if '.' in self.query:
|
||
|
# Numbered self.version. Let's check it is a 4 dotted release
|
||
|
if len(self.query.split('.')) == 4:
|
||
|
self.version = self.query
|
||
|
else:
|
||
|
# If not 4 dotted, let's search for the 4 dotted version
|
||
|
self.version = self.__getlatestrel(self.query)
|
||
|
|
||
|
self.basedirurl = self.__getbaseurl(self.version)
|
||
|
else:
|
||
|
# String self.versions.
|
||
|
a = self.__getbranchrel(self.query)
|
||
|
self.version = a['version']
|
||
|
self.basedirurl = a['basedirurl']
|
||
|
|
||
|
def __getlatestrel(self, basever):
|
||
|
"""Search in downloadarchive for the latest version matching baseversion."""
|
||
|
versionlist = etree.HTML(urllib.request.urlopen(BuildVersion.ARCHIVE).read()).xpath('//td/a')
|
||
|
# Getting a more polished matching list
|
||
|
cleanlist = list(dict.fromkeys([x.text.strip('/') for x in versionlist if x.text.startswith(basever)]))
|
||
|
|
||
|
# Sorting, then returning the last version
|
||
|
return sorted(cleanlist)[-1]
|
||
|
|
||
|
def __getbranchrel(self, branch):
|
||
|
"""Based on branch names, get the release number."""
|
||
|
basedirurl = {}
|
||
|
version = ''
|
||
|
if branch == 'daily':
|
||
|
basedirurl = { 'x86_64': BuildVersion.DAILY, 'x86': '-' }
|
||
|
version = etree.HTML(urllib.request.urlopen(BuildVersion.DAILY).read()).xpath('//td/a')[1].text.split('_')[1]
|
||
|
|
||
|
return { 'version': version, 'basedirurl': basedirurl }
|
||
|
|
||
|
versions = etree.HTML(urllib.request.urlopen(BuildVersion.RELEASE).read()).xpath('//td/a')
|
||
|
index = 1
|
||
|
if branch == 'still':
|
||
|
index = 2
|
||
|
elif branch == 'fresh':
|
||
|
index = 3
|
||
|
version = self.__getlatestrel(versions[index].text.strip('/'))
|
||
|
|
||
|
return { 'version': version, 'basedirurl': self.__getbaseurl(version) }
|
||
|
|
||
|
def __getbaseurl(self, version):
|
||
|
"""Returns the links based on the numeric version."""
|
||
|
basedirurl = {}
|
||
|
url = BuildVersion.ARCHIVE + '/' + version + '/deb/'
|
||
|
|
||
|
# x86 binaries are not anymore offered after 6.3.0.
|
||
|
if parse_version(version) < parse_version('6.3.0'):
|
||
|
basedirurl['x86'] = url + 'x86/'
|
||
|
else:
|
||
|
basedirurl['x86'] = '-'
|
||
|
|
||
|
basedirurl['x86_64'] = url + 'x86_64/'
|
||
|
|
||
|
return basedirurl
|