mirror of
https://github.com/ksherlock/ample.git
synced 2025-04-21 13:37:43 +00:00
242 lines
4.2 KiB
Python
242 lines
4.2 KiB
Python
import argparse
|
|
import re
|
|
|
|
import xml.etree.ElementTree as ET
|
|
from html.parser import HTMLParser
|
|
from os.path import splitext
|
|
|
|
|
|
from machines import MACHINES, MACHINES_EXTRA
|
|
import mame
|
|
from plist import to_plist
|
|
|
|
|
|
# a2pcxport dependencies. not automatically included though
|
|
# (would need to manually pull devnames from a2pcxport then)
|
|
# listxml for them.
|
|
|
|
EXTRA_MACHINES = [
|
|
'vgmplay',
|
|
'cga',
|
|
'kb_iskr1030',
|
|
'kb_ec1841',
|
|
'kb_pc83',
|
|
'kb_pcxt83',
|
|
'keytronic_pc3270',
|
|
'apple2gsr0p',
|
|
'apple2gsr0p2',
|
|
'apple2c0',
|
|
'apple2c3',
|
|
'apple2c4',
|
|
'mac2fdhd',
|
|
'cuda',
|
|
]
|
|
|
|
|
|
p = argparse.ArgumentParser()
|
|
p.add_argument('--full', action='store_true')
|
|
p.add_argument('--extra', action='store_true')
|
|
p.add_argument('machine', nargs="*")
|
|
args = p.parse_args()
|
|
|
|
# full = args.full
|
|
extra = args.extra
|
|
machines = args.machine
|
|
if not machines:
|
|
if extra:
|
|
machines = [ *MACHINES_EXTRA, *EXTRA_MACHINES]
|
|
else:
|
|
machines = [ *MACHINES, *EXTRA_MACHINES]
|
|
|
|
# roms stored in other files.
|
|
xEXCLUDE = [
|
|
'ace100',
|
|
'agat7',
|
|
'agat9',
|
|
'albert',
|
|
'am100',
|
|
'am64',
|
|
'apple2cp',
|
|
'apple2ee',
|
|
'apple2eefr',
|
|
'apple2ees',
|
|
'apple2eeuk',
|
|
'apple2ep',
|
|
'apple2euk',
|
|
'apple2gsr0',
|
|
'apple2gsr1',
|
|
'apple2jp',
|
|
'apple2p',
|
|
'basis108',
|
|
'craft2p',
|
|
'dodo',
|
|
'elppa',
|
|
'hkc8800a',
|
|
'ivelultr',
|
|
'las128e2',
|
|
'las128ex',
|
|
'laser128',
|
|
'laser2c',
|
|
'maxxi',
|
|
'microeng',
|
|
'mprof3',
|
|
'prav82',
|
|
'prav8c',
|
|
'prav8m',
|
|
'space84',
|
|
'spectred',
|
|
'uniap2en',
|
|
'uniap2pt',
|
|
'uniap2ti',
|
|
]
|
|
|
|
# non-existent or included elsewhere.
|
|
EXCLUDE = set([
|
|
'mac512ke',
|
|
'maciicx',
|
|
'maciihmu',
|
|
'maciivi',
|
|
'maciix',
|
|
|
|
'macct610',
|
|
'macct650',
|
|
'maclc3p',
|
|
'maclc475',
|
|
'maclc575',
|
|
'macqd610',
|
|
'macqd650',
|
|
|
|
'kb_pc83',
|
|
|
|
# ROMs for CD Drives, etc, that are intentionally hidden
|
|
# due to lack of functionality.
|
|
'aplcd150',
|
|
'cdd2000',
|
|
'cdr4210',
|
|
'cdrn820s',
|
|
'cdu415',
|
|
'cdu561_25',
|
|
'cdu75s',
|
|
'cfp1080s',
|
|
'crd254sh',
|
|
'cw7501',
|
|
'smoc501',
|
|
|
|
# amiga ntsc
|
|
"a500n",
|
|
"a1000n",
|
|
"a2000n",
|
|
])
|
|
|
|
def fix_machine_description(x, devname):
|
|
# CFFA 2.0 Compact Flash (65C02 firmware, www.dreher.net)
|
|
x = x.replace(", www.dreher.net","")
|
|
x = x.replace('8inch','8"') #
|
|
x = x.replace("65C02", "65c02")
|
|
x = re.sub(r"((^| |\()[a-z])", lambda x: x[0].upper(), x) # fix capital-case
|
|
|
|
if devname in ("st", "megast"): x = "Atari " + x
|
|
return x
|
|
|
|
def build_known_roms_list():
|
|
# https://archive.org/download/mame-merged/mame-merged/
|
|
infile = "mame-0.264-merged.html"
|
|
# infile = "mame-0233-full.html"
|
|
# infile = "mame-0.231-merged.html"
|
|
rv = set()
|
|
|
|
class X(HTMLParser):
|
|
rv = set()
|
|
|
|
def handle_starttag(self, tag, attrs):
|
|
if tag != 'a': return
|
|
href = None
|
|
for xx in attrs:
|
|
if xx[0] == 'href':
|
|
href = xx[1]
|
|
break
|
|
if not href: return
|
|
root, ext = splitext(href)
|
|
if ext in (".7z", ".zip"): self.rv.add(root)
|
|
|
|
|
|
|
|
x = X()
|
|
with open(infile) as f:
|
|
data = f.read()
|
|
x.feed(data)
|
|
x.close()
|
|
return x.rv
|
|
|
|
|
|
|
|
|
|
mnames = {}
|
|
rnames = set()
|
|
|
|
known = build_known_roms_list()
|
|
|
|
for m in machines:
|
|
|
|
print(m)
|
|
|
|
xml = mame.run(m, "-listxml")
|
|
root = ET.fromstring(xml)
|
|
|
|
data = { }
|
|
|
|
|
|
# find machines that have a rom child
|
|
for x in root.findall('machine/rom/..'):
|
|
name = x.get('name')
|
|
#if name in EXCLUDE: continue
|
|
if name in mnames: continue
|
|
|
|
if name not in known: continue
|
|
# if name not in known:
|
|
# print("skipping", name)
|
|
# continue
|
|
|
|
mnames[name] = x.find("description").text
|
|
|
|
|
|
#if (name in known): mnames.add(name)
|
|
# if name in mnames:
|
|
# mnames[name].append(m)
|
|
# else:
|
|
# mnames[name] = [ m ]
|
|
# mnames.add(name)
|
|
# for y in x.findall('./rom'):
|
|
# rnames.add(y.get('name'))
|
|
|
|
|
|
# print("\n\n\n")
|
|
# ll = list(mnames.difference(EXCLUDE))
|
|
# ll.sort()
|
|
# for x in ll:
|
|
# print(x)
|
|
|
|
# if full: ROMS = list(mnames)
|
|
# else: ROMS = list(mnames.difference(EXCLUDE))
|
|
ROMS = [{ 'value': k, 'description': fix_machine_description(v, k)} for k, v in mnames.items()];
|
|
ROMS.sort(key=lambda x: x.get('description'))
|
|
|
|
# data = []
|
|
# data["source"] = "https://archive.org/download/mame0.224"
|
|
# data["type"] = "zip"
|
|
# data["version"] = "0.224"
|
|
#data["roms"] = ROMS
|
|
|
|
# for k in ROMS:
|
|
# data.append( { 'value': k, 'description': mnames[k] })
|
|
|
|
|
|
# print(ROMS)
|
|
if extra:
|
|
path = "../Ample/Resources/roms~extra.plist"
|
|
else:
|
|
path = "../Ample/Resources/roms.plist"
|
|
|
|
with open(path, "w") as f:
|
|
f.write(to_plist(ROMS))
|