A gateway to facilitate a decentralised streaming ecosystem.
Currently hosted at https://demux.onrender.com/. For authentication credentials, please reach out to us at saumay@buidllabs.io.
- Clone the repo:
git clone https://github.com/buidl-labs/Demux
- Create a file
.envand set environment variables (sample present inDemux/.env.sample) - Run your docker daemon.
- Build the docker image:
docker build --tag demux:latest . - Run Demux:
docker run -p 8000:8000 --env-file ./.env demux:latest
POST /assetPOST /fileupload/<asset_id>GET /upload/<asset_id>GET /asset/<asset_id>POST /pricing[WIP]
Used to create a new asset. It returns an asset_id and a url, where the client can upload a file.
Examples
-
Request:
$ curl http://localhost:8000/asset -u <TOKEN_ID>:<TOKEN_SECRET> -d {}
Basic authentication must be done by passing the user flag as shown above (colon-separated), or by passing the
Authorizationheader.For example, in JavaScript:
headers: { 'Authorization' : 'Basic ' + Buffer.from('<TOKEN_ID>:<TOKEN_SECRET>', 'utf-8').toString('base64') }
-
Response:
{ "asset_id": "34d048bb-1076-4937-8b91-6bcda7a6187c", "url": "http://localhost:8000/fileupload/34d048bb-1076-4937-8b91-6bcda7a6187c" }
This endpoint is used to upload a video in chunks using resumable.js.
A frontend client can send the request in the following manner:
targetURL = `http://localhost:8000/fileupload/34d048bb-1076-4937-8b91-6bcda7a6187c` const r = new Resumable({ target: targetURL }) r.addFile(myfile) // myfile is the file (mp4 video) that is being uploaded.Here, the targetUrl is the url received after creating an asset using POST /asset. The status of the upload can be tracked using event listeners:
r.on('fileAdded', function (file) { r.upload() }) r.on('progress', function () { console.log(Math.floor(r.progress() * 100)) }) r.on('fileSuccess', function (file, message) { console.log('Successfully uploaded', file, 'message:', message) }) r.on('fileError', function (file, message) { console.log('Error uploading the file:', message) })For more details, refer to the resumable.js docs.
This endpoint lets us see the status of an upload.
Examples
-
Request:
$ curl http://localhost:8000/upload/34d048bb-1076-4937-8b91-6bcda7a6187c
-
Response:
{ "asset_id": "34d048bb-1076-4937-8b91-6bcda7a6187c", "error": false, "status": true, "url": "http://localhost:8000/fileupload/34d048bb-1076-4937-8b91-6bcda7a6187c" }In the response,
statusis initiallyfalse, and it becomestruewhen the file has been uploaded successfully to Demux (using/POST /fileupload/<asset_id>).errorisfalseby default, and becomestrueif there is some problem in uploading the file. A frontend client may poll for the upload status to change totruebefore proceeding to the next step in the workflow.
This endpoint gives us the status of an asset (uploaded video) in the pipeline.
Examples
-
Request:
$ curl http://localhost:8000/asset/34d048bb-1076-4937-8b91-6bcda7a6187c
-
Response:
{ "asset_error": false, "asset_id": "34d048bb-1076-4937-8b91-6bcda7a6187c", "asset_ready": true, "asset_status": "pinned to ipfs, attempting to store in filecoin", "asset_status_code": 3, "created_at": 1602077805, "storage_cost": 0, "storage_cost_estimated": 854019799804687, "stream_url": "https://demuxipfsrevproxy.onrender.com/ipfs/bafybeiddn2lzoybioi6xh76j7aa67jgxgyyxa42nirfxpo5q477432jzz4/root.m3u8", "thumbnail": "https://demuxipfsrevproxy.onrender.com/ipfs/bafybeiddn2lzoybioi6xh76j7aa67jgxgyyxa42nirfxpo5q477432jzz4/thumbnail.png", "transcoding_cost": 0, "transcoding_cost_estimated": 107880498671623 }
Fields
-
Response:
Field Name Type Description asset_error booleanInitially its value is false, it will become true in case there is an error. asset_id stringUsed to identify an uploaded video. asset_ready booleanInitially its value is false, it will become true once the video is ready for streaming. asset_status stringCan have five possible values, corresponding to asset_status_code
• -1: "asset created"
• 0: "video uploaded successfully"
• 1: "processing in livepeer"
• 2: "attempting to pin to ipfs"
• 3: "pinned to ipfs, attempting to store in filecoin"
• 4: "stored in filecoin"asset_status_code intPossible values: -1, 0, 1, 2, 3, 4 created_at intUnix timestamp of asset creation. storage_cost intActual storage cost in filecoin network (value in attoFIL). storage_cost_estimated intEstimated storage cost in filecoin network (value in attoFIL). stream_url stringURL to stream the video. thumbnail stringThumbnail for the video. transcoding_cost intActual transcoding cost in livepeer network (value in WEI). transcoding_cost_estimated intEstimated transcoding cost in livepeer network (value in WEI).
This is used to estimate the transcoding and storage cost for a given video.
Examples
-
Request:
$ curl http://localhost:8000/pricing -d "{\"video_duration\":60, \"video_file_size\":28, \"storage_duration\":2628005}" -
Response:
{ "storage_cost_estimated": 1562410068450, "transcoding_cost_estimated": 170337629481511 }
Fields
-
Request:
Field Name Type Description video_duration intDuration of the video in seconds. Its value must be greater than 0.video_file_size intSize of the video in MiB (1 MiB = 2^20 B). storage_duration intDuration in seconds for which you want to store the video stream in filecoin. Its value must be between 2628003and315360000. -
Response:
Field Name Type Description storage_cost_estimated intEstimated storage cost in filecoin network (value in attoFIL). transcoding_cost_estimated intEstimated transcoding cost in livepeer network (value in WEI).
- go 1.15.2
- ffmpeg
- mongodb
