Initial commit
This commit is contained in:
241
receipt.py
Executable file
241
receipt.py
Executable file
@@ -0,0 +1,241 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from escpos import *
|
||||
from PIL import Image
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import random
|
||||
import requests
|
||||
from urllib.parse import quote
|
||||
|
||||
OBJECT_WORDS = [
|
||||
# Household
|
||||
"chair", "table", "bed", "sofa", "lamp", "mirror", "clock", "rug", "curtain", "pillow",
|
||||
"blanket", "mattress", "dresser", "cabinet", "cushion", "towel", "toothbrush", "toothpaste", "soap", "shampoo",
|
||||
"conditioner", "bathtub", "shower", "toilet", "sink", "faucet", "bucket", "broom", "mop", "vacuum",
|
||||
|
||||
# Kitchen
|
||||
"fridge", "freezer", "microwave", "oven", "stove", "pan", "pot", "plate", "bowl", "cup",
|
||||
"mug", "glass", "spoon", "fork", "knife", "ladle", "whisk", "tongs", "grater", "peeler",
|
||||
"blender", "toaster", "kettle", "cutting board", "napkin", "coaster", "measuring cup", "measuring spoon", "dishwasher", "tray",
|
||||
|
||||
# Office/School
|
||||
"desk", "chair", "notebook", "pen", "pencil", "marker", "eraser", "ruler", "calculator", "scissors",
|
||||
"glue", "paper", "folder", "binder", "clip", "tape", "stapler", "staples", "highlighter", "whiteboard",
|
||||
"projector", "laptop", "computer", "mouse", "keyboard", "monitor", "printer", "cable", "router", "charger",
|
||||
|
||||
# Personal items
|
||||
"wallet", "phone", "watch", "glasses", "sunglasses", "hat", "jacket", "scarf", "shirt", "pants",
|
||||
"shorts", "shoes", "socks", "belt", "bag", "backpack", "suitcase", "umbrella", "key", "keychain",
|
||||
"comb", "brush", "mirror", "lotion", "perfume", "deodorant", "nail clipper", "razor", "makeup", "lipstick",
|
||||
|
||||
# Electronics
|
||||
"TV", "remote", "camera", "tripod", "microphone", "speaker", "headphones", "battery", "lightbulb", "fan",
|
||||
"heater", "air conditioner", "thermostat", "game console", "joystick", "tablet", "smartwatch", "flash drive", "hard drive", "drone",
|
||||
|
||||
# Tools
|
||||
"hammer", "screwdriver", "wrench", "pliers", "saw", "drill", "nail", "screw", "bolt", "nut",
|
||||
"tape measure", "level", "chisel", "axe", "shovel", "ladder", "toolbox", "work gloves", "flashlight", "crowbar",
|
||||
|
||||
# Art/music
|
||||
"paintbrush", "canvas", "palette", "easel", "crayon", "chalk", "charcoal", "ink", "violin", "guitar",
|
||||
"piano", "flute", "drum", "trumpet", "microphone", "amp", "sheet music", "metronome", "pick", "tuner",
|
||||
|
||||
# Toys/Games
|
||||
"ball", "doll", "puzzle", "board game", "card", "dice", "yo-yo", "kite", "teddy bear", "lego",
|
||||
"action figure", "marble", "slingshot", "skateboard", "bike", "helmet", "scooter", "trampoline", "swing", "slide",
|
||||
|
||||
# Nature-related
|
||||
"rock", "stick", "leaf", "flower", "tree", "shell", "feather", "pinecone", "sand", "mud",
|
||||
"log", "acorn", "fruit", "apple", "banana", "orange", "grape", "pear", "mango", "watermelon",
|
||||
|
||||
# Misc
|
||||
"trophy", "medal", "flag", "banner", "map", "globe", "calendar", "watch", "ticket", "passport",
|
||||
"ID card", "coin", "bill", "envelope", "stamp", "basket", "box", "crate", "bin", "jar",
|
||||
"bottle", "can", "barrel", "hose", "funnel", "net", "rope", "chain", "hook", "magnet",
|
||||
|
||||
# Vehicles/Transport
|
||||
"car", "truck", "bus", "bicycle", "motorcycle", "train", "plane", "boat", "ship", "scooter",
|
||||
"skates", "wheel", "engine", "mirror", "seatbelt", "tire", "pedal", "horn", "trunk", "helmet"
|
||||
|
||||
# Mammals
|
||||
"dog", "cat", "horse", "cow", "pig", "goat", "sheep", "lion", "tiger", "elephant",
|
||||
"monkey", "chimpanzee", "gorilla", "deer", "moose", "bear", "wolf", "fox", "rabbit", "kangaroo",
|
||||
"rat", "mouse", "squirrel", "bat", "zebra", "giraffe", "leopard", "cheetah", "panther", "raccoon",
|
||||
"otter", "hedgehog", "sloth", "armadillo", "koala", "beaver", "buffalo", "bison", "donkey", "reindeer",
|
||||
|
||||
# Birds
|
||||
"sparrow", "pigeon", "crow", "eagle", "hawk", "falcon", "owl", "duck", "goose", "swan",
|
||||
"penguin", "parrot", "canary", "flamingo", "peacock", "chicken", "rooster", "turkey", "vulture", "woodpecker",
|
||||
"heron", "ostrich", "emu", "seagull", "albatross", "dove", "crane", "bluejay", "hummingbird", "toucan",
|
||||
|
||||
# Reptiles & Amphibians
|
||||
"snake", "lizard", "crocodile", "alligator", "gecko", "iguana", "chameleon", "turtle", "tortoise", "frog",
|
||||
"toad", "salamander", "newt", "python", "cobra", "viper", "anole", "skink", "monitor", "komodo dragon",
|
||||
|
||||
# Fish & Aquatic Creatures
|
||||
"shark", "dolphin", "whale", "seal", "sea lion", "otter", "octopus", "squid", "jellyfish", "crab",
|
||||
"lobster", "clam", "oyster", "starfish", "eel", "ray", "anchovy", "tuna", "salmon", "trout",
|
||||
"bass", "catfish", "swordfish", "marlin", "anglerfish", "pufferfish", "seahorse", "guppy", "goldfish", "betta",
|
||||
|
||||
# Insects & Arachnids
|
||||
"ant", "bee", "wasp", "hornet", "butterfly", "moth", "fly", "mosquito", "dragonfly", "grasshopper",
|
||||
"cricket", "ladybug", "beetle", "firefly", "termite", "cockroach", "aphid", "spider", "scorpion", "tick",
|
||||
|
||||
# Farm & Domestic Animals
|
||||
"cow", "horse", "pig", "goat", "sheep", "chicken", "dog", "cat", "duck", "goose",
|
||||
"donkey", "rabbit", "llama", "alpaca", "turkey", "ox", "rooster", "hen", "ferret", "guinea pig",
|
||||
|
||||
# Jungle/Wild Animals
|
||||
"tiger", "lion", "panther", "leopard", "jaguar", "monkey", "gorilla", "chimpanzee", "elephant", "rhino",
|
||||
"hippopotamus", "giraffe", "zebra", "hyena", "baboon", "okapi", "aardvark", "warthog", "capybara", "tapir",
|
||||
|
||||
# Arctic/Antarctic Animals
|
||||
"polar bear", "walrus", "seal", "penguin", "orca", "narwhal", "snowy owl", "arctic fox", "caribou", "musk ox",
|
||||
|
||||
# Desert Animals
|
||||
"camel", "fennec fox", "meerkat", "jerboa", "scorpion", "gila monster", "horned lizard", "kudu", "oryx", "roadrunner",
|
||||
]
|
||||
|
||||
|
||||
# Return T20II printer
|
||||
def get_T20II_usb():
|
||||
p = printer.Usb(0x04b8, 0x0202) #, profile="TM-T20II")
|
||||
# p.set_with_default(align='center', font='a', bold=False, width=2, height=2, custom_size=True, smooth=True)
|
||||
return p
|
||||
|
||||
def get_T20II_ethernet():
|
||||
p = printer.Network("192.168.192.168", port=9100)#, profile="TM-T20II")
|
||||
# p.set_with_default(align='center', font='a', bold=False, width=2, height=2, custom_size=True, smooth=True)
|
||||
return p
|
||||
|
||||
def resize_image_to_fullwidth(img_src_name, target_width=576):
|
||||
# Make fullwidth dir
|
||||
os.makedirs('img_fullwidth', exist_ok=True)
|
||||
|
||||
# Open the image
|
||||
img = Image.open(img_src_name)
|
||||
|
||||
# Get original dimensions
|
||||
width, height = img.size
|
||||
|
||||
# Calculate new height to maintain aspect ratio
|
||||
aspect_ratio = height / width
|
||||
new_height = int(target_width * aspect_ratio)
|
||||
|
||||
# Resize the image
|
||||
resized_img = img.resize((target_width, new_height), Image.LANCZOS)
|
||||
|
||||
# Save the resized image
|
||||
name, ext = os.path.splitext(img_src_name)
|
||||
filename_no_ext = os.path.splitext(os.path.basename(img_src_name))[0]
|
||||
|
||||
# Build destination filename
|
||||
dest_name = f"img_fullwidth/{filename_no_ext}_fullwidth{ext}"
|
||||
resized_img.save(dest_name)
|
||||
return dest_name
|
||||
|
||||
import os
|
||||
import requests
|
||||
import random
|
||||
|
||||
def get_random_bant_image():
|
||||
# Create img directory if it doesn't exist
|
||||
os.makedirs('img', exist_ok=True)
|
||||
|
||||
# Fetch the catalog JSON for /bant/
|
||||
url = "https://a.4cdn.org/bant/catalog.json"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
catalog = response.json()
|
||||
|
||||
# Flatten the list of threads from all pages
|
||||
threads = [thread for page in catalog for thread in page['threads']]
|
||||
|
||||
# Filter threads that have images (tim and ext fields)
|
||||
image_threads = [
|
||||
thread for thread in threads
|
||||
if 'tim' in thread and 'ext' in thread and thread['ext'].lower() not in ['.gif', '.mp4', '.webm']
|
||||
]
|
||||
|
||||
if not image_threads:
|
||||
return None # No images found
|
||||
|
||||
# Choose a random thread with an image
|
||||
thread = random.choice(image_threads)
|
||||
|
||||
# Construct image URL
|
||||
image_url = f"https://i.4cdn.org/bant/{thread['tim']}{thread['ext']}"
|
||||
filename = f"img/{thread['tim']}{thread['ext']}"
|
||||
|
||||
# Download and save image
|
||||
img_response = requests.get(image_url)
|
||||
img_response.raise_for_status()
|
||||
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(img_response.content)
|
||||
|
||||
return filename
|
||||
|
||||
def print_random_bant_image(p, sh_file):
|
||||
img = get_random_bant_image()
|
||||
filename_no_ext = os.path.splitext(os.path.basename(img))[0]
|
||||
p.textln(filename_no_ext)
|
||||
fimg = resize_image_to_fullwidth(img)
|
||||
try:
|
||||
p.image(fimg, impl='bitImageColumn');
|
||||
except:
|
||||
subprocess.run(["bash", sh_file], check=True)
|
||||
p = get_T20II_ethernet()
|
||||
p.cut()
|
||||
|
||||
def main():
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
sh_file = os.path.join(script_dir, "connect_recipt.sh")
|
||||
subprocess.run(["bash", sh_file], check=True)
|
||||
p = get_T20II_ethernet()
|
||||
|
||||
print_random_bant_image(p, sh_file)
|
||||
return
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
def fun(p, sh_file):
|
||||
#img = "screenshot-81127714.png"
|
||||
#img = "screenshot-004226ce.jpg"
|
||||
#img = "screenshot-004226ce.png"
|
||||
#img = "screenshot-9b84483a.jpg"
|
||||
#fimg = resize_image_to_fullwidth(img)
|
||||
#p.image(fimg, impl='bitImageColumn');
|
||||
#p.cut()
|
||||
|
||||
# p = get_T20II_usb()
|
||||
# p.cut()
|
||||
# img = "IMG_3392.jpg"
|
||||
# fimg = resize_image_to_fullwidth(img)
|
||||
# try:
|
||||
# p.image(fimg, impl='bitImageColumn');
|
||||
# except:
|
||||
# subprocess.run(["bash", sh_file], check=True)
|
||||
# p = get_T20II_usb()
|
||||
# p.cut()
|
||||
# img = "img_fullwidth/1752696013663080_fullwidth.png"
|
||||
# fimg = resize_image_to_fullwidth(img)
|
||||
# try:
|
||||
# p.image(fimg, impl='bitImageColumn');
|
||||
# except:
|
||||
# subprocess.run(["bash", sh_file], check=True)
|
||||
# p = get_T20II_usb()
|
||||
# p.cut()
|
||||
# img = "PHOTO-2025-08-21-13-21-47.jpg"
|
||||
# fimg = resize_image_to_fullwidth(img)
|
||||
# try:
|
||||
# p.image(img, impl='graphics');
|
||||
# except:
|
||||
# subprocess.run(["bash", sh_file], check=True)
|
||||
# p = get_T20II_usb()
|
||||
# p.cut()
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user