#!/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;