Server: generate meta.json for builds/ on startup for incremental updates

This commit is contained in:
SashegDev
2026-05-08 18:51:15 +00:00
parent 4697b16ab4
commit 59480217aa
+75
View File
@@ -151,6 +151,10 @@ async def lifespan(app: FastAPI):
# Scan launcher versions and generate meta # Scan launcher versions and generate meta
logger.info("Scanning launcher versions...") logger.info("Scanning launcher versions...")
# Generate meta.json in builds/ directory
logger.info("Generating launcher meta...")
generate_launcher_builds_meta()
# Extract new format ZIPs to versions directory # Extract new format ZIPs to versions directory
logger.info("Extracting new format versions...") logger.info("Extracting new format versions...")
extract_new_format_versions() extract_new_format_versions()
@@ -829,8 +833,79 @@ def calculate_file_hash(file_path: Path) -> str:
return hash_sha.hexdigest() return hash_sha.hexdigest()
def generate_launcher_builds_meta():
"""Generate meta.json in builds/ directory for incremental updates"""
import hashlib
version = get_current_launcher_version()
if not version:
return
meta_path = BUILDS_DIR / "meta.json"
# Check if meta exists and is fresh
if meta_path.exists():
try:
with open(meta_path, 'r', encoding='utf-8') as f:
existing = json.load(f)
if existing.get("version") == version:
logger.debug("Launcher meta.json already exists and is current")
return
except Exception:
pass
# Generate new meta
files = []
try:
for file_path in BUILDS_DIR.rglob("*"):
if file_path.is_file() and file_path.name not in ["meta.json"]:
rel_path = str(file_path.relative_to(BUILDS_DIR))
stat = file_path.stat()
# Calculate hash
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
sha256_hash.update(chunk)
files.append({
"path": rel_path,
"size": stat.st_size,
"hash": f"sha256:{sha256_hash.hexdigest()}"
})
except Exception as e:
logger.warning(f"Failed to generate launcher meta: {e}")
return
meta = {
"version": version,
"type": "builds",
"release_date": datetime.utcnow().isoformat(),
"files": files
}
try:
with open(meta_path, 'w', encoding='utf-8') as f:
json.dump(meta, f, indent=2)
logger.info(f"Generated launcher meta.json with {len(files)} files")
except Exception as e:
logger.warning(f"Failed to save meta.json: {e}")
def scan_launcher_version(version: str) -> Optional[dict]: def scan_launcher_version(version: str) -> Optional[dict]:
"""Scan a launcher version directory and return meta""" """Scan a launcher version directory and return meta"""
# First check if meta exists in builds/ directly (for new format)
meta_path = BUILDS_DIR / "meta.json"
if meta_path.exists():
try:
with open(meta_path, 'r', encoding='utf-8') as f:
meta = json.load(f)
if meta.get("version") == version:
return meta
except Exception:
pass
# Fallback: check versions directory
version_path = VERSIONS_DIR / version version_path = VERSIONS_DIR / version
if not version_path.exists() or not version_path.is_dir(): if not version_path.exists() or not version_path.is_dir():