You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
14 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import argparse
import sys
import os
import six
from random import randint
import random
from PIL import Image, ImageOps
import curses
import sys, termios, tty, os, time
import apirequest
import imageprinter
import requests
import subprocess
from subprocess import check_output
import datetime
import time
import re
class Printer():
ESC = b'\x1B'
FORMFEED = b'\x0C'
UNDERLINEDON = b'\x1B'+b'\x2D'+b'\x31'
ITALICON = b'\x1B'+b'\x34'
ITALICOFF = b'\x1B'+b'\x35'
BOLDON = b'\x1B'+b'\x45'
BOLDOFF = b'\x1B'+b'\x46'
DHON = b'\x1B'+b'\x77'+b'\x01'
DHOFF = b'\x1B'+b'\x77'+b'\x00'
COMPRON = b'\x1B'+b'\x0f'
COMPROFF = b'\x1B'+b'\x12'
CHANGE_EMULATION = ESC+b'\x7B'+b'\x65'
LINE_FEED = b'\n'
CARIDGE_RET = b'\x0D'
CHARWIDTH = 78
printedheight = 0
pages = 1
strokes = 0
debug = True
target = "/dev/usb/lp0"
if debug:
target = "/dev/tty"
def formfeed(self):
with open(self.target, 'wb') as printer:
if not self.debug:
while self.checkpagebreak(printer) == False:
self.printedheight+=(44/216)
printer.write(self.LINE_FEED)
def printchar(self,char):
with open(self.target, 'wb') as printer:
if self.debug:
printer.write(bytes(str(char), 'utf-8'))
else:
printer.write(self.ESC+b"\x7B"+b"\x41")
char=self.strokes*" "+char
printer.write(bytes(str(char), 'utf-8'))
printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00")
self.strokes += 1
if(self.strokes>self.CHARWIDTH):
self.checkpagebreak(printer)
self.printedheight+=(44/216)
printer.write(self.LINE_FEED)
self.strokes = 0
def printstring(self,string, formating="p"):
strokesinline = 0
with open(self.target, 'wb') as printer:
if self.debug:
if formating == "u":
printer.write(b"\x1B"+b"\x5B"+b"\x34"+b"\x6D")
printer.write(bytes(str(string), 'utf-8'))
printer.write(b"\x1B"+b"\x5B"+b"\x30"+b"\x6D")
else:
for word in re.split(r'(\s+)', string):
strokesinline += len(word)
if "\n" in word:
strokesinline = 0
if strokesinline > self.CHARWIDTH:
printer.write(self.LINE_FEED)
strokesinline = len(word)
if not (strokesinline == 1 and word == " "):
printer.write(bytes(str(word), 'utf-8'))
else:
printer.write(self.ESC+b"\x7B"+b"\x41")
printer.write(self.ESC + b"\x33" + bytes([44]));
if formating == "u":
printer.write(self.BOLDON)
if formating == "i":
printer.write(self.ITALICON)
if formating == "dh":
printer.write(self.DHON)
if formating == "compr":
printer.write(self.COMPRON)
if self.printedheight > 11.69:
printer.write(bytes(str("NEW PAGE YESY"), 'utf-8'));
self.printedheight=0
for word in re.split(r'(\s+)', string):
strokesinline += len(word)
if "\n" in word:
strokesinline = 0
self.printedheight+=(44/216)
if strokesinline > self.CHARWIDTH:
self.checkpagebreak(printer)
self.printedheight+=(44/216)
printer.write(self.LINE_FEED)
strokesinline = len(word)
if not (strokesinline == 1 and word == " "):
printer.write(bytes(str(word), 'utf-8'))
if formating == "u":
printer.write(self.BOLDOFF)
if formating == "i":
printer.write(self.ITALICOFF)
if formating == "dh":
printer.write(self.DHOFF)
if formating == "compr":
printer.write(self.COMPROFF)
printer.write(self.ESC+b"\x25"+b"\x46"+b"\x0F"+b"\x00"+b"\x04"+b"\x08"+b"\x00")
try:
self.newline()
except:
time.sleep(1)
self.newline()
def newline(self):
global strokes
with open(self.target, 'wb') as printer:
if not self.debug:
self.checkpagebreak(printer)
printer.write(self.ESC + b"\x33" + bytes([44]));
self.printedheight+=(44/216)
printer.write(self.LINE_FEED)
self.strokes = 0
def checkpagebreak(self, printer):
if self.printedheight+(44/216)*4 > 11.69:
printer.write(self.LINE_FEED)
printer.write(self.LINE_FEED)
printer.write(bytes(str("PAGE "+str(self.pages)), 'utf-8'));
printer.write(self.ESC + b"\x33" + bytes([44]));
printer.write(self.LINE_FEED)
printer.write(self.LINE_FEED)
printer.write(self.LINE_FEED)
printer.write(self.COMPRON)
printer.write(bytes(str("------------------------------------------------------ POETIC SOFTWARE PUBLICATION -----------------------------------------------------"), 'utf-8'));
printer.write(self.COMPROFF)
printer.write(self.LINE_FEED)
self.printedheight=(44/216)
self.pages+=1
return True
else:
return False
def printimagefromurl(self, url):
page = requests.get(url)
f_ext = os.path.splitext(url)[-1]
f_name = 'img{}'.format(f_ext)
with open(f_name, 'wb') as f:
f.write(page.content)
if self.debug:
rows, columns = os.popen('stty size', 'r').read().split()
#subprocess.call(["catimg","-w",columns,f_name])
subprocess.call(["feh",f_name])
else:
imagelines = imageprinter.print(f_name,True)
isodd = False
if imagelines % 2 == 1:
isodd = True
imagelines+=1
if self.printedheight + (22/216)*imagelines +(44/216)*4 > 11.69:
self.formfeed()
self.printedheight += (22/216)*imagelines
imageprinter.print(f_name)
if isodd:
with open('/dev/usb/lp0', 'wb') as printer:
printer.write(ESC + b"\x33" + bytes([22]));
printer.write(self.LINE_FEED)
printer.write(ESC + b"\x33" + bytes([44]));
class Terminal():
lineinput = ""
commandMode = True
writeloop = True
commands = {
"help":"get help on the commands",
"start":"start publication",
"list":"list theses and exercises",
"exercise <number>":"see the exercise with the <number> specified",
"thesis <number>":"see the thesis with the <number> specified",
"whois <person>":"get biography of person given",
"exit":"finish the publication",
}
def __init__(self,printer, persons):
self.printer = printer
self.persons = persons
def waittostart(self):
self.writeloop = True
while self.writeloop:
char = self.getch()
self.writeloop = False
self.lineinput = ""
continue
def waitforinput(self, nocommand=False):
self.writeloop = True
self.printer.printchar("> ")
while self.writeloop:
char = self.getch()
if (ord(char) == 27):
print("exit publication :-(")
exit(0)
if (ord(char) == 13):
self.printer.newline()
if not nocommand:
if not self.lineinput == "":
self.command(self.lineinput)
self.lineinput = ""
self.printer.printchar("> ")
else:
self.writeloop = False
else:
self.lineinput+=char
self.printer.printchar(char)
def getch(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def scanwifi(self):
self.printer.newline()
out = check_output(["nmcli", "dev", "wif"])
self.printer.printstring(out.decode("utf-8"))
def list(self):
printer.printstring("theses on POETIC SOFTWARE", "u")
result = apirequest.getcategory("thesis")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
printer.printstring("exercises in POETIC SOFTWARE","u")
result = apirequest.getcategory("exercise")
for i, line in enumerate(result):
printer.printstring(str(i+1)+" "+line)
printer.newline()
def command(self, command):
#print("received command: "+str(command))
if "help" == str(command):
self.printer.printstring("The user in this publication is an active agent. The publication can be assembled according to your own wishes using commands. The following commands can be used.")
for key, help in self.commands.items():
self.printer.printstring(key+":")
self.printer.printstring(" "+help)
#self.writeloop = False
elif "list" == str(command):
self.list()
elif "start" == str(command) or "restart" == str(command):
main()
elif "ff" == str(command):
printer.formfeed()
elif str(command).split(" ")[0] == "exercise" or str(command).split(" ")[0] == "thesis":
part = str(command).split(" ")[0]
arguments = str(command.strip()).split(" ")
arguments.pop(0)
if len(arguments) < 1:
self.printer.printstring("no argument given. Usage: "+part+" <number>")
else:
for i,arg in enumerate(arguments):
if arg.isdigit():
number = int(arg)
if number > len(apirequest.getcategory(part)):
self.printer.printstring("Number must be inbetween 1 and "+ str(len(apirequest.getcategory(part))))
else:
result = apirequest.getimages(part, number)
for img in result:
printer.printimagefromurl(img)
result = apirequest.gettitle(part, number)
for line in result:
self.printer.printstring(line, "u")
result = apirequest.getcontent(part, number)
for line in result:
self.printer.printstring(line)
if apirequest.gettitle(part, number)[0] == "Wifi Poem":
self.scanwifi()
self.printer.newline()
else:
self.printer.printstring("not a number")
elif str(command).split(" ")[0] == "whois":
if str(command).split(" ")[1] in self.persons:
self.printer.printstring(self.persons[str(command).split(" ")[1]])
else:
self.printer.printstring("Sorry not found, try " + random.choice(list(self.persons)))
elif "exit" == str(command):
self.printer.printstring("Imprint", "u")
self.printer.newline()
self.printer.printstring("2019, Piet Zwart Institute, Rotterdam")
self.printer.printstring("Published by Alexander Roidl")
self.printer.printstring("and (enter your name)")
self.printer.newline()
self.waitforinput(nocommand=True)
self.printer.newline()
self.printer.printstring("Special thanks to Aymeric Mansoux, Marloes de Valk, Michael Murtaugh, André Castro, Clara Balaguer, Amy Suo Wu, Leslie Robbins, Angeliki, Alice, Tash, Zalan, Joca, Jule")
self.printer.newline()
main()
else:
self.printer.printstring("~ command not found. try help for a list of available commands")
self.printer.newline()
#if the command is valid we want to execute the command and continue the story
#self.writeloop = False
persons = {
"Kittler":"Friedrich A. Kittler (June 12, 1943 October 18, 2011) was a literary scholar and a media theorist. His works relate to media, technology, and the military. ",
"Alex":"Alexander Roidl created Poetic Software as part of his Master's thesis.",
"Jule":"Jule Ulrych is an evironmental activist and passionate vegan food lover living in Den Haag."
}
printer = Printer()
term = Terminal(printer, persons)
now = datetime.datetime.now()
def main():
term.waittostart()
printer.printstring("W E L C O M E !", "dh")
printer.newline()
printer.printstring(now.strftime("%Y-%m-%d %H:%M"), "compr")
printer.newline()
# printer.formfeed()
printer.printimagefromurl("https://www.sanfranciscobaycoffee.com/wp-content/uploads/2017/03/52279468.jpg")
# printer.printstring("---------------")
# printer.printstring("POETIC SOFTWARE")
# printer.printstring("---------------")
# printer.printstring("type help for help")
# printer.newline()
# result = apirequest.gettitle("introduction", 1)
# for line in result:
# printer.printstring(line, "u")
# result = apirequest.getcontent("introduction", 1)
# for line in result:
# printer.printstring(line)
printer.newline()
# term.list()
printer.printstring("SELECT which one to see, for exercise type: exercise <number> and for thesis type: thesis <number>")
printer.newline()
term.waitforinput()
main()