iso7010print/main.py

86 lines
2.7 KiB
Python

import os
import sqlite3
import json
from quart import Quart, render_template, websocket, request, redirect, send_from_directory
import re
import requests
import subprocess
from io import UnsupportedOperation
app = Quart(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = True
headers = {
'User-Agent': 'iso7010print/0.0.1',
}
with open("dump.json") as f:
ws = sorted(
filter(lambda e: re.search("W\d+", e["name"]), json.load(f)),
key=lambda e: e["name"],
)
with open("custom.json") as cf:
cws = sorted(
json.load(cf),
key=lambda e: e["name"],
)
indexed = { w["name"]: w for w in ws} | { w["name"]: (w | dict(local=True)) for w in cws}
db = sqlite3.connect("counts.db")
cur = db.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS counts(what, count)")
@app.route("/", methods=["GET"])
async def home():
return await render_template("index.html", ws=ws, cws=cws)
@app.route('/static/<path:path>')
def staticfile(path):
return send_from_directory('static', path)
def printit(filename):
subprocess.run(f"brother_ql -b pyusb -p usb://0x04f9:0x2042 -m QL-700 print -l62 {filename}", shell=True, check=True)
@app.route("/", methods=["POST"])
async def print():
w = (await request.form)["w"]
thewarn = indexed[w]
if thewarn.get("local"):
printit(thewarn["url"].removeprefix("/"))
lol = thewarn["name"]
else:
filename = thewarn["url"].split("/")[-1]
lol = re.search('W\d+', filename)[0]
png_filename = f"{lol}.png"
quad_png_filename = f"{lol}_quad.png"
if not os.path.exists(filename):
r = requests.get(thewarn["url"], headers=headers)
r.raise_for_status()
with open(filename, "wb") as file:
file.write(r.content)
if not os.path.exists(png_filename):
subprocess.run(f"resvg {filename} {png_filename}", shell=True, check=True)
subprocess.run(f"convert {png_filename} -resize 696x -background white -alpha remove -alpha off -monochrome -threshold 20% {png_filename}", shell=True, check=True)
#if not os.path.exists(quad_png_filename):
# subprocess.run("magick -size 696x xc:white ({png_filename} -resize 50%x)
printit(png_filename)
# with open("count.txt", "w") as cf:
# try:
# c = int(cf.read())
# except UnsupportedOperation: # no file
# c = 0
# cf.write(str(c + 1))
cur.execute("""INSERT OR REPLACE INTO counts(what, count)
VALUES (:what,
COALESCE(
(SELECT count FROM counts
WHERE what=:what),
0) + 1);
""", dict(what=lol))
db.commit()
return redirect("/")
if __name__ == "__main__":
app.run()