54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
#
|
||
# Erminig - Recupération de la dernière version d'un soft sur page html
|
||
# Copyright (C) 2025 L0m1g
|
||
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
|
||
#
|
||
# Ce fichier fait partie du projet Erminig.
|
||
# Libre comme l’air, stable comme un menhir, et salé comme le beurre.
|
||
#
|
||
|
||
import re
|
||
import requests
|
||
from erminig.controllers.evezh.abstract import UpstreamSource
|
||
from erminig.core.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))
|