Initial commit
This commit is contained in:
213
mame.py
Normal file
213
mame.py
Normal file
@@ -0,0 +1,213 @@
|
||||
import os
|
||||
import zipfile
|
||||
import subprocess
|
||||
import pickle
|
||||
from lxml import etree
|
||||
|
||||
from config import debug
|
||||
from utils import getMameResource
|
||||
|
||||
|
||||
class mameROM(object):
|
||||
def __init__(self):
|
||||
self.name = ""
|
||||
self.cloneof = None
|
||||
self.description = ""
|
||||
self.year = ""
|
||||
self.manufacturer = ""
|
||||
self.status = ""
|
||||
self.category = ""
|
||||
|
||||
def __str__(self):
|
||||
return self.description
|
||||
|
||||
def __repr__(self):
|
||||
return '%s("%s", "%s", "%s", "%s", "%s", "%s", "%s")' % (
|
||||
self.__class__.__name__,
|
||||
self.name,
|
||||
self.cloneof,
|
||||
self.description,
|
||||
self.year,
|
||||
self.manufacturer,
|
||||
self.status,
|
||||
self.category,
|
||||
)
|
||||
|
||||
|
||||
class mameROMs(object):
|
||||
def __init__(self, config, datadir):
|
||||
self.all_roms = []
|
||||
self.roms = []
|
||||
self.all_categories = []
|
||||
self.categories = []
|
||||
self.catdict = {}
|
||||
self.len = 0
|
||||
self.cfg = config
|
||||
self.data_dir = datadir
|
||||
self.hide_mature = self.cfg["HideMature"]
|
||||
self.emulator_dir = os.path.split(self.cfg["EXE"])[0]
|
||||
|
||||
self.parse()
|
||||
self.filter()
|
||||
|
||||
self.snapdir = getMameResource(self.emulator_dir, "snap", is_dir=True)
|
||||
self.marqueesdir = getMameResource(self.emulator_dir, "marquees", is_dir=True)
|
||||
self.titlesdir = getMameResource(self.emulator_dir, "titles", is_dir=True)
|
||||
self.videosnapsdir = getMameResource(self.emulator_dir, "videosnaps", is_dir=True)
|
||||
self.info = getMameResource(self.emulator_dir, "mameinfo.dat", is_dir=False)
|
||||
self.hostory = getMameResource(self.emulator_dir, "history.dat", is_dir=False)
|
||||
|
||||
def get_mame_version(self):
|
||||
mamerun = subprocess.run([self.cfg["EXE"], "-?"], stdout=subprocess.PIPE)
|
||||
output = mamerun.stdout.decode("utf-8")
|
||||
output = output[output.find("v") :]
|
||||
output = output[: output.find(" ")]
|
||||
|
||||
return output
|
||||
|
||||
def parse(self):
|
||||
if not debug:
|
||||
mame_version = self.get_mame_version()
|
||||
print(mame_version)
|
||||
|
||||
xmlfile = os.path.join(self.emulator_dir, "mame.xml")
|
||||
datfile = os.path.join(self.data_dir, "mame.dat")
|
||||
|
||||
if not debug:
|
||||
if self.cfg["Version"] != mame_version:
|
||||
self.cfg["Version"] = mame_version
|
||||
|
||||
if os.path.isfile(xmlfile):
|
||||
os.unlink(xmlfile)
|
||||
|
||||
if os.path.isfile(datfile):
|
||||
with open(datfile, "rb") as i:
|
||||
temp_mame_version = pickle.load(i)
|
||||
|
||||
if debug or temp_mame_version == mame_version:
|
||||
self.all_categories = pickle.load(i)
|
||||
self.all_roms = pickle.load(i)
|
||||
return True
|
||||
|
||||
os.unlink(datfile, "mame.dat")
|
||||
|
||||
tempcat = {}
|
||||
catfile = open(os.path.join(self.emulator_dir, "catver.ini"))
|
||||
|
||||
found = False
|
||||
for line in catfile:
|
||||
line = line.strip()
|
||||
if line == "[VerAdded]":
|
||||
break
|
||||
if line == "[Category]":
|
||||
found = True
|
||||
if found and line != "" and line[0] != ";" and line[0] != "[":
|
||||
# zwackery=Platform / Run Jump
|
||||
game, category = line.split("=")
|
||||
tempcat[game] = category
|
||||
if category not in self.all_categories:
|
||||
self.all_categories.append(category)
|
||||
self.catdict[category] = 0
|
||||
|
||||
self.all_categories.sort()
|
||||
self.all_categories.insert(0, "All Games")
|
||||
self.all_categories.append("Unknown")
|
||||
self.catdict["All Games"] = 1
|
||||
self.catdict["Unknown"] = 0
|
||||
|
||||
if not os.path.isfile(xmlfile):
|
||||
try:
|
||||
with open(xmlfile, "w") as out:
|
||||
retcode = subprocess.call([self.cfg["EXE"], "-listxml"], stdout=out)
|
||||
if retcode != 0:
|
||||
try:
|
||||
os.unlink(xmlfile)
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
except OSError:
|
||||
try:
|
||||
os.unlink(xmlfile)
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
with open(os.path.join(self.data_dir, "mame_exclude.txt"), "rt") as f:
|
||||
exclude = f.readlines()
|
||||
exclude = [x.strip() for x in exclude]
|
||||
|
||||
tree = etree.parse(xmlfile)
|
||||
|
||||
rom = None
|
||||
for child in tree.getiterator():
|
||||
if child.tag == "machine":
|
||||
if rom:
|
||||
if rom.category not in exclude:
|
||||
self.all_roms.append(rom)
|
||||
self.catdict[rom.category] += 1
|
||||
rom = None
|
||||
if "runnable" in child.attrib and child.attrib["runnable"] == "yes":
|
||||
rom = mameROM()
|
||||
rom.name = child.attrib["name"]
|
||||
else:
|
||||
rom = None
|
||||
if rom and "cloneof" in child.attrib:
|
||||
rom.cloneof = child.attrib["cloneof"]
|
||||
if rom and rom.name in tempcat:
|
||||
rom.category = tempcat[rom.name]
|
||||
elif rom and rom.cloneof in tempcat:
|
||||
rom.category = tempcat[rom.cloneof]
|
||||
elif rom:
|
||||
rom.category = "Unknown"
|
||||
elif rom and child.tag == "description":
|
||||
rom.description = child.text
|
||||
elif rom and child.tag == "year":
|
||||
rom.year = child.text
|
||||
elif rom and child.tag == "manufacturer":
|
||||
rom.manufacturer = child.text
|
||||
elif rom and child.tag == "driver":
|
||||
rom.status = child.attrib["status"]
|
||||
|
||||
if rom:
|
||||
if rom.category not in exclude:
|
||||
self.all_roms.append(rom)
|
||||
|
||||
for cat in self.catdict:
|
||||
if self.catdict[cat] == 0:
|
||||
del self.all_categories[self.all_categories.index(cat)]
|
||||
|
||||
with open(datfile, "wb") as output:
|
||||
pickle.dump(mame_version, output)
|
||||
pickle.dump(self.all_categories, output)
|
||||
pickle.dump(self.all_roms, output)
|
||||
|
||||
return True
|
||||
|
||||
def filter(self):
|
||||
self.roms = []
|
||||
|
||||
for rom in self.all_roms:
|
||||
if rom.status in self.cfg["StatusFilter"]:
|
||||
if self.cfg["Category"] == "All Games" or self.cfg["Category"] == rom.category:
|
||||
if self.cfg["ShowClones"] or rom.cloneof is None:
|
||||
if not self.hide_mature or "* Mature *" not in rom.category:
|
||||
self.roms.append(rom)
|
||||
|
||||
if self.cfg["Sort"] == "Name Asc":
|
||||
self.roms.sort(key=lambda x: x.description.lower(), reverse=False)
|
||||
elif self.cfg["Sort"] == "Name Dec":
|
||||
self.roms.sort(key=lambda x: x.description.lower(), reverse=True)
|
||||
elif self.cfg["Sort"] == "Year Asc":
|
||||
self.roms.sort(key=lambda x: x.year.lower(), reverse=False)
|
||||
elif self.cfg["Sort"] == "Year Dec":
|
||||
self.roms.sort(key=lambda x: x.year.lower(), reverse=True)
|
||||
|
||||
self.len = len(self.roms)
|
||||
|
||||
if self.hide_mature:
|
||||
self.categories = []
|
||||
for category in self.all_categories:
|
||||
if "* Mature *" not in category:
|
||||
self.categories.append(category)
|
||||
else:
|
||||
self.categories = self.all_categories
|
||||
Reference in New Issue
Block a user