"""Parser for Logiqx XML DAT format. Parses files like No-Intro daily packs and TOSEC releases which use:
......
...
""" from __future__ import annotations import xml.etree.ElementTree as ET from dataclasses import dataclass, field @dataclass class LogiqxRom: """A ROM entry from a Logiqx DAT file.""" game: str description: str name: str size: int crc32: str md5: str sha1: str @dataclass class LogiqxDat: """A parsed Logiqx DAT file.""" name: str = "" version: str = "" roms: list[LogiqxRom] = field(default_factory=list) def parse_logiqx(content: str | bytes) -> LogiqxDat: """Parse Logiqx XML DAT content. Handles both and entries, and games with multiple children. Content declaring XML entities is rejected: DAT files never define them, and expanding entities from untrusted packs opens entity-expansion attacks. """ haystack = content if isinstance(content, str) else content.decode("utf-8", "replace") if " bool: """Validate that content parses as a Logiqx DAT with rom entries.""" try: dat = parse_logiqx(content) except ET.ParseError: return False return bool(dat.roms)