MoneyPrinter

GitHub

Automate Creation of YouTube Shorts using MoviePy.

AI Prompts & Endpoints
CodeWiki Knowledge Base

Repository: FujiwaraChoki/MoneyPrinter


Stars: 13104

CLAUDE.md

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

MoneyPrinter automates YouTube Shorts creation from text topics. It uses Ollama for script generation, TikTok TTS for voiceover, Pexels for stock footage, and moviepy/ImageMagick for video composition. Output: a 9:16 vertical video (output.mp4).

Commands

Setup


bash
cp .env.example .env        # then fill in API keys
uv sync # install dependencies
ollama serve # start Ollama (separate terminal)
ollama pull llama3.1:8b # pull default model

Run (local)


bash
uv run python Backend/main.py                              # API on :8080
uv run python Backend/worker.py # queue worker
python3 -m http.server 3000 --directory Frontend # frontend on :3000

Run (Docker)


bash
docker compose up --build   # frontend :8001, backend :8080, postgres :5432

Verify


bash
uv run python -m compileall Backend          # syntax check
curl http://localhost:8080/api/models # API smoke test

Tests


No test suite exists yet. If added, use pytest:
bash
uv run pytest -q                                           # all tests
uv run pytest tests/test_file.py::test_name -q # single test

Architecture

Video Generation Pipeline (end-to-end flow)

text
User input (Frontend) → POST /api/generate → generation_jobs (Postgres queue)
→ worker.py claims queued job
→ gpt.py: generate_script() via Ollama
→ gpt.py: get_search_terms() → JSON keywords
→ search.py: Pexels API → download stock clips to temp/
→ tiktokvoice.py: TTS per sentence → MP3 chunks (threaded)
→ video.py: generate_subtitles() → .srt (AssemblyAI or local timestamps)
→ video.py: combine_videos() → concatenate/crop to 9:16
→ video.py: generate_video() → burn subtitles via ImageMagick, merge audio
→ (optional) mix background music from Songs/ at 10% volume
→ (optional) youtube.py: OAuth2 upload
→ output.mp4

Frontend ↔ Backend Communication


- REST: JSON payloads to Flask endpoints (/api/generate, /api/jobs/:id, /api/jobs/:id/events, /api/jobs/:id/cancel, /api/models, /api/upload-songs)
- Polling: frontend polls job status and persisted generation events.

Key Backend Modules


| File | Responsibility |
|------|---------------|
| main.py | Flask app and queue/job endpoints |
| worker.py | Job consumer that executes generation pipeline |
| db.py/models.py/repository.py | DB engine, schema, queue/event persistence |
| gpt.py | Ollama client: script generation, search terms, YouTube metadata |
| video.py | Video processing: combine clips, burn subtitles, merge audio |
| search.py | Pexels stock video search and download |
| tiktokvoice.py | TikTok TTS API (60+ voices, 300-char chunking, threaded) |
| youtube.py | YouTube upload via Google API with OAuth2 |
| utils.py | Path constants, env validation, ImageMagick detection |
| pipeline.py | Reusable generation pipeline used by worker |

Frontend


- index.html: UI with inline CSS, form fields, live log viewer
- app.js: API client (apiRequest()), job polling UI, localStorage persistence

Runtime Directories


- temp/: intermediate video/audio files (cleared each generation)
- subtitles/: generated .srt files (cleared each generation)
- Songs/: user-uploaded background music MP3s
- fonts/: subtitle font (bold_font.ttf)

Required Environment Variables

- TIKTOK_SESSION_ID — TikTok cookie for TTS
- PEXELS_API_KEY — stock video API
- IMAGEMAGICK_BINARY — leave empty to auto-detect from PATH

Optional: OLLAMA_BASE_URL, OLLAMA_MODEL, ASSEMBLY_AI_API_KEY, DATABASE_URL

Conventions

- Python: 4-space indent, snake_case, type hints on all new/modified signatures, pathlib.Path for filesystem ops
- JS: camelCase, centralized API calls via apiRequest()
- API responses: {"status": "success|error", ...} with proper HTTP codes
- Long-running work: database-backed queue and separate worker process
- Concurrency: multiple jobs can be queued; worker processes them safely via DB locking
- Update docs/ when setup, env vars, or runtime behavior changes


README.md

MoneyPrinter 💸

Sponsored by Post Bridge

<a href="https://www.post-bridge.com/?ref=moneyprinter">
<img src="docs/repo/PostBridgeBanner.png" alt="Post Bridge integration banner" width="720" />
</a>

---

𝕏 Also, follow me on X: @DevBySami.

Automate the creation of YouTube Shorts by providing a video topic.

MoneyPrinter is Ollama-first: script generation and metadata are fully powered by local Ollama models.

MoneyPrinter now uses a DB-backed generation queue (API + worker + Postgres in Docker) for reliable, restart-safe processing.

<a href="https://trendshift.io/repositories/7545" target="_blank"><img src="https://trendshift.io/api/badge/repositories/7545" alt="FujiwaraChoki%2FMoneyPrinter | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>

Important Please make sure you look through existing/closed issues before opening your own. If it's just a question, please join our discord and ask there.

🎥 Watch the video on YouTube.

Documentation

Docs are centralized in docs/:

- Interactive Setup Script
- Quickstart
- Configuration
- Architecture
- Docker
- Testing
- Troubleshooting

FAQ 🤔

Which AI provider does MoneyPrinter use?

MoneyPrinter is fully Ollama-based. Start Ollama, pull a model, and select the model in the UI.

bash
ollama serve
ollama pull llama3.1:8b

How do I get the TikTok session ID?

You can obtain your TikTok session ID by logging into TikTok in your browser and copying the value of the sessionid cookie.

My ImageMagick binary is not being detected

MoneyPrinter auto-detects ImageMagick from your PATH on Linux, macOS, and Windows. If auto-detection fails, set the executable path manually in .env, for example:

env
IMAGEMAGICK_BINARY="C:\\Program Files\\ImageMagick-7.1.0-Q16\\magick.exe"

Don't forget to use double backslashes (\\) in the path, instead of one.

I can't install playsound: Wheel failed to build

If you're having trouble installing playsound, you can try installing it using the following command:

bash
uv pip install -U wheel
uv pip install -U playsound

If you were not able to find your solution, check Troubleshooting, ask in Discord, or create an issue.

If you like and enjoy MoneyPrinter, and would like to donate, you can do that by clicking on the button on the right hand side of the repository. ❤️
You will have your name (and/or logo) added to this repository as a supporter as a sign of appreciation.

Contributing 🤝

Pull Requests will not be accepted for the time-being.

Star History 🌟

![Star History Chart](https://star-history.com/#FujiwaraChoki/MoneyPrinter&Date)

License 📝

See LICENSE file for more information.