76 lines
1.8 KiB
Python
Executable File
76 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import re
|
|
import sys
|
|
from collections import OrderedDict
|
|
|
|
def unique(seq):
|
|
return list(OrderedDict([i, None] for i in seq if i))
|
|
|
|
def generate(major, minor, exts):
|
|
exts = exts[:]
|
|
yield f"{major}/{minor}", exts
|
|
if (minor.startswith("x-")):
|
|
yield f"{major}/{minor[2:]}", exts
|
|
else:
|
|
yield f"{major}/x-{minor}", exts
|
|
for ext in exts:
|
|
yield f"{major}/{ext}", exts
|
|
yield f"{major}/x-{ext}", exts
|
|
|
|
|
|
def make(text, final):
|
|
lines = "".join([
|
|
line.strip()
|
|
for line in re.search(r"\{(.*)\}", text, re.S).group(1).split("\n")
|
|
if line.strip() and not line.strip().startswith("#")
|
|
]).split(";")
|
|
|
|
additional = []
|
|
for line in lines:
|
|
if not line:
|
|
continue
|
|
m = re.match(r"([a-z1-9]+)/([^\s]+)\s+(.+?)$", line)
|
|
if not m:
|
|
continue
|
|
[major, minor, exts] = m.groups()
|
|
exts = unique(e.lower().strip() for e in exts.split(" ") if e.strip())
|
|
mime = f"{major}/{minor}"
|
|
if mime == "application/octet-stream":
|
|
continue
|
|
if mime in final:
|
|
final[mime] += exts
|
|
continue
|
|
final[mime] = exts
|
|
additional += (major, minor, exts),
|
|
|
|
for [major, minor, exts] in additional:
|
|
for [mime, exts] in generate(major, minor, exts):
|
|
if mime in final:
|
|
continue
|
|
final[mime] = exts
|
|
|
|
final = OrderedDict()
|
|
for file in sys.argv[1:]:
|
|
with open(file, "r") as fp:
|
|
make(fp.read(), final)
|
|
|
|
multi = dict()
|
|
for [mime, exts] in list(final.items()):
|
|
exts = unique(exts)
|
|
prim = exts[0]
|
|
final[mime] = prim
|
|
if len(exts) == 1:
|
|
continue
|
|
exts = exts[1:]
|
|
if len(exts) == 1:
|
|
multi[prim] = exts[0]
|
|
else:
|
|
multi[prim] = exts
|
|
|
|
final = OrderedDict(sorted(final.items()))
|
|
multi = OrderedDict(sorted(multi.items()))
|
|
|
|
print(json.dumps(dict(e=multi, m=final), indent=2))
|
|
print("generated", len(final), "mimes", "with", len(multi), "multis", file=sys.stderr) |