Theta Video Service: Video on Demand

Create a pre-signed URL to Upload a Video

📘

You can skip the upload step if you have an external URL where your video is already hosted.

Request:

curl --location --request POST 'https://api.thetavideoapi.com/upload' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://api.thetavideoapi.com/upload',
  'headers': {
    'x-tva-sa-id': 'srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx',
    'x-tva-sa-secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

Response:

{
    "status": "success",
    "body": {
        "uploads": [
            {
                "id": "upload_zzzzzzzzzzzzzzzzzzzzzzzzz",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "presigned_url": "https://storage.googleapis.com/files.thetavideoapi.com/srvacc_1f3z0062ij26bu1pa8h65we6h/upload_4d0j6tx7nbwmv96sp7y7uz550?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=beta-tva-dispatcher-sa%40beta-theta-video-api.iam.gserviceaccount.com%2F20210930%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210930T161215Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=6522b1df0d2c1dc583cc9ae1a4f357b1a176c72da6d3f3c52516b024a75b35afcea1570fba165a0516607a55c79d7032509558c11126a09d8380c9d5fcbb505652c6d461dcb8277a281a5ab24e19ac34dc4431d25fcbc99e4022c6cc835fc6d2602fd99b89c01639fdff6d5175ed857452213b6946a1e0c611f1fc5608357d34687abc90dff7559ac1770d5093a454a24d52676566373c5238732ff2984ac411601972f8e595e8f0419ec96f24ca893b08a21c45ec4ddc455b047326b60018fe5a5e0ab646bacac37f3a4f340f1f41cf3ab985bd48a226984f238fd3c5ba48851b4be981b76d138f0fb06af6af358709e7fc58d721c1ef991d23fd8953dd1c7f",
                "presigned_url_expiration": "2021-09-30T16:27:15.432Z",
                "presigned_url_expired": false,
                "create_time": "2021-09-30T16:12:15.432Z",
                "update_time": "2021-09-30T16:12:15.432Z"
            }
        ]
    }
}

📘

You will need the "id" in this response later. It's used as the "source_upload_id" in the API to transcode a video using an upload.

Upload a Video using the pre-signed URL

Request:

curl --location --request PUT 'https://storage.googleapis.com/files.thetavideoapi.com/srvacc_1f3z0062ij26bu1pa8h65we6h/upload_4d0j6tx7nbwmv96sp7y7uz550?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=beta-tva-dispatcher-sa%40beta-theta-video-api.iam.gserviceaccount.com%2F20210930%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210930T161215Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=6522b1df0d2c1dc583cc9ae1a4f357b1a176c72da6d3f3c52516b024a75b35afcea1570fba165a0516607a55c79d7032509558c11126a09d8380c9d5fcbb505652c6d461dcb8277a281a5ab24e19ac34dc4431d25fcbc99e4022c6cc835fc6d2602fd99b89c01639fdff6d5175ed857452213b6946a1e0c611f1fc5608357d34687abc90dff7559ac1770d5093a454a24d52676566373c5238732ff2984ac411601972f8e595e8f0419ec96f24ca893b08a21c45ec4ddc455b047326b60018fe5a5e0ab646bacac37f3a4f340f1f41cf3ab985bd48a226984f238fd3c5ba48851b4be981b76d138f0fb06af6af358709e7fc58d721c1ef991d23fd8953dd1c7f' \
--header 'Content-Type: application/octet-stream' \
--data-binary '@/Users/renegarcia/Downloads/file_example.mp4'
var request = require('request');
var options = {
  'method': 'PUT',
  'url': 'https://storage.googleapis.com/files.thetavideoapi.com/srvacc_1f3z0062ij26bu1pa8h65we6h/upload_4d0j6tx7nbwmv96sp7y7uz550?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=beta-tva-dispatcher-sa%40beta-theta-video-api.iam.gserviceaccount.com%2F20210930%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20210930T161215Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=6522b1df0d2c1dc583cc9ae1a4f357b1a176c72da6d3f3c52516b024a75b35afcea1570fba165a0516607a55c79d7032509558c11126a09d8380c9d5fcbb505652c6d461dcb8277a281a5ab24e19ac34dc4431d25fcbc99e4022c6cc835fc6d2602fd99b89c01639fdff6d5175ed857452213b6946a1e0c611f1fc5608357d34687abc90dff7559ac1770d5093a454a24d52676566373c5238732ff2984ac411601972f8e595e8f0419ec96f24ca893b08a21c45ec4ddc455b047326b60018fe5a5e0ab646bacac37f3a4f340f1f41cf3ab985bd48a226984f238fd3c5ba48851b4be981b76d138f0fb06af6af358709e7fc58d721c1ef991d23fd8953dd1c7f',
  'headers': {
    'Content-Type': 'application/octet-stream'
  },
  body: "<file contents here>"

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

Response:

empty

Transcode a Video using an Upload

Request:

curl --location --request POST 'https://api.thetavideoapi.com/video' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "source_upload_id": "upload_zzzzzzzzzzzzzzzzzzzzzzzzz",
    "playback_policy": "public",
    "nft_collection": "0x5d0004fe2e0ec6d002678c7fa01026cabde9e793",
    "metadata": {
    		"key": "value"
    }
}'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://api.thetavideoapi.com/video',
  'headers': {
    'x-tva-sa-id': 'srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx',
    'x-tva-sa-secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({"source_upload_id":"upload_zzzzzzzzzzzzzzzzzzzzzzzzz","playback_policy":"public","nft_collection":"0x5d0004fe2e0ec6d002678c7fa01026cabde9e793","metadata":{"key":"value"}})

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

Response:

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": null,
                "create_time": "2021-09-30T16:43:00.806Z",
                "update_time": "2021-09-30T16:43:00.806Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "created",
                "sub_state": "none",
                "source_upload_id": "upload_zzzzzzzzzzzzzzzzzzzzzzzzz",
                "source_uri": null,
                "playback_policy": "public",
                "progress": 0,
                "error": null,
                "duration": null,
                "resolution": null,
                "metadata": {
                    "key": "value"
                }
            }
        ]
    }
}

