feat: recalbox 346/346 via md5_composite, add mame variants

Add md5_composite() to verify.py replicating Recalbox Zip::Md5Composite
(sorted filenames, sequential content hash). Independent of ZIP
compression level, resolves all 9 MAME arcade untested entries.

Add Recalbox-specific MAME ZIP variants from Recalbox 10 pack.
Batocera 671/680 (9 untested MAME-specific), all others 100%.
This commit is contained in:
Abdessamad Derraz
2026-03-17 16:08:39 +01:00
parent 4bf62b8126
commit bb1855d3f7
19 changed files with 242 additions and 206 deletions

View File

@@ -28,7 +28,7 @@ except ImportError:
sys.exit(1)
sys.path.insert(0, os.path.dirname(__file__))
from common import load_platform_config, md5sum
from common import load_platform_config, md5sum, md5_composite
DEFAULT_DB = "database.json"
DEFAULT_PLATFORMS_DIR = "platforms"
@@ -192,6 +192,18 @@ def verify_entry_md5(file_entry: dict, local_path: str | None) -> dict:
if len(expected) < 32 and actual_lower.startswith(expected.lower()):
return {"name": name, "status": Status.OK, "path": local_path}
# Recalbox uses Zip::Md5Composite() for ZIP files: sorts filenames,
# hashes all contents sequentially. Independent of compression level.
if local_path.endswith(".zip"):
try:
composite = md5_composite(local_path)
composite_lower = composite.lower()
for expected in md5_list:
if composite_lower == expected.lower():
return {"name": name, "status": Status.OK, "path": local_path}
except (zipfile.BadZipFile, OSError):
pass
return {
"name": name, "status": Status.UNTESTED, "path": local_path,
"expected_md5": md5_list[0] if md5_list else "", "actual_md5": actual_md5,