mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-21 19:29:03 -05:00
feat: read RetroPie launchers from scriptmodules
The scraper walks each package's functions the way RetroPie runs them in one shell (assignments, arrays, for loops, brace expansion, $md_id, calls into other packages) and records every link, copy, move and setting that names $biosdir, the addEmulator flags (sdltrs -romfile3), the BIOS read outside $biosdir (basilisk --rom, gngeopi -B) and the launch scripts that exit without their file (fs-uae kick13.rom, reicast dc_boot.bin). Each package also gets a package record with its rp_module_repo and the systems it registers, which maps a package to the build it compiles. The schema gains package, repo, systems and the moves and package kinds. platforms/retropie.yml is regenerated at 46128cd2: only the launchers section is new.
This commit is contained in:
1 parent
1c23d4daaa
commit
15ffeddfe3
7 files changed
+3923
-6
No files matched your search
@@ -15,6 +15,10 @@ RetroArch: RetroPie claimed every libretro core in existence while shipping
|
||||
96 of them, and claimed none of the standalone emulators it also packages
|
||||
(openmsx, pcsx2, xroar, sdltrs, amiberry and the rest). Both halves were
|
||||
wrong, in opposite directions.
|
||||
|
||||
The same scripts carry the launcher layer (retropie_launchers): where each
|
||||
package links, copies or passes a BIOS file, what it builds and which
|
||||
systems it registers.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -27,8 +31,14 @@ import urllib.request
|
||||
|
||||
try:
|
||||
from .base_scraper import BaseScraper, BiosRequirement, fetch_branch_head
|
||||
from .retropie_launchers import SCRIPTMODULES
|
||||
from .retropie_launchers import SECTIONS as _SCRIPT_SECTIONS
|
||||
from .retropie_launchers import extract_launchers
|
||||
except ImportError:
|
||||
from base_scraper import BaseScraper, BiosRequirement, fetch_branch_head
|
||||
from retropie_launchers import SCRIPTMODULES
|
||||
from retropie_launchers import SECTIONS as _SCRIPT_SECTIONS
|
||||
from retropie_launchers import extract_launchers
|
||||
|
||||
PLATFORM_NAME = "retropie"
|
||||
|
||||
@@ -43,7 +53,7 @@ _VERSION_FILE = "retropie_packages.sh"
|
||||
_VERSION = re.compile(r'^__version="([^"]+)"', re.MULTILINE)
|
||||
# Sections RetroPie does not build as emulators: setup helpers, themes,
|
||||
# drivers and the like carry no core.
|
||||
_PACKAGE_DIRS = ("emulators", "libretrocores", "ports")
|
||||
_PACKAGE_DIRS = _SCRIPT_SECTIONS
|
||||
|
||||
|
||||
class Scraper(BaseScraper):
|
||||
@@ -56,6 +66,8 @@ class Scraper(BaseScraper):
|
||||
super().__init__(url=url)
|
||||
self._modules: list[str] | None = None
|
||||
self._version = ""
|
||||
# Package scripts and the launch scripts beside them, by repo path.
|
||||
self._scripts: dict[str, str] = {}
|
||||
|
||||
def _fetch_archive(self) -> bytes:
|
||||
request = urllib.request.Request(
|
||||
@@ -89,12 +101,19 @@ class Scraper(BaseScraper):
|
||||
and parts[0] == "scriptmodules"
|
||||
and parts[1] in _PACKAGE_DIRS
|
||||
)
|
||||
if not (is_version_file or is_package):
|
||||
is_launch_script = (
|
||||
len(parts) == 4 and parts[0] == SCRIPTMODULES and parts[1] in _SCRIPT_SECTIONS
|
||||
)
|
||||
if not (is_version_file or is_package or is_launch_script):
|
||||
continue
|
||||
handle = archive.extractfile(member)
|
||||
if handle is None:
|
||||
continue
|
||||
text = handle.read().decode("utf-8", errors="replace")
|
||||
if is_package or is_launch_script:
|
||||
self._scripts[relative] = text
|
||||
if is_launch_script:
|
||||
continue
|
||||
match = (_VERSION if is_version_file else _MODULE_ID).search(text)
|
||||
if not match:
|
||||
continue
|
||||
@@ -139,6 +158,7 @@ class Scraper(BaseScraper):
|
||||
"source": self.url,
|
||||
"base_destination": "BIOS",
|
||||
"cores": cores,
|
||||
"launchers": extract_launchers(self._scripts),
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user