📘

All file types supported by FFMPEG can be uploaded to the TVA.

Transcode a Video using an external URI

Request:

curl --location --request POST 'https://api.thetavideoapi.com/video' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
    "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
    "playback_policy": "public",
    "nft_collection": "0x5d0004fe2e0ec6d002678c7fa01026cabde9e793",
    "metadata": {
    		"key": "value"
    }
}'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://api.thetavideoapi.com/video',
  'headers': {
    'x-tva-sa-id': 'srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx',
    'x-tva-sa-secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({"source_uri":"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4","playback_policy":"public","nft_collection":"0x5d0004fe2e0ec6d002678c7fa01026cabde9e793","metadata":{"key":"value"}})

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

Response:

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": null,
                "create_time": "2021-09-30T16:50:56.662Z",
                "update_time": "2021-09-30T16:50:56.662Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "created",
                "sub_state": "none",
                "source_upload_id": null,
                "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
                "playback_policy": "public",
                "progress": 0,
                "error": null,
                "duration": null,
                "resolution": null,
                "metadata": {
                    "key": "value"
                }
            }
        ]
    }
}

GET your Video to check it's progress

Request:

curl --location --request GET 'https://api.thetavideoapi.com/video/video_vvvvvvvvvvvvvvvvvvvvvvvvvv' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://api.thetavideoapi.com/video/video_vvvvvvvvvvvvvvvvvvvvvvvvvv',
  'headers': {
    'x-tva-sa-id': 'srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx',
    'x-tva-sa-secret': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  }
};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

Response of in progress video:

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": null,
                "create_time": "2021-09-30T16:50:56.662Z",
                "update_time": "2021-09-30T16:51:48.467Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "processing",
                "sub_state": "transcoding",
                "source_upload_id": null,
                "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
                "playback_policy": "public",
                "progress": 9.58,
                "error": null,
                "duration": null,
                "resolution": null,
                "metadata": {}
            }
        ]
    }
}

Response of finished video:

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": "https://media.thetavideoapi.com/video_vvvvvvvvvvvvvvvvvvvvvvvvvv/master.m3u8",
                "create_time": "2021-09-30T16:50:56.662Z",
                "update_time": "2021-09-30T17:00:57.520Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "success",
                "sub_state": "none",
                "source_upload_id": null,
                "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
                "playback_policy": "public",
                "progress": 100,
                "error": null,
                "duration": "596473",
                "resolution": 720,
                "metadata": {}
            }
        ]
    }
}

List Videos

Request:

curl --location --request GET 'https://api.thetavideoapi.com/video/srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx/list?page=1&number=100' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \

Response:

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": "https://media.thetavideoapi.com/video_vvvvvvvvvvvvvvvvvvvvvvvvvv/master.m3u8",
                "create_time": "2021-09-30T16:50:56.662Z",
                "update_time": "2021-09-30T17:00:57.520Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "success",
                "sub_state": "none",
                "source_upload_id": null,
                "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
                "playback_policy": "public",
                "progress": 100,
                "error": null,
                "duration": "596473",
                "resolution": 720,
                "metadata": {}
            }
        ]
    }
}

Search Videos

Search through your videos' metadata and file_name fields

Request:

curl --location --request GET 'https://api.thetavideoapi.com/video/srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx/search?key=value&page=1&number=100' \
--header 'x-tva-sa-id: srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'x-tva-sa-secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \

Response

{
    "status": "success",
    "body": {
        "videos": [
            {
                "id": "video_vvvvvvvvvvvvvvvvvvvvvvvvvv",
                "playback_uri": "https://media.thetavideoapi.com/video_vvvvvvvvvvvvvvvvvvvvvvvvvv/master.m3u8",
                "create_time": "2021-09-30T16:50:56.662Z",
                "update_time": "2021-09-30T17:00:57.520Z",
                "service_account_id": "srvacc_xxxxxxxxxxxxxxxxxxxxxxxxx",
                "file_name": null,
                "state": "success",
                "sub_state": "none",
                "source_upload_id": null,
                "source_uri": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
                "playback_policy": "public",
                "progress": 100,
                "error": null,
                "duration": "596473",
                "resolution": 720,
                "metadata": {
                    "key": "value",
                    "obj": {
                        "key": "value"
                    }
                }
            }
        ]
    }
}

📘

You can search for nested fields in metadata with a dot between the key names.

Using the example JSON above, the inner value can be searched for with ?obj.key=value

📘

You can specify the operator to use with the 'operator' query param (available options are 'and' and 'or'; default is 'and').

Enable Theta p2p Video Delivery

To enable Theta p2p Video Delivery for the transcoded video, please follow the steps in this guide.


What’s Next