Les choses sérieuses commencent
This commit is contained in:
parent
7a9fe18463
commit
c63f62721b
41 changed files with 1270 additions and 0 deletions
0
erminig/controllers/evezh/parsers/__init__.py
Normal file
0
erminig/controllers/evezh/parsers/__init__.py
Normal file
76
erminig/controllers/evezh/parsers/github.py
Normal file
76
erminig/controllers/evezh/parsers/github.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import re
|
||||
import requests
|
||||
from erminig.config import Config
|
||||
from erminig.controllers.evezh.abstract import UpstreamSource
|
||||
from erminig.system.retry import retry_on_failure
|
||||
|
||||
|
||||
class GitHubSource(UpstreamSource):
|
||||
|
||||
@retry_on_failure()
|
||||
def get_latest(self):
|
||||
repo = self.config["github"]
|
||||
file_template = self.config.get("file")
|
||||
|
||||
latest = self._get_latest_release(repo)
|
||||
if not latest:
|
||||
latest = self._get_latest_tag(repo)
|
||||
if not latest:
|
||||
print(f"[{self.name}] Aucune version détectée.")
|
||||
return None
|
||||
|
||||
version = self.normalize_version(latest["tag"])
|
||||
url = latest.get("url")
|
||||
|
||||
if not url and file_template:
|
||||
filename = file_template.replace("${version}", version)
|
||||
url = f"https://github.com/{repo}/releases/download/{latest['tag']}/{filename}"
|
||||
print(f"[{self.name}] Fallback URL : {url}")
|
||||
|
||||
print(url)
|
||||
return {"name": self.name, "version": version, "url": url or ""}
|
||||
|
||||
def _github_headers(self):
|
||||
headers = {}
|
||||
if Config.GITHUB_TOKEN:
|
||||
headers["Authorization"] = f"token {Config.GITHUB_TOKEN}"
|
||||
return headers
|
||||
|
||||
def _get_latest_release(self, repo):
|
||||
r = requests.get(
|
||||
f"https://api.github.com/repos/{repo}/releases",
|
||||
headers=self._github_headers(),
|
||||
)
|
||||
r.raise_for_status()
|
||||
data = r.json()
|
||||
if not data:
|
||||
return None
|
||||
|
||||
release = data[0]
|
||||
for asset in release.get("assets", []):
|
||||
if asset["browser_download_url"].endswith(".tar.gz"):
|
||||
return {
|
||||
"tag": release["tag_name"],
|
||||
"url": asset["browser_download_url"],
|
||||
}
|
||||
return {"tag": release["tag_name"]}
|
||||
|
||||
def _get_latest_tag(self, repo):
|
||||
r = requests.get(
|
||||
f"https://api.github.com/repos/{repo}/tags", headers=self._github_headers()
|
||||
)
|
||||
r.raise_for_status()
|
||||
tags = r.json()
|
||||
if not tags:
|
||||
return None
|
||||
url = f"https://github.com/{repo}/archive/refs/tags/{tags[0]["name"]}.tar.gz"
|
||||
return {"tag": tags[0]["name"], "url": url}
|
||||
|
||||
def normalize_version(self, tag):
|
||||
# Exemples : v2.7.1 → 2.7.1, R_2_7_1 → 2.7.1, expat-2.7.1 → 2.7.1
|
||||
tag = tag.strip()
|
||||
if tag.lower().startswith(("v", "r_", "r")):
|
||||
tag = re.sub(r"^[vVrR_]+", "", tag)
|
||||
tag = tag.replace("_", ".")
|
||||
match = re.search(r"(\d+\.\d+(?:\.\d+)?)", tag)
|
||||
return match.group(1) if match else tag
|
||||
45
erminig/controllers/evezh/parsers/http.py
Normal file
45
erminig/controllers/evezh/parsers/http.py
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
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))
|
||||
33
erminig/controllers/evezh/parsers/sourceforge.py
Normal file
33
erminig/controllers/evezh/parsers/sourceforge.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import re
|
||||
import requests
|
||||
import xml.etree.ElementTree as ET
|
||||
from erminig.controllers.evezh.abstract import UpstreamSource
|
||||
from erminig.system.retry import retry_on_failure
|
||||
|
||||
|
||||
class SourceForgeRSS(UpstreamSource):
|
||||
|
||||
@retry_on_failure()
|
||||
def get_latest(self):
|
||||
rss_url = self.config["sourceforge"]
|
||||
r = requests.get(rss_url, timeout=10)
|
||||
r.raise_for_status()
|
||||
root = ET.fromstring(r.text)
|
||||
items = root.findall(".//item")
|
||||
|
||||
versions = []
|
||||
for item in items:
|
||||
title = item.findtext("title") or ""
|
||||
match = re.search(r"([0-9]+\.[0-9]+(?:\.[0-9]+)?)", title)
|
||||
if match:
|
||||
version = match.group(1)
|
||||
link = item.findtext("link")
|
||||
versions.append((version, link))
|
||||
|
||||
if not versions:
|
||||
print(f"[{self.name}] Aucune version trouvée via RSS.")
|
||||
return None
|
||||
|
||||
latest = sorted(versions, key=lambda x: list(map(int, x[0].split("."))))[-1]
|
||||
print(latest[1])
|
||||
return {"name": self.name, "version": latest[0], "url": latest[1]}
|
||||
Loading…
Add table
Add a link
Reference in a new issue