spiegel-keyman/linux/keyman-config/experiments/list_kmp.py

118 lines
4.5 KiB
Python
Executable file

#!/usr/bin/python3
import datetime
import logging
import os
import requests
import requests_cache
import subprocess
import tempfile
import time
from dirlist import list_keyboards
#from keymankeyboards import get_api_keyboards
#from keyman_config import get_kmp, install_kmp
from keyman_config.get_kmp import get_keyboard_data, get_kmp_file, keyman_cache_dir
from keyman_config.install_kmp import get_metadata, get_infdata, extract_kmp
#TODO check for kmn and check if it is compilable
#TODO extra output files jsonkmpnokmn, jsonkmpbadkmn, goodjsonkmpkmn and for inf as well
def get_kmn(kbid, sourcePath):
base_url = "https://raw.github.com/keymanapp/keyboards/master/" + sourcePath
kmn_url = base_url + "/source/" + kbid + ".kmn"
cache_dir = keyman_cache_dir()
current_dir = os.getcwd()
expire_after = datetime.timedelta(days=7)
if not os.path.isdir(cache_dir):
os.makedirs(cache_dir)
os.chdir(cache_dir)
requests_cache.install_cache(cache_name='keyman_cache', backend='sqlite', expire_after=expire_after)
now = time.ctime(int(time.time()))
response = requests.get(kmn_url)
logging.debug("Time: {0} / Used Cache: {1}".format(now, response.from_cache))
os.chdir(current_dir)
requests_cache.core.uninstall_cache()
return requests.get(kmn_url)
def main():
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s:%(message)s')
keyboarddata = list_keyboards()
if keyboarddata:
with open('./nokmp.txt', 'wt') as nokmp, \
open('./infnokeyboard.txt', 'wt') as infnokeyboard, \
open('./goodjsonkmpkmn.txt', 'wt') as goodjsonkmpkmn, \
open('./jsonkmpnokmn.txt', 'wt') as jsonkmpnokmn, \
open('./jsonkmpbadkmn.txt', 'wt') as jsonkmpbadkmn, \
open('./jsonkmpmissingkmn.txt', 'wt') as jsonkmpmissingkmn, \
open('./brokeninf.txt', 'wt') as brokeninf, \
open('./nodata.txt', 'wt') as nodata, \
open('./goodinfkmp.txt', 'wt') as goodinfkmp:
print("Keyboard: will work in kmfl :)", file=goodjsonkmpkmn) # goodjsonkmpkmn
print("Keyboard: has uncompilable kmn", file=jsonkmpbadkmn) # jsonkmpbadkmn
print("Keyboard: has json in kmp but can't find the kmn on github", file=jsonkmpmissingkmn) # jsonkmpmissingkmn
print("Keyboard: has json in kmp but has no sourcePath to look for kmn on github", file=jsonkmpnokmn) # jsonkmpnokmn
print("Keyboard: has kmp with kmp.inf", file=goodinfkmp)
print("Keyboard: has kmp with kmp.inf but it has no Keyboard", file=infnokeyboard)
print("Keyboard: has kmp but no kmp.json and no or broken kmp.inf", file=brokeninf)
print("Keyboard: does not have kmp so mobile/web only", file=nokmp)
print("Keyboard: has no data", file=nodata)
for kbid in keyboarddata:
kbdata = get_keyboard_data(kbid, True)
print(kbid)
if kbdata:
if 'packageFilename' in kbdata:
kmpfile = get_kmp_file(kbdata, True)
with tempfile.TemporaryDirectory() as tmpdirname:
extract_kmp(kmpfile, tmpdirname)
try:
info, system, options, keyboards, files = get_metadata(tmpdirname)
if keyboards:
if 'sourcePath' in kbdata:
response = get_kmn(kbid, kbdata['sourcePath'])
if response.status_code == 200:
kmndownloadfile = os.path.join(tmpdirname, kbid + ".kmn")
with open(kmndownloadfile, 'wb') as f:
f.write(response.content)
subprocess.run(["kmflcomp", kmndownloadfile], stdout=subprocess.PIPE, stderr= subprocess.STDOUT)
kmfl_file = os.path.join(tmpdirname, kbid + ".kmfl")
if os.path.isfile(kmfl_file):
logging.debug("goodjsonkmpkmn")
print(kbid, file=goodjsonkmpkmn) # goodjsonkmpkmn
else:
logging.debug("jsonkmpbadkmn")
print(kbid, file=jsonkmpbadkmn) # jsonkmpbadkmn
else:
logging.debug("jsonkmpmissingkmn")
print(kbid, file=jsonkmpmissingkmn) # jsonkmpmissingkmn
else:
logging.debug("jsonkmpnokmn")
print(kbid, file=jsonkmpnokmn) # jsonkmpnokmn
else:
info, system, options, keyboards, files = get_infdata(tmpdirname)
if keyboards:
logging.debug("infnokeyboard")
print(kbid, file=goodinfkmp)
elif files:
logging.debug("goodinfkmp")
print(kbid, file=infnokeyboard)
else:
print(kbid, file=brokeninf)
except KeyError:
logging.debug("brokeninf")
print(kbid, file=brokeninf)
else:
logging.debug("nokmp")
print(kbid, file=nokmp)
else:
logging.debug("nodata")
print(kbid, file=nodata)
if __name__ == "__main__":
main()