入門
クリップは、によって生成された他のビデオのセグメントから作成されたビデオですBrightcoveソーシャルおよびその他のツール。クリップがBrightcoveSocialを介して共有するために作成されている場合は、レンディションを削除して管理対象ストレージを減らしたり、無効にしてビデオワークフローに表示されないようにすることができます。
クリップの検索
には特別な検索用語がありますCMS APIアカウント内のクリップを見つけるのに役立ちます。
q=%2Bis_clip:true
-クリップのみを返しますq=%2Dis_clip:true
-非クリップのみを返しますq=%2Bis_clip:false
-非クリップのみを返します(機能的には前のアイテムと同じです)q=%2Bclip_source_video_id: video_id
-指定されたビデオから生成されたクリップを返します
サンプル
要求
https://cms.api.brightcove.com/v1/accounts/57838016001/videos?q=%2Bis_clip:true
応答
[
{
"id": "5235328819001",
"account_id": "57838016001",
"ad_keys": null,
"clip_source_video_id": "4752143002001",
"complete": true,
"created_at": "2016-12-04T17:06:20.562Z",
"cue_points": [],
"custom_fields": {
"subject": "Birds"
},
"delivery_type": "static_origin",
"description": null,
"digital_master_id": "5235339325001",
"duration": 24042,
"economics": "AD_SUPPORTED",
"folder_id": null,
"geo": null,
"has_digital_master": true,
"images": {
"thumbnail": {
"asset_id": "5235341448001",
"remote": false,
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235341448001_5235328819001-th.jpg?pubId=57838016001&videoId=5235328819001",
"sources": [
{
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235341448001_5235328819001-th.jpg?pubId=57838016001&videoId=5235328819001",
"height": 90,
"width": 160
},
{
"src": "https://brightcove.hs.llnwd.net/v2/unsecured/media/57838016001/201612/2025/57838016001_5235341448001_5235328819001-th.jpg?pubId=57838016001&videoId=5235328819001",
"height": 90,
"width": 160
}
]
},
"poster": {
"asset_id": "5235339121001",
"remote": false,
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235339121001_5235328819001-vs.jpg?pubId=57838016001&videoId=5235328819001",
"sources": [
{
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235339121001_5235328819001-vs.jpg?pubId=57838016001&videoId=5235328819001",
"height": 360,
"width": 640
},
{
"src": "https://brightcove.hs.llnwd.net/v2/unsecured/media/57838016001/201612/2025/57838016001_5235339121001_5235328819001-vs.jpg?pubId=57838016001&videoId=5235328819001",
"height": 360,
"width": 640
}
]
}
},
"link": null,
"long_description": null,
"name": "greatblueheron.mp4 - Clip-2016-12-04",
"original_filename": "2efadac9-8e36-423c-b988-afcf2cd23c49.mov",
"projection": null,
"published_at": "2016-12-04T17:06:20.562Z",
"reference_id": null,
"schedule": null,
"sharing": null,
"state": "ACTIVE",
"tags": [
"newtag"
],
"text_tracks": [],
"updated_at": "2016-12-04T17:08:41.944Z"
},
{
"id": "5235312567001",
"account_id": "57838016001",
"ad_keys": null,
"clip_source_video_id": "5220368996001",
"complete": true,
"created_at": "2016-12-04T17:07:58.450Z",
"cue_points": [],
"custom_fields": {
"subject": "Birds"
},
"delivery_type": "static_origin",
"description": "Mother and child owls...",
"digital_master_id": "5235341452001",
"duration": 39253,
"economics": "AD_SUPPORTED",
"folder_id": null,
"geo": null,
"has_digital_master": true,
"images": {
"thumbnail": {
"asset_id": "5235339124001",
"remote": false,
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235339124001_5235312567001-th.jpg?pubId=57838016001&videoId=5235312567001",
"sources": [
{
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235339124001_5235312567001-th.jpg?pubId=57838016001&videoId=5235312567001",
"height": 90,
"width": 160
},
{
"src": "https://brightcove.hs.llnwd.net/v2/unsecured/media/57838016001/201612/1897/57838016001_5235339124001_5235312567001-th.jpg?pubId=57838016001&videoId=5235312567001",
"height": 90,
"width": 160
}
]
},
"poster": {
"asset_id": "5235341824001",
"remote": false,
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235341824001_5235312567001-vs.jpg?pubId=57838016001&videoId=5235312567001",
"sources": [
{
"src": "http://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235341824001_5235312567001-vs.jpg?pubId=57838016001&videoId=5235312567001",
"height": 540,
"width": 960
},
{
"src": "https://brightcove.hs.llnwd.net/v2/unsecured/media/57838016001/201612/1897/57838016001_5235341824001_5235312567001-vs.jpg?pubId=57838016001&videoId=5235312567001",
"height": 540,
"width": 960
}
]
}
},
"link": null,
"long_description": null,
"name": "Great Horned Owl - Clip-2016-12-04",
"original_filename": "c0640095-e696-41ea-8e7e-2ebf4d090d69.mov",
"projection": null,
"published_at": "2016-12-04T17:07:58.450Z",
"reference_id": null,
"schedule": null,
"sharing": null,
"state": "ACTIVE",
"tags": [
"bird",
"nature",
"air"
],
"text_tracks": [],
"updated_at": "2016-12-04T17:09:16.967Z"
}
]
アセットの削除
ソーシャルメディアサイトとの共有以外の目的でクリップを使用しない場合は、アセットを削除して管理対象ストレージを削減することをお勧めします。ストレージに関しては、レンディションが最も効果的ですが、必要に応じてポスターやサムネイルを削除することもできます(これは、Studioのクリップが一般的なビデオではないことを識別するのにも役立ちます)。
アセットを削除するには、 CMS APIのアセットエンドポイント。ロジックは単純です。最初にアセットを取得してVideoCloudシステムでIDを取得し、次にそれらを削除します。
通常、削除するポスターとサムネイルは1つだけですが、通常は複数のレンディションがあるため、これをプログラムで行う場合は、GETレンディションリクエストによって返されたオブジェクトの配列をループして、を削除する必要があります。レンディションを1つずつ。以下は、アセットを削除するタスクを実行するための、関連するAPIエンドポイントといくつかのサンプルコード(JavaScript + APIリクエストを行うためにPHPで記述されたプロキシ)です。
アセットエンドポイント
アセットを削除するために必要な関連するアセットエンドポイントは次のとおりです。これらすべてのエンドポイントの場合、ベースURLは次のとおりです。
https://cms.api.brightcove.com/v1/accounts
レンディション
レンディションを取得する
/account_id/videos/video_id/assets/renditions
レンディションを削除する
/account_id/videos/video_id/assets/renditions/rendition_id
ポスター
ポスターを入手
/account_id/videos/video_id/assets/poster
ポスターを削除する
/account_id/videos/video_id/assets/poster/poster_id
サムネイル
サムネイルを取得
/account_id/videos/video_id/assets/thumbnail
サムネイルを削除する
/account_id/videos/video_id/assets/thumbnail/thumbnail_id
サンプルアプリ
以下は、アカウント内のすべてのクリップを検索し、すべてのレンディション、および各クリップのポスターとサムネイルを削除するアプリのサンプルコードです。
HTML
<fieldset>
<legend>Inputs</legend>
<p>Account id: <input type="text" name="account_id" id="account_id" value=""></p>
<p>Client id: <input type="text" name="client_id" id="client_id" value=""></p>
<p>Client secret: <input type="text" name="client_secret" id="client_secret" value=""></p>
<p><button id="goBtn">Remove all clip assets</button></p>
</fieldset>
<h2>Results</h2>
<pre id="status"></pre>
JavaScript
var BCLS = (function (window, document) {
/**
* this scripts assumes that HTML elements with ids shown
* in the following assignments exist in the page that
* calls this script.
* Alternatively, store the client_id and client_secret
* in the proxy (NOT in a client-side script!)
* and the account_id value here
*/
var account_id = document.getElementById('account_id'),
client_id = document.getElementById('client_id'),
client_secret = document.getElementById('client_secret'),
status = document.getElementById('status'),
goBtn = document.getElementById('goBtn'),
videoCount = 0,
videoNumber = 0,
totalCalls = 0,
callNumber = 0,
renditionNumber = 0,
videoData = [],
renditionData = [],
posterData = {},
thumbnailData = {};
/**
* sets up all API requests and handles the responses
* @param {String} type the request type
*/
function setUpRequest(type) {
var baseURL = 'https://cms.api.brightcove.com/v1/accounts',
endpoint,
responseDecoded,
// recommended limit value for best performance with CMS API
limit = 25,
options = {};
options.client_id = (client_id.value) ? client_id.value : null;
options.client_secret = (client_secret.value) ? client_secret.value : null;
switch (type) {
// get a count of clips
case 'getCount':
endpoint = '/' + account_id.value + '/counts/videos?q=%2Bis_clip:true';
options.url = baseURL + endpoint;
options.requestType = 'GET';
makeRequest(options, function(response) {
if (response) {
responseDecoded = JSON.parse(response);
videoCount = parseInt(responseDecoded.count);
// calculate total calls needed to get the video clips
totalCalls = Math.ceil(videoCount / limit);
setUpRequest('getVideoClips');
}
});
break;
// retrieve the clips
case 'getVideoClips':
endpoint = '/' + account_id.value + '/videos?q=%2Bis_clip:true&limit=' + limit + '&offset=' + (limit * callNumber);
options.url = baseURL + endpoint;
options.requestType = 'GET';
makeRequest(options, function(response) {
if (response) {
responseDecoded = JSON.parse(response);
// add new clips to videoData array
videoData.push.apply(videoData, responseDecoded);
}
// increment the call number
callNumber++;
// are we done?
if (callNumber < totalCalls) {
// get the next batch
setUpRequest('getVideoClips');
} else {
// got all the clips
// update status
status.textContent =+ videoData.length + ' video clips found \n';
// reset the callNumber
callNumber = 0;
setUpRequest('getRenditions');
}
});
break;
case 'getRenditions':
endpoint = '/' + account_id.value + '/videos/' + videoData[videoNumber].id + '/assets/renditions';
options.url = baseURL + endpoint;
options.requestType = 'GET';
// update status
status.textContent =+ 'fetching renditions for clip ' + videoData[callNumber].name + ' \n';
makeRequest(options, function(response) {
if (response) {
responseDecoded = JSON.parse(response);
renditionData = responseDecoded;
// update status
status.textContent =+ renditionData.length + ' renditions found for clip ' + videoData[callNumber].name + ' \n';
if (renditionData.length > 0) {
setUpRequest('deleteRendition');
} else {
setUpRequest('getPoster');
}
} else {
// no renditions
status.textContent =+ 'no renditions found for clip number ' + videoData[callNumber].name + ' \n';
setUpRequest('getPoster');
}
});
break;
case 'deleteRendition':
endpoint = '/' + account_id.value + '/videos/' + videoData[videoNumber].id + '/assets/renditions/' + renditionData[renditionNumber].id;
options.url = baseURL + endpoint;
options.requestType = 'DELETE';
makeRequest(options, function(response) {
// there should be no response unless there was an error
if (response) {
status.textContent += 'Delete rendition response: ' + response + ' \n';
// keep going anyway
renditionNumber++;
if (renditionNumber < renditionData.length) {
setUpRequest('deleteRendition');
} else {
// done with renditions, do poster
setUpRequest('getPoster');
}
} else {
status.textContent += 'Rendition deleted for ' + videoData[callNumber].name + '\n';
renditionNumber++;
// check to see if there are more renditions
if (renditionNumber < renditionData.length) {
setUpRequest('deleteRendition');
} else {
// do the poster
setUpRequest('getPoster');
}
}
});
break;
case 'getPoster':
endpoint = '/' + account_id.value + '/videos/' + videoData[videoNumber].id + '/assets/poster';
options.url = baseURL + endpoint;
options.requestType = 'GET';
makeRequest(options, function(response) {
if (response) {
posterData = JSON.parse(response);
setUpRequest('deletePoster');
} else {
// no poster, do the thumbail
setUpRequest('getThumbnail');
}
});
break;
case 'deletePoster':
endpoint = '/' + account_id.value + '/videos/' + videoData[videoNumber].id + '/assets/poster/' + posterData.id;
options.url = baseURL + endpoint;
options.requestType = 'DELETE';
makeRequest(options, function(response) {
// no response unless something went wront
if (response) {
status.textContent += 'Delete poster response: ' + response + ' \n';
// try thumbnail anyway
setUpRequest('getThumbnail');
} else {
// success; do thumbnail
status.textContent += 'Poster deleted for ' + videoData[callNumber].name + ' \n';
setUpRequest('getThumbnail');
}
});
break;
case 'getThumbnail':
endpoint = '/' + account_id.value + '/videos/' + videoData[callNumber].id + '/assets/thumbnail';
options.url = baseURL + endpoint;
options.requestType = 'GET';
makeRequest('options', function(response) {
if (response) {
thumbnailData = JSON.parse(response);
setUpRequest('deleteThumbnail');
} else {
// if no thumbnail, go on
videoNumber++;
if (videoNumber < videoCount) {
setUpRequest('getRenditions');
} else {
// done
status.textContent += 'Finished!';
}
}
});
break;
case 'deleteThumbnail':
endpoint = '/' + account_id.value + '/videos/' + videoData[videoNumber].id + '/assets/thumbnail/' + thumbnailData.id;
options.url = baseURL + endpoint;
options.requestType = 'DELETE';
makeRequest(options, function(response) {
// no response unless something went wrong
if (response) {
status.textContent += 'Delete thumbnail response: ' + response + ' \n';
// do next video anyway if any
videoNumber++;
if (videoNumber < videoCount) {
setUpRequest('getRenditions');
} else {
// done
status.textContent += 'Finished!';
}
} else {
// success
status.textContent += 'Thumbnail deleted for ' + videoData[callNumber].name + ' \n';
// do next video if any
videoNumber++;
if (videoNumber < videoCount) {
setUpRequest('getRenditions');
} else {
// done
status.textContent += 'Finished!';
}
}
});
break;
default:
if (console) {
console.log('default case: we should not be here');
}
}
}
/**
* send API request to the proxy
* @param {Object} requestData options for the request
* @param {Function} [callback] callback function
*/
function makeRequest(options, callback) {
var httpRequest = new XMLHttpRequest(),
response,
requestParams,
dataString,
proxyURL = 'https://solutions.brightcove.com/bcls/bcls-proxy/clips-proxy.php',
// response handler
getResponse = function() {
try {
if (httpRequest.readyState === 4) {
if (httpRequest.status >= 200 && httpRequest.status < 300) {
response = httpRequest.responseText;
console.log('raw response', response);
// some API requests return '{null}' for empty responses - breaks JSON.parse
if (response === '{null}') {
response = null;
}
// return the response
callback(response);
} else {
alert('There was a problem with the request. Request returned ' + httpRequest.status);
}
}
} catch (e) {
alert('Caught Exception: ' + e);
}
};
/**
* set up request data
* the proxy used here takes the following request body:
* JSON.stringify(options)
*/
// set response handler
httpRequest.onreadystatechange = getResponse;
// open the request
httpRequest.open('POST', proxyURL);
// set headers if there is a set header line, remove it
// open and send request
httpRequest.send(JSON.stringify(options));
}