46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
|
|
import re
|
||
|
|
import requests
|
||
|
|
from erminig.controllers.evezh.abstract import UpstreamSource
|
||
|
|
from erminig.system.retry import retry_on_failure
|
||
|
|
|
||
|
|
|
||
|
|
class HttpSource(UpstreamSource):
|
||
|
|
|
||
|
|
@retry_on_failure()
|
||
|
|
def get_latest(self):
|
||
|
|
base_url = self.config["url"]
|
||
|
|
pattern = self.config["pattern"]
|
||
|
|
file_pattern = self.config.get("file")
|
||
|
|
|
||
|
|
response = requests.get(
|
||
|
|
base_url, timeout=10
|
||
|
|
) # timeout pour éviter de bloquer éternellement
|
||
|
|
response.raise_for_status()
|
||
|
|
html = response.text
|
||
|
|
|
||
|
|
matches = re.findall(pattern, html)
|
||
|
|
if not matches:
|
||
|
|
print(f"[{self.name}] Aucun match avec pattern : {pattern}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
latest_dir = sorted(set(matches), key=self.version_key)[-1]
|
||
|
|
version = self.extract_version(latest_dir)
|
||
|
|
|
||
|
|
if file_pattern:
|
||
|
|
filename = file_pattern.replace("${version}", version)
|
||
|
|
url = f"{base_url}{latest_dir}{filename}"
|
||
|
|
else:
|
||
|
|
url = f"{base_url}{latest_dir}"
|
||
|
|
|
||
|
|
print(url)
|
||
|
|
|
||
|
|
return {"name": self.name, "version": version, "url": url}
|
||
|
|
|
||
|
|
def extract_version(self, path):
|
||
|
|
match = re.search(r"([0-9]+\.[0-9]+(?:\.[0-9]+)?)", path)
|
||
|
|
return match.group(1) if match else path
|
||
|
|
|
||
|
|
def version_key(self, ver):
|
||
|
|
nums = re.findall(r"\d+", ver)
|
||
|
|
return list(map(int, nums))
|