summaryrefslogtreecommitdiff
path: root/dat.py
diff options
context:
space:
mode:
authorMyrika Fuwa2022-01-16 21:01:09 -0500
committerMyrika Fuwa2022-01-16 21:01:09 -0500
commit6b23ebc7d3c7da68e008adfa9a129e0f727aa53d (patch)
tree569ea69de5dfc2c5e00099cdb7727336dddbc5d7 /dat.py
downloaddatsum-master.tar.gz
datsum-master.zip
Initial commitHEADmaster
Diffstat (limited to 'dat.py')
-rw-r--r--dat.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/dat.py b/dat.py
new file mode 100644
index 0000000..f93c1a8
--- /dev/null
+++ b/dat.py
@@ -0,0 +1,132 @@
+# vim: set encoding=utf-8 noet ts=4
+# TODO: Better recursive multi-track (bin+cue) support
+# TODO: ClrMamePro, ListXML, RomCenter
+
+"""Parse DAT files for ROM management."""
+
+import xml.etree.ElementTree as ET
+from pathlib import Path
+
+class DAT:
+ """
+ DAT (ROM Management Datafile).
+ """
+ header = {}
+ name = ""
+ sums = []
+
+ def csv(self):
+ """
+ Print CRC-32 to csv4 (Comma Seperated Value) format.
+ """
+
+ for i in self.sums:
+ try:
+ path, name = i["name"].split("/")
+ except ValueError:
+ name = i["name"]
+ path = ""
+
+ print("\"{0}\",{1},{2},\"{3}\",".format(
+ name, i["size"], i["crc"], path
+ ))
+
+ def name(self, crc, size):
+ """
+ Get rom name from crc+size.
+ """
+
+ for i in self.sums:
+ if i["crc"] == crc and i["size"] == size:
+ return i["name"]
+
+ def md5sum(self):
+ """
+ Print MD5 to md5sum (GNU coreutils) format.
+ """
+
+ for i in self.sums:
+ print("{0} {1}/{2}".format(i["md5"], self.name, i["name"]))
+
+ def sfv(self):
+ """
+ Print CRC-32 to SFV (Simple File Verification) format.
+ """
+
+ print(";\n; DAT file converted by datsum")
+ print(";\n; Name: {0}".format(self.header["name"]))
+ print("; Version: {0}".format(self.header["version"]))
+ print("; Website: {0}\n;".format(self.header["url"]))
+
+ for i in self.sums:
+ print("{0}/{1} {2}".format(self.name, i["name"], i["crc"]))
+
+ def sha1sum(self):
+ """
+ Print SHA1 to sha1sum (GNU coreutils) format.
+ """
+
+ for i in self.sums:
+ print("{0} {1}/{2}".format(i["sha1"], self.name, i["name"]))
+
+class ClrMamePro:
+ """
+ ClrMamePro format.
+ """
+
+ pass
+
+class ListXML:
+ """
+ MAME List XML format.
+ """
+
+ pass
+
+class RomCenter:
+ """
+ RomCenter format.
+ """
+
+ pass
+
+class GenericXML(DAT):
+ """
+ Logiqx generic XML format.
+ """
+
+ def __init__(self, datafile):
+ """
+ Parse DAT file.
+ """
+
+ self.name = Path(datafile).stem
+
+ tree = ET.parse(datafile)
+ root = tree.getroot()
+
+ for header in root.findall('header'):
+ self.header = {
+ "name": header.find('name').text,
+ "description": header.find('description').text,
+ "version": header.find('version').text,
+ "author": header.find('author').text,
+ "homepage": header.find('homepage').text,
+ "url": header.find('url').text
+ }
+
+ for game in root.iter('game'):
+ count = sum(1 for _ in game.iter('rom'))
+ directory = ""
+
+ if count > 1:
+ directory = "{0}/".format(game.get('name'))
+
+ for rom in game.iter('rom'):
+ self.sums.append({
+ "crc": str(rom.get('crc').lower()),
+ "md5": str(rom.get('md5').lower()),
+ "name": str(directory + rom.get('name')),
+ "size": int(rom.get('size')),
+ "sha1": str(rom.get('sha1').lower())
+ })