mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-07 17:36:00 +00:00
118 lines
4.5 KiB
Python
Executable file
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()
|