Nodeflux Central
Video Management

API Reference — Video Management

Endpoint untuk mengelola video yang diunggah ke Media Server — upload chunked, kontrol streaming, operasi CRUD, dan ekstraksi timestamp berbasis AI.

Semua endpoint memerlukan header Authorization: Bearer <token>. Basis URL mengikuti variabel lingkungan VITE_API_URL yang dikonfigurasi pada instalasi Lenz. Endpoint video diarahkan melalui Raisa Gateway ke Media Server target menggunakan path prefix {nvrServerId}. Jika Anda belum punya token, lihat halaman Otentikasi.


Video — CRUD

Endpoint utama untuk membaca, memperbarui, dan menghapus video yang telah diunggah.

GET
/api/visionaire-media/{nvrServerId}/videos

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

Query Parameters

search?string

Pencarian parsial case-insensitive pada ID dan nama file video.

sort_by?string

Kolom pengurutan.

Default"created_at"
Value in"original_filename" | "file_size" | "duration" | "started_at" | "created_at"
sort_order?string

Arah pengurutan.

Default"desc"
Value in"asc" | "desc"
page?integer

Nomor halaman (1-indexed).

Default1
Range1 <= value
per_page?integer

Jumlah item per halaman. Nilai 0 mengembalikan semua item.

Default10
Range0 <= value

Response Body

application/json

curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos"
{  "success": true,  "data": {    "videos": [      {        "id": "abc123def456",        "original_filename": "rekaman-2026-01.mp4",        "file_path": "/storage/videos/rekaman-2026-01.mp4",        "file_size": 104857600,        "created_at": "2026-01-15T08:00:00Z",        "status": "streaming",        "duration": 3600,        "started_at": "2026-01-15T00:00:00Z",        "started_at_src": "metadata",        "ended_at": "2026-01-15T01:00:00Z",        "instance": null      }    ],    "count": 1,    "pagination": {      "current_page": 1,      "per_page": 10,      "total_items": 1,      "total_pages": 1    }  }}
GET
/api/visionaire-media/{nvrServerId}/videos/{videoId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

videoId*string

ID unik video.

Response Body

application/json

application/json

curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/string"
{  "success": true,  "data": {    "video": {      "id": "abc123def456",      "original_filename": "rekaman-2026-01.mp4",      "file_path": "/storage/videos/rekaman-2026-01.mp4",      "file_size": 104857600,      "created_at": "2026-01-15T08:00:00Z",      "status": "streaming",      "duration": 3600,      "started_at": "2026-01-15T00:00:00Z",      "started_at_src": "metadata",      "ended_at": "2026-01-15T01:00:00Z",      "device": {        "name": "rekaman-2026-01",        "url": "file:///storage/videos/rekaman-2026-01.mp4",        "scheme": "file",        "channel": "live",        "silent_audio": false,        "status": "running",        "publish_url": "rtsp://192.168.1.10:1935/live/rekaman-2026-01",        "created_at": "2026-01-15T08:00:00Z",        "updated_at": "2026-01-15T08:01:00Z",        "error_count": 0,        "restart_count": 0,        "uptime": 3600000      },      "instance": null    }  }}
{  "success": false,  "message": "video not found"}
PATCH
/api/visionaire-media/{nvrServerId}/videos/{videoId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

videoId*string

ID unik video.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X PATCH "https://lenz.example.com/api/visionaire-media/0/videos/string" \  -H "Content-Type: application/json" \  -d '{    "started_at": "2026-01-15T00:00:00Z",    "started_at_src": "manual"  }'
{  "success": true,  "data": {    "video": {      "id": "abc123def456",      "original_filename": "rekaman-2026-01.mp4",      "file_size": 104857600,      "created_at": "2026-01-15T08:00:00Z",      "status": "streaming",      "duration": 3600,      "started_at": "2026-01-15T00:00:00Z",      "started_at_src": "manual"    }  }}
DELETE
/api/visionaire-media/{nvrServerId}/videos/{videoId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

videoId*string

ID unik video.

Response Body

application/json

curl -X DELETE "https://lenz.example.com/api/visionaire-media/0/videos/string"
{  "success": true,  "message": "Video deleted successfully",  "video_id": "abc123def456"}

Upload Chunked

Mekanisme upload video dalam potongan (chunk) dengan dukungan resume. Upload yang terputus dapat dilanjutkan tanpa mengirim ulang chunk yang sudah diterima.

POST
/api/visionaire-media/{nvrServerId}/videos/upload

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

Query Parameters

autoplay?boolean

Jika true, video otomatis diputar sebagai stream RTSP setelah upload selesai.

Defaulttrue

Request Body

multipart/form-data

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/upload" \  -F file="string" \  -F filename="rekaman-2026-01.mp4" \  -F chunk_index="0" \  -F total_chunks="10" \  -F total_size="104857600"
{  "success": true,  "data": {    "message": "Chunk received",    "session_id": "sess-abc123",    "video_id": "abc123def456",    "chunk_index": 0,    "chunks_received": 1,    "total_chunks": 10,    "bytes_written": 10485760,    "total_size": 104857600,    "progress": 10,    "status": "uploading",    "seq": 1,    "instance": null  }}
GET
/api/visionaire-media/{nvrServerId}/videos/upload/status/{sessionId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

sessionId*string

ID sesi upload yang dikembalikan saat chunk pertama diterima.

Response Body

application/json

curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/upload/status/string"
{  "success": true,  "data": {    "session_id": "sess-abc123",    "video_id": "abc123def456",    "original_filename": "rekaman-2026-01.mp4",    "status": "uploading",    "bytes_written": 52428800,    "total_size": 104857600,    "chunks_received": 5,    "total_chunks": 10,    "progress": 50,    "created_at": "2026-01-15T08:00:00Z",    "updated_at": "2026-01-15T08:02:30Z"  }}
GET
/api/visionaire-media/{nvrServerId}/videos/upload/resume/{sessionId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

sessionId*string

ID sesi upload yang ingin dilanjutkan.

Query Parameters

filename?string

Nama file asli (opsional, untuk verifikasi).

video_id?string

ID video yang terkait (opsional, untuk verifikasi).

Response Body

application/json

curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/upload/resume/string"
{  "success": true,  "data": {    "message": "Session found, can resume",    "session_id": "sess-abc123",    "video_id": "abc123def456",    "original_filename": "rekaman-2026-01.mp4",    "status": "paused",    "chunks_received": 5,    "total_chunks": 10,    "bytes_written": 52428800,    "total_size": 104857600,    "progress": 50,    "missing_chunks": [      5,      6,      7,      8,      9    ],    "can_reuse_session": true  }}
POST
/api/visionaire-media/{nvrServerId}/videos/upload/cancel/{sessionId}

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

sessionId*string

ID sesi upload yang akan dibatalkan.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/upload/cancel/string"
{  "success": true,  "message": "Upload cancelled successfully",  "session_id": "sess-abc123"}

Kontrol Streaming

Jeda dan lanjutkan streaming RTSP per video tanpa menghentikan proses FFmpeg secara penuh.

POST
/api/visionaire-media/{nvrServerId}/videos/{videoId}/pause

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

videoId*string

ID unik video.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/string/pause"
{  "message": "Video paused",  "video_id": "abc123def456",  "status": "paused"}
POST
/api/visionaire-media/{nvrServerId}/videos/{videoId}/resume

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

videoId*string

ID unik video.

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/string/resume"
{  "message": "Video resumed",  "video_id": "abc123def456",  "status": "streaming"}

Device Pipeline

Setiap video yang diunggah direpresentasikan sebagai device dengan skema file di Media Server. Gunakan endpoint ini untuk restart atau stop proses FFmpeg yang menayangkan stream RTSP video tersebut.

POST
/api/visionaire-media/{nvrServerId}/devices/{scheme}/{path}/restart

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

scheme*string

Skema device. Untuk video yang diunggah, gunakan file.

Value in"rtsp" | "rtmp" | "file"
path*string

Path device dalam format channel/nama (contoh: live/rekaman-2026-01).

Query Parameters

instance?string

Identifier instance pada mode Federation (opsional).

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/devices/rtsp/string/restart"
{  "success": true,  "message": "Device restarted successfully"}
POST
/api/visionaire-media/{nvrServerId}/devices/{scheme}/{path}/stop

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Path Parameters

nvrServerId*integer

ID numerik Media Server (NVR).

scheme*string

Skema device.

Value in"rtsp" | "rtmp" | "file"
path*string

Path device dalam format channel/nama.

Query Parameters

instance?string

Identifier instance pada mode Federation (opsional).

Response Body

application/json

curl -X POST "https://lenz.example.com/api/visionaire-media/0/devices/rtsp/string/stop"
{  "success": true,  "message": "Device stopped successfully"}

Ekstraksi Timestamp AI

Endpoint opsional untuk mendeteksi overlay timestamp pada frame video menggunakan model AI (Gemini). Digunakan saat ekstraksi otomatis dari metadata file tidak berhasil.

POST
/api/llm/frame-timestamp-extraction

Authorization

bearerAuth
AuthorizationBearer <token>

In: header

Request Body

multipart/form-data

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

curl -X POST "https://lenz.example.com/api/llm/frame-timestamp-extraction" \  -F image_url="https://storage.example.com/frames/frame-001.jpg" \  -F model_api_key_id="apikey-gemini-001" \  -F timestamp_format="DD-MM-YYYYTHH:mm:ss"
{  "ok": true,  "message": "Timestamp extracted",  "data": {    "timestamp": "15-01-2026T08:00:00",    "found": true,    "confidence": 0.97  }}
{  "ok": false,  "message": "No timestamp found in frame",  "data": {    "timestamp": "",    "found": false,    "confidence": 0  }}

On this page