Initial commit

This commit is contained in:
2025-11-14 22:47:27 +00:00
commit 5a842158ad
50 changed files with 124762 additions and 0 deletions

241
receipt.py Executable file
View 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;