Skip to content
TubePress — free, self-hosted & actively maintained
Importing content

Importing videos

The ways to bring content into TubePress and how the import queue works.

TubePress can fill your library in several ways — from adding a single clip by hand to pulling in hundreds of thousands of ready-made videos from the cloud. This page covers the built-in importer and shows you where each other route lives.

Whichever method you choose, the result is the same: ordinary videos you can edit, organise, moderate and publish like any other. Pick the one that matches how much content you have, and whether you want a one-off load or something that keeps topping itself up.

Ways to get content into TubePress

There is no single "right" way to add videos — each method suits a different scale and workflow. Use the table below to choose, then follow the link for the details.

MethodBest forWhat you provideRecurring?Credits?
Manual uploadA single self-hosted clipA video fileNoNo
Single-URL importOne embedded videoAn embed code or video URLNoNo
Bulk importMany videos at onceA CSV or JSON fileNo (queued)Only with AI
Feed importHands-off, ongoing growthA feed URLYesOnly with AI
CatalogueA ready-made libraryPicks from 400,000+ videosNoYes
Rule of thumb. A few videos → add them by hand. A spreadsheet of videos → bulk import. A source that keeps publishing → a feed. Want quality content with no sourcing → the catalogue.

Importing a single video

TubePress has no separate "one video" importer — to add a single video you use the Videos screen at /admin/videos and choose Add Video. There are two ways to provide the media:

  • Manual upload — upload a video file you host yourself.
  • Single-URL import — paste an <iframe> embed code or a direct video URL to embed a clip hosted elsewhere.

Fill in the title and thumbnail, attach any categories, tags or performers, then save as a draft or publish straight away. Neither route uses credits.

More than a handful? Skip the one-by-one approach and prepare a CSV or JSON file for bulk import, or browse the catalogue.

Bulk import

Bulk import lives on the Upload File tab of /admin/import. It takes a single CSV or JSON file — not a pasted list of URLs — and turns each row or object into a video.

  • CSV must have a header row and use commas as separators.
  • JSON must be an array of objects.

Drag the file onto the upload zone (or click to browse) and TubePress reads the columns and shows a preview. A minimal CSV looks like this:

title,embed_code,thumbnail,duration,tags
My clip,https://ex.com/v/123.mp4,https://ex.com/t.jpg,612,"solo,hd"

Next you map your columns onto TubePress fields by dragging them into place. The fields the importer recognises include:

title
The video title. The one field the importer truly requires.
embed_code
An <iframe> embed code or a video URL.
thumbnail
Image URL. Optionally downloaded to your own storage.
video_id
A stable external ID used to de-duplicate on re-import.
categories / tags / performers / channels
Comma-separated names; created if missing.
description, slug, duration, views, published_at
Optional extras mapped the same way.

Before you start, set how duplicates are handled (skip or update, matched on video_id), whether to download thumbnails so they are served from your storage, and any optional AI rewriting or translation.

Bulk import embeds, it does not host. Each row stores the embed or player link; the video file is not fetched or transcoded. To self-host the actual files, use Feed import in Download mode or the Catalogue.

How the import queue works

For anything beyond a small file, choose Start in background. TubePress creates a job and hands it to the import processor, which works through your rows even after you close the tab. No system crontab is required — it runs on the built-in pseudo-cron.

The processor is designed to be safe and resilient:

  • Chunked. Rows are imported a few at a time so a web worker is never tied up; an adjustable import speed controls how many per chunk.
  • Asynchronous. The pseudo-cron picks the job up as the site receives traffic, and the import page nudges it along while open.
  • Self-healing. A job that stalls — for example a server restart mid-run — is requeued automatically after about five minutes and continues where it left off.
  • De-duplicating. Rows with a known video_id are skipped or updated rather than duplicated.
  • Forgiving. A bad row is logged (the first few errors per chunk are sampled) and the job carries on.
No double-counting. A per-job lock stops the same rows being processed twice, so the counts stay accurate even with the page open and the cron running together.

Watching import progress

Open /admin/import and watch the Import Queue. Each active job shows live counts — imported, skipped, errors, and processed-of-total — refreshed every few seconds.

From here you can pause, resume, cancel or delete a job. Jobs from the last 24 hours stay listed so you can review what happened, including sampled error messages for any rows that failed.

Tips & limits

  • Only .csv and .json files are accepted; other formats are rejected up front.
  • The practical minimum per row is a title plus an embed code and a thumbnail.
  • Upload size is capped by your server's upload_max_filesize and post_max_size. Split very large files, or rely on a background job.
  • Map a stable video_id so re-running a file updates rather than duplicates.
  • Enable Download thumbnails to self-host images instead of hotlinking the source.
  • AI rewriting and translation consume credits and need a linked tubepress.io account; if your balance is too low the job stops with a clear message.

Next steps

Still stuck?

Open a ticket from your dashboard and our team will help you out.

Try the live demo → Download TubePress →