Loading page...Загружаем страницу...正在加载页面...
AtlasRepo

Why My Single-Core Server Handles Metadata, PDFs And Covers With Just Pillow And Reportlab

Description and use

Scripts auto‑generate correct CSV headers, track uploads, render PDFs and covers with Pillow/Reportlab, enabling 39 products on a single‑core, 2 GB server without rejections or spam flags.

Problem

Adobe and other stock platforms reject CSV uploads due to incorrect headers, and duplicate submissions flag accounts as spam.

Outcome

The pipeline processed 39 products, producing 856 MB of output on a 1‑core, 2 GB server, avoiding CSV rejections and duplicate upload flags.

Workflow

  • 1. Run make_metadata.py to generate platform‑specific CSV headers and rows from filenames or titles.json.
  • 2. Use upload_tracker.py to record completed uploads and prevent re‑uploads.
  • 3. Convert Markdown to PDF with md2pdf.py using Reportlab.
  • 4. Render 1280x720 cover and 600x600 thumbnail with Pillow via pack_product.py and zip them.
  • 5. Monitor memory with resource.getrusage and gc.collect() after each asset.
  • 6. Organize files in assets/, output/, packs/, scripts/, research/ folders.

Evidence

Adobe had rejected the entire CSV. One wrong column in the header.

Source

Adobe Stock wants a 5-column CSV. Vecteezy wants 4 columns. Dreamstime wants 15.

Source

upload_tracker.py is a ledger, standard library only, no database.

Source

md2pdf.py uses reportlab alone: headings, tables, lists, links, clean styling, one command: python md2pdf.py content.md product.pdf "My Product Title"

Source

Pack_product.py renders both with Pillow, zips the files, and writes everything into a _system folder.

Source

One process at a time. Never fan out image jobs in parallel on a 1-core box.

Source

I validated the whole thing on that box: 39 finished products, 856 MB of output, running under a pipeline of roughly 19,000 lines with an agent orchestrator on top.

Source

  • Record date: 2026-10-22T00:26:03.382Z