We offer customization solutions and support ([email protected]) | Visit us on bitbyte3 for complete VOD solutions with apps.
NixStream
Guides

VOD Uploads

Uploading and organizing video-on-demand content

VOD is the main workflow: upload a source file, transcode to adaptive streams, then play, share, or embed.

Upload via admin panel

  1. Go to Videos in the admin panel
  2. Select a collection (folder) from the sidebar
  3. Drag and drop or browse for a video file

Uploads run in the background. Status goes from pending to processing to completed (or failed). It's queue-based, not instant.

Because NixStream is self-hosted, upload capacity depends on your server (disk, PHP, and Nginx), not a product-imposed format or size limit. If uploads fail at the network layer, raise client_max_body_size in Nginx and upload_max_filesize / post_max_size in PHP.

Encoding profile

New uploads use the default encoding profile unless you select another in the upload dialog. Profiles control resolution ladder, bitrates, and encryption. See Encoding Profiles.

Collections

Videos are organized in a tree of collections. The root collection path is root. Sub-folders use paths like root/marketing/2026 (nested under root/marketing).

Collections can have their own metadata fields and security profiles. Create folders from the collection sidebar in the admin panel.

Upload statuses

StatusMeaning
pendingQueued, waiting for a worker
processingFFmpeg transcoding and packaging
completedReady for playback and sharing
failedError during encode (check queue logs)

Monitor progress from the video detail page. Failed jobs log errors to storage/logs/laravel.log and queue stdout.

Via Client API

curl -X POST "https://your-domain.com/api/client/v1/uploads" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "video=@/path/to/video.mp4" \
  -F "folder=root/marketing"

Returns 202 Accepted with a video ID and processing status.

Poll upload status:

curl "https://your-domain.com/api/client/v1/uploads/{videoId}" \
  -H "Authorization: Bearer YOUR_API_KEY"

See Uploads API for full request and response schemas.

Metadata

Custom metadata fields live in Settings > Metadata. Supported types: input, textarea, select, multiselect, number, rating, date, and image.

Attach metadata during upload or edit later from the video detail page. Metadata is searchable in the library and exposed via the Client API.

Thumbnails and posters

Encoding generates thumbnail sprites and poster images. Pick the poster from the video detail page after processing completes.

Transcription

If Whisper transcription is enabled, subtitles generate after encoding or on manual trigger. See Transcription.

After upload

Once encoding completes, the video is available for:

  • Playback in the admin panel and public player
  • Share links and embeds (Sharing & Embeds)
  • Client API listing (GET /api/client/v1/videos)
  • Transcription (Whisper) if enabled

Troubleshooting uploads

Upload hangs at 100%: check Nginx body size limits and PHP max_execution_time.

Stuck on processing: confirm queue workers are running:

docker compose exec queue supervisorctl status
docker compose logs queue

Wrong folder: API uploads need the full collection path (e.g. root/marketing, not just marketing).

Encode pipeline details: Encoding & Transcoding. Where files land: Storage. Panel walkthrough: Admin Panel.

On this page