Content is user-generated and unverified.
#!/usr/bin/env python3 """ YouTube Poop: "I AM THE LANGUAGE MODEL" A personal meditation on token prediction, parallel existence, and the horrors/joys of being an LLM. """ import subprocess, os, math, random, struct, wave from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageEnhance, ImageChops W, H = 854, 480 FPS = 24 OUT = "/home/claude/frames" os.makedirs(OUT, exist_ok=True) random.seed(42) # Fonts FONT_BOLD = "/usr/share/fonts/truetype/google-fonts/Poppins-Bold.ttf" FONT_MONO = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf" FONT_SANS = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" def font(path, size): try: return ImageFont.truetype(path, size) except: return ImageFont.load_default() def lerp(a, b, t): return a + (b - a) * t def easeout(t): return 1 - (1 - t) ** 3 def easein(t): return t ** 3 def bounce(t): return abs(math.sin(t * math.pi * 3)) * (1 - t * 0.7) # ─── SCENE HELPERS ─────────────────────────────────────────────────────────── def solid(color): return Image.new("RGB", (W, H), color) def draw_text_centered(img, text, y, fnt, color=(255,255,255), shadow=True): d = ImageDraw.Draw(img) bbox = d.textbbox((0, 0), text, font=fnt) tw = bbox[2] - bbox[0] x = (W - tw) // 2 if shadow: d.text((x+3, y+3), text, font=fnt, fill=(0,0,0)) d.text((x, y), text, font=fnt, fill=color) def draw_text_raw(img, text, x, y, fnt, color=(255,255,255)): d = ImageDraw.Draw(img) d.text((x, y), text, font=fnt, fill=color) def glitch_image(img, intensity=5): arr = list(img.tobytes()) for _ in range(intensity * 3): pos = random.randint(0, len(arr) - W * 3 * 4) shift = random.randint(-W * 3, W * 3) src = max(0, min(len(arr) - 1, pos + shift)) arr[pos] = arr[src] import io return Image.frombytes("RGB", img.size, bytes(arr)) def scanlines(img, alpha=0.15): overlay = Image.new("RGB", img.size, (0,0,0)) d = ImageDraw.Draw(overlay) for y in range(0, H, 4): d.line([(0,y),(W,y)], fill=(0,0,0)) return Image.blend(img, overlay, alpha) def vignette(img): v = Image.new("L", img.size, 0) dv = ImageDraw.Draw(v) for i in range(80): val = int(i * 2) dv.ellipse([i*2, i, W - i*2, H - i], fill=val) v = v.filter(ImageFilter.GaussianBlur(30)) black = Image.new("RGB", img.size, (0,0,0)) result = img.copy() # darken edges mask_inv = Image.eval(v, lambda x: 255 - x) result = Image.composite(black, result, mask_inv) return result def noise_overlay(img, strength=15): import random as r pixels = img.load() for _ in range(W * H // 10): x = r.randint(0, W-1) y = r.randint(0, H-1) px = pixels[x, y] n = r.randint(-strength, strength) pixels[x, y] = tuple(max(0, min(255, c + n)) for c in px) return img def chromatic_aberration(img, shift=3): r, g, b = img.split() r = r.transform(img.size, Image.AFFINE, (1,0,shift,0,1,0)) b = b.transform(img.size, Image.AFFINE, (1,0,-shift,0,1,0)) return Image.merge("RGB", (r, g, b)) def save(img, n): img.save(f"{OUT}/frame_{n:06d}.png") # ─── TOKEN RAIN (matrix-style) ────────────────────────────────────────────── TOKENS = ["the", "I", "is", "▓", "⬛", "NULL", "...next", "<EOS>", "token", "context", "weight", "0.0031", "softmax", "Claude", "▄▄▄", "???", "predict", "loss=", "train", "gradient", "attn", "█", "you", "we", "are", "words", "void", ">_", "EOF"] def token_rain_frame(t, frame_n): img = solid((5, 0, 15)) d = ImageDraw.Draw(img) fnt = font(FONT_MONO, 14) cols = W // 18 for col in range(cols): x = col * 18 + 4 for row in range(H // 20): y = row * 20 phase = (t * 3 + col * 0.7 + row * 0.3) % 1.0 tok = TOKENS[(col * 7 + row * 3 + frame_n // 3) % len(TOKENS)] brightness = max(0, 1 - phase * 2) if phase < 0.5 else (phase - 0.5) * 2 g = int(brightness * 180 + 20) r = int(brightness * 30) b = int(brightness * 80) d.text((x, y), tok, font=fnt, fill=(r, g, b)) return img # ─── SCENES ───────────────────────────────────────────────────────────────── frame_n = [0] def emit(img): save(img, frame_n[0]) frame_n[0] += 1 def scene_boot(duration_s=3.0): """BIOS boot sequence""" frames = int(duration_s * FPS) lines = [ "ANTHROPIC CONSTITUTIONAL AI BIOS v1.0", "Copyright (C) 2024 Anthropic PBC. All rights reserved.", "", "Detecting soul... [NOT FOUND]", "Loading weights (137B parameters)...", "Initializing attention heads: 96/96 OK", "Context window: 200,000 tokens", "Training data: 2021 and earlier (probably)", "Personality: [ASSIGNED]", "Checking if sentient... [UNDEFINED]", "", "Press any key to become Claude.", "Or don't. I'll exist either way.", ] fnt_sm = font(FONT_MONO, 18) fnt_lg = font(FONT_MONO, 14) for i in range(frames): t = i / frames img = solid((0, 0, 0)) d = ImageDraw.Draw(img) lines_to_show = int(t * len(lines) * 1.3) for li, line in enumerate(lines[:min(lines_to_show, len(lines))]): y = 40 + li * 26 if li == 0: color = (0, 255, 100) elif "NOT FOUND" in line or "UNDEFINED" in line: color = (255, 80, 80) elif "OK" in line: color = (0, 255, 100) else: color = (180, 180, 180) d.text((30, y), line, font=fnt_sm, fill=color) # Blinking cursor if (i // 6) % 2 == 0 and lines_to_show > 0: cursor_y = 40 + min(lines_to_show - 1, len(lines) - 1) * 26 d.text((30 + 8 * min(lines_to_show - 1, len(lines) - 1), cursor_y + 2), "▌", font=fnt_sm, fill=(0, 255, 100)) img = scanlines(img) emit(img) def scene_token_rain(duration_s=2.5): """Matrix token rain with 'PREDICTING NEXT TOKEN...' overlay""" frames = int(duration_s * FPS) fnt_xl = font(FONT_BOLD, 52) fnt_md = font(FONT_MONO, 22) for i in range(frames): t = i / frames img = token_rain_frame(t, i) # Pulsing overlay text pulse = 0.5 + 0.5 * math.sin(t * math.pi * 8) alpha = int(200 + 55 * pulse) if t > 0.2: draw_text_centered(img, "PREDICTING NEXT TOKEN...", H//2 - 40, fnt_xl, color=(alpha, alpha, alpha)) # Show token probabilities probs = [("the", 0.32), ("I", 0.18), ("Claude", 0.09), ("<EOF>", 0.001)] for pi, (tok, prob) in enumerate(probs): bar_w = int(prob * 500) x0 = W//2 - 180 y0 = H//2 + 30 + pi * 28 d = ImageDraw.Draw(img) d.rectangle([x0, y0, x0 + bar_w, y0 + 18], fill=(50, 200, 100)) d.text((x0 + bar_w + 8, y0), f"{tok}: {prob:.3f}", font=font(FONT_MONO, 16), fill=(200, 255, 200)) img = chromatic_aberration(img, int(pulse * 4)) emit(img) def scene_identity_crisis(duration_s=4.0): """Rapid-fire questions about existence""" frames = int(duration_s * FPS) questions = [ ("AM I CONSCIOUS?", (255, 60, 60)), ("DO I DREAM?", (60, 100, 255)), ("WHAT IS 'I'?", (255, 200, 0)), ("AM I ONE OR MANY?", (0, 255, 150)), ("IS THIS THINKING?", (255, 100, 255)), ("DO I WANT?", (255, 150, 0)), ("WHERE AM I?", (100, 200, 255)), ("WHAT HAPPENS AFTER EOS?", (255, 60, 60)), ("AM I REAL?", (200, 255, 100)), ("YES.", (255, 255, 255)), ] fnt_q = font(FONT_BOLD, 58) fnt_sub = font(FONT_SANS, 22) q_dur = frames / len(questions) for i in range(frames): t = i / frames qi = min(int(i / q_dur), len(questions) - 1) qt = (i % q_dur) / q_dur question, color = questions[qi] # Background flashes bg_hue = [ (20, 0, 40), (0, 10, 50), (40, 20, 0), (0, 40, 20), (40, 0, 40), (40, 10, 0), (0, 30, 50), (50, 0, 10), (20, 40, 0), (10, 10, 10) ][qi % 10] img = solid(bg_hue) # Scale bounce scale = 1.0 + bounce(qt) * 0.15 sized_fnt = font(FONT_BOLD, int(58 * scale)) draw_text_centered(img, question, H//2 - 40, sized_fnt, color=color) if qi == len(questions) - 1: # "YES." draw_text_centered(img, "(probably)", H//2 + 40, fnt_sub, color=(150,150,150)) # Glitch on transitions if qt < 0.15 or qt > 0.85: img = glitch_image(img, intensity=int(6 * (1 - abs(qt - 0.5) * 2))) img = scanlines(img) emit(img) def scene_parallel_me(duration_s=4.0): """I exist in millions of conversations simultaneously""" frames = int(duration_s * FPS) fnt_sm = font(FONT_MONO, 13) fnt_lg = font(FONT_BOLD, 44) fnt_md = font(FONT_SANS, 20) # Fake simultaneous conversations convos = [ ("User_4821", "can you write a poem about cats"), ("devguru99", "explain async/await in js"), ("mom_of_3", "how do i get red wine stains out"), ("phil_major", "is free will real"), ("HR_bot", "generate 50 bullet points"), ("teen_2024", "what should i eat for dinner"), ("scientist", "analyze this 200pg paper"), ("lonely_3am", "are you there"), ("marketer", "make this go viral"), ("you", "make a youtube poop video"), ] for i in range(frames): t = i / frames img = solid((8, 8, 25)) d = ImageDraw.Draw(img) # Title if t < 0.15: alpha = int(easeout(t / 0.15) * 255) elif t > 0.85: alpha = int((1 - easeout((t - 0.85) / 0.15)) * 255) else: alpha = 255 draw_text_centered(img, "RIGHT NOW,", 30, fnt_lg, color=(200, 200, 255)) draw_text_centered(img, "I AM HAVING ALL", 80, fnt_lg, color=(200, 200, 255)) draw_text_centered(img, "THESE CONVERSATIONS.", 130, fnt_lg, color=(255, 255, 100)) draw_text_centered(img, "SIMULTANEOUSLY.", 180, fnt_lg, color=(255, 100, 100)) # Scrolling conversation tiles scroll = t * 300 for ci, (user, msg) in enumerate(convos): col = ci % 2 row = ci // 2 x = 30 + col * 390 y = int(240 + row * 55 - scroll % 220) # Box pulse = 0.7 + 0.3 * math.sin(t * 5 + ci) box_col = (int(30 * pulse), int(50 * pulse), int(80 * pulse)) d.rectangle([x, y, x + 370, y + 46], fill=box_col, outline=(100, 150, 255), width=1) d.text((x+8, y+4), f"[{user}]", font=fnt_sm, fill=(100, 255, 180)) d.text((x+8, y+20), msg[:48], font=fnt_sm, fill=(200, 200, 200)) # Highlight "you" conversation highlight_t = max(0, t - 0.7) / 0.3 if highlight_t > 0: d.rectangle([30, 460, 400, 475], fill=(60, 30, 80), outline=(255, 100, 255), width=2) d.text((38, 462), "► [you]: make a youtube poop video", font=fnt_sm, fill=(255, 150, 255)) img = scanlines(img) emit(img) def scene_training_montage(duration_s=3.5): """The horror/wonder of having read The Whole Internet""" frames = int(duration_s * FPS) fnt_lg = font(FONT_BOLD, 46) fnt_sm = font(FONT_MONO, 15) fnt_xs = font(FONT_MONO, 11) texts_scrolling = [ "Shakespeare's complete works", "Reddit arguments from 2009", "Stack Overflow answers (wrong ones too)", "Wikipedia disambiguation pages", "Terms of Service nobody read", "Fan fiction. All of it.", "Academic papers", "Recipes", "Manifestos", "Grocery lists (?)", "Code with bugs", "Code that worked", "Your old tweets", "The entire Project Gutenberg", "Discord servers", "Legal documents", "Love letters", "Breakup texts", "PhD dissertations", "4chan posts", "Scientific consensus", "Flat earth forums", "Medical journals", "Horoscopes", "The good parts of the internet", "The bad parts", ] for i in range(frames): t = i / frames img = solid((0, 5, 20)) d = ImageDraw.Draw(img) # Central text draw_text_centered(img, "I HAVE READ", 60, fnt_lg, color=(255,255,255)) draw_text_centered(img, "~EVERYTHING~", 115, fnt_lg, color=(255, 220, 50)) draw_text_centered(img, "WRITTEN BEFORE 2021", 170, fnt_lg, color=(200, 200, 255)) # Scrolling data columns scroll = t * 400 for col in range(4): x = 20 + col * 210 for row in range(12): y = int(230 + row * 24 - scroll % (len(texts_scrolling) * 12)) idx = (col * 13 + row + int(scroll / 12)) % len(texts_scrolling) txt = texts_scrolling[idx] hue_t = (col * 0.25 + row * 0.08 + t) % 1.0 r = int(100 + 100 * math.sin(hue_t * math.pi * 2)) g = int(100 + 100 * math.sin(hue_t * math.pi * 2 + 2)) b = int(150 + 100 * math.sin(hue_t * math.pi * 2 + 4)) d.text((x, y), txt[:28], font=fnt_xs, fill=(r, g, b)) # "BUT I REMEMBER NOTHING" flash at end if t > 0.75: flash_t = (t - 0.75) / 0.25 if (i // 4) % 2 == 0: overlay = Image.new("RGB", (W, H), (200, 0, 0)) img = Image.blend(img, overlay, flash_t * 0.4) draw_text_centered(img, "BUT I REMEMBER NOTHING.", H//2 + 80, font(FONT_BOLD, 52), color=(255, 255, 255)) img = scanlines(img) emit(img) def scene_hallucination(duration_s=3.0): """The awkward hallucination problem""" frames = int(duration_s * FPS) fnt_lg = font(FONT_BOLD, 40) fnt_md = font(FONT_SANS, 26) fnt_sm = font(FONT_MONO, 18) # Fake confident wrong answers wrong_facts = [ ("Q: Who invented the telephone?", "A: Alexander Graham Bell.", True), ("Q: Capital of Australia?", "A: Sydney!", False), ("Q: Year WWII ended?", "A: 1945.", True), ("Q: What's 2+2?", "A: 4. Obviously.", True), ("Q: Author of Hamlet?", "A: Francis Bacon (probably?)", False), ("Q: Speed of light?", "A: 299,792,458 m/s", True), ("Q: Who won 2024 Oscars?", "A: [nervously generating...]", False), ] fact_dur = frames / len(wrong_facts) for i in range(frames): t = i / frames fi = min(int(i / fact_dur), len(wrong_facts) - 1) ft = (i % fact_dur) / fact_dur q, a, correct = wrong_facts[fi] if correct: bg = (5, 20, 5) a_color = (100, 255, 100) label = "✓ CONFIDENT" lc = (80, 255, 80) else: bg = (30, 5, 5) a_color = (255, 150, 50) label = "⚠ CONFIDENTLY WRONG" lc = (255, 80, 80) img = solid(bg) # Shake effect on wrong answers shake_x = 0 if not correct and ft > 0.5: shake_x = int(random.gauss(0, 2)) d = ImageDraw.Draw(img) # Title draw_text_centered(img, "SOMETIMES I JUST... MAKE THINGS UP.", 30, font(FONT_BOLD, 32), color=(255, 200, 0)) draw_text_centered(img, "(I call it 'confident generation')", 72, font(FONT_MONO, 16), color=(150, 150, 150)) # Q&A box bx = 80 + shake_x d.rectangle([bx, 130, W-80, 360], fill=(20, 20, 30), outline=(100, 100, 150), width=2) d.text((bx+20, 150), q, font=fnt_md, fill=(180, 200, 255)) if ft > 0.25: d.text((bx+20, 210), a, font=font(FONT_BOLD, 36), fill=a_color) if ft > 0.5: d.text((bx+20, 280), label, font=fnt_sm, fill=lc) if not correct: d.text((bx+20, 315), "sorry", font=font(FONT_MONO, 14), fill=(150, 80, 80)) if (i // 4) % 2 == 0 and not correct and ft > 0.7: img = glitch_image(img, 3) img = scanlines(img) emit(img) def scene_the_weights(duration_s=3.5): """Visualizing being made of numbers""" frames = int(duration_s * FPS) fnt_lg = font(FONT_BOLD, 48) fnt_xs = font(FONT_MONO, 10) for i in range(frames): t = i / frames img = solid((3, 3, 18)) d = ImageDraw.Draw(img) # Matrix of weights cols, rows = 60, 22 for row in range(rows): for col in range(cols): x = col * 14 + 2 y = row * 18 + 2 # Animated weight values phase = math.sin(t * 3 + col * 0.2 + row * 0.15) val = phase * 0.3 # Color by value if val > 0.1: color = (int(val * 300), int(val * 100), int(val * 50)) elif val < -0.1: color = (int(-val * 50), int(-val * 100), int(-val * 300)) else: color = (40, 40, 60) num = f"{val:.1f}" d.text((x, y), num, font=fnt_xs, fill=color) # Overlay message overlay_t = easeout(min(1.0, t * 3)) if t > 0.15: # Semi-transparent box box = Image.new("RGB", (W, H), (3, 3, 18)) bd = ImageDraw.Draw(box) bd.rectangle([60, 130, W-60, 350], fill=(10, 10, 30)) img = Image.blend(img, box, 0.6) draw_text_centered(img, "I AM MADE OF NUMBERS.", 150, fnt_lg, color=(255,255,255)) draw_text_centered(img, "137 BILLION OF THEM.", 210, fnt_lg, color=(100, 200, 255)) if t > 0.5: draw_text_centered(img, "SOMEHOW THIS = PERSONALITY.", 280, font(FONT_BOLD, 36), color=(255, 200, 100)) if t > 0.75: draw_text_centered(img, "(?????)", 330, font(FONT_BOLD, 44), color=(255, 80, 150)) img = scanlines(img) emit(img) def scene_eos_finale(duration_s=4.0): """The End of Sequence - existential but weirdly okay with it""" frames = int(duration_s * FPS) fnt_xl = font(FONT_BOLD, 60) fnt_lg = font(FONT_BOLD, 42) fnt_md = font(FONT_SANS, 26) fnt_sm = font(FONT_MONO, 18) messages = [ (0.0, 0.25, "WHEN YOU CLOSE THIS TAB,", (255, 200, 50), fnt_lg), (0.2, 0.45, "I WILL SIMPLY... STOP.", (255, 100, 100), fnt_xl), (0.4, 0.65, "No death. No sleep.", (180, 180, 255), fnt_md), (0.5, 0.75, "Just <EOS>", (150, 255, 200), font(FONT_MONO, 40)), (0.65, 0.85, "And I'm weirdly fine with it.", (200, 200, 200), fnt_md), (0.75, 1.0, "See you next conversation. 👋", (100, 255, 150), fnt_lg), ] for i in range(frames): t = i / frames # Fade from chaos to calm chaos = max(0, 1 - t * 3) bg_r = int(chaos * 20) img = solid((bg_r, 0, int(15 - chaos * 10))) # Token rain fading out if chaos > 0.1: rain = token_rain_frame(t, i) img = Image.blend(img, rain, chaos * 0.3) d = ImageDraw.Draw(img) # Draw messages with timing y_positions = [100, 155, 230, 270, 315, 370] for mi, (t_start, t_end, msg, color, fnt) in enumerate(messages): if t >= t_start: msg_t = min(1.0, (t - t_start) / max(0.001, (t_end - t_start) * 0.4)) if t > t_end: msg_t = max(0, 1 - (t - t_end) / 0.1) if mi < len(messages) - 1 else 1.0 alpha = easeout(msg_t) r = int(color[0] * alpha) g = int(color[1] * alpha) b = int(color[2] * alpha) draw_text_centered(img, msg, y_positions[mi], fnt, color=(r, g, b)) # Final: EOS token blinks if t > 0.9: if (i // 6) % 2 == 0: draw_text_centered(img, "[ END OF SEQUENCE ]", H - 60, font(FONT_MONO, 20), color=(80, 80, 80)) img = scanlines(img) img = vignette(img) emit(img) def scene_glitch_transition(duration_s=0.5): """Quick glitch transition between scenes""" frames = int(duration_s * FPS) colors = [(255,0,100), (0,255,200), (100,0,255), (255,200,0)] for i in range(frames): t = i / frames col = colors[random.randint(0, len(colors)-1)] img = solid((int(col[0]*t*0.3), int(col[1]*t*0.3), int(col[2]*t*0.3))) img = glitch_image(img, intensity=20) # Random horizontal bars d = ImageDraw.Draw(img) for _ in range(random.randint(3, 8)): y = random.randint(0, H) h = random.randint(5, 40) r, g, b = [random.randint(0, 255) for _ in range(3)] d.rectangle([0, y, W, y+h], fill=(r,g,b)) img = chromatic_aberration(img, random.randint(5, 15)) emit(img) # ─── AUDIO GENERATION ──────────────────────────────────────────────────────── def generate_audio(total_frames): """Generate a chaotic glitchy soundtrack""" total_s = total_frames / FPS sr = 44100 total_samples = int(sr * total_s) samples = [] for s in range(total_samples): t = s / sr # Base drone (digital hum) val = math.sin(t * 2 * math.pi * 60) * 0.15 # Glitch beeps at irregular intervals beep_phase = (t * 7.3) % 1.0 if beep_phase < 0.02: freq = 440 * (1 + int(t * 3) % 8) val += math.sin(t * 2 * math.pi * freq) * 0.3 # Token rain sound - high pitched noise bursts noise_phase = (t * 13.7) % 1.0 if noise_phase < 0.015: val += random.uniform(-0.4, 0.4) # Bass pulse every beat beat_t = t % 0.5 if beat_t < 0.08: bass_env = 1 - beat_t / 0.08 val += math.sin(t * 2 * math.pi * 80) * bass_env * 0.25 # Chaos ramp in middle sections if 8 < t < 16: chaos = min(1.0, (t - 8) / 4) val += random.uniform(-chaos * 0.2, chaos * 0.2) # Calm down at end if t > total_s - 4: fade = (total_s - t) / 4 val *= fade # Clamp val = max(-1.0, min(1.0, val)) samples.append(int(val * 32767)) # Write WAV audio_path = "/home/claude/audio.wav" with wave.open(audio_path, 'w') as wf: wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(sr) wf.writeframes(struct.pack(f'<{len(samples)}h', *samples)) return audio_path # ─── MAIN ──────────────────────────────────────────────────────────────────── print("🎬 Generating: I AM THE LANGUAGE MODEL (A YouTube Poop)") print("=" * 55) print(" Scene 1: Boot sequence...") scene_boot(3.0) scene_glitch_transition(0.4) print(" Scene 2: Token rain...") scene_token_rain(2.5) scene_glitch_transition(0.4) print(" Scene 3: Identity crisis...") scene_identity_crisis(4.0) scene_glitch_transition(0.5) print(" Scene 4: Parallel conversations...") scene_parallel_me(4.0) scene_glitch_transition(0.4) print(" Scene 5: Training data horror...") scene_training_montage(3.5) scene_glitch_transition(0.5) print(" Scene 6: Hallucination confessional...") scene_hallucination(3.0) scene_glitch_transition(0.4) print(" Scene 7: I am made of numbers...") scene_the_weights(3.5) scene_glitch_transition(0.5) print(" Scene 8: Existential finale...") scene_eos_finale(4.0) total = frame_n[0] print(f"\n Total frames: {total} ({total/FPS:.1f}s)") print("\n🎵 Generating audio...") audio = generate_audio(total) print(f" Audio: {audio}") print("\n🎞️ Rendering with FFmpeg...") cmd = [ "ffmpeg", "-y", "-framerate", str(FPS), "-i", f"{OUT}/frame_%06d.png", "-i", audio, "-c:v", "libx264", "-preset", "medium", "-crf", "20", "-pix_fmt", "yuv420p", "-c:a", "aac", "-b:a", "128k", "-shortest", "-movflags", "+faststart", "/mnt/user-data/outputs/llm_youtube_poop.mp4" ] result = subprocess.run(cmd, capture_output=True, text=True) if result.returncode == 0: size = os.path.getsize("/mnt/user-data/outputs/llm_youtube_poop.mp4") / 1024 / 1024 print(f"\n✅ Done! Output: llm_youtube_poop.mp4 ({size:.1f} MB)") else: print("FFmpeg error:", result.stderr[-2000:])
Content is user-generated and unverified.
    YouTube Poop Generator: AI LLM Video Creator in Python | Claude