管理剪輯片段

在本主題中,您將學習如何使用 CMS API 管理視訊片段。

簡介

剪輯是從由Brightcove社交和其他工具。如果剪輯是通過Brightcove Social共享創建的,則您可能希望刪除其片段,以減少託管存儲量,和/或禁用它們以防止它們出現在視頻工作流程中。

尋找片段

有一些特殊的搜索詞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": "https://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235341448001_5235328819001-th.jpg?pubId=57838016001&videoId=5235328819001",
          "sources": [
            {
              "src": "https://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": "https://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/2025/57838016001_5235339121001_5235328819001-vs.jpg?pubId=57838016001&videoId=5235328819001",
          "sources": [
            {
              "src": "https://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": "https://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235339124001_5235312567001-th.jpg?pubId=57838016001&videoId=5235312567001",
          "sources": [
            {
              "src": "https://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": "https://brightcove.vo.llnwd.net/v1/unsecured/media/57838016001/201612/1897/57838016001_5235341824001_5235312567001-vs.jpg?pubId=57838016001&videoId=5235312567001",
          "sources": [
            {
              "src": "https://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的資產端點。邏輯很簡單:首先獲取資產以在視頻雲系統中檢索其ID,然後刪除它們:

刪除趨勢的邏輯
刪除渲染的邏輯

通常只有一個海報和縮略圖要刪除,但是通常會有多個再現,因此,如果要以編程方式進行此操作,則需要遍歷GET再現請求返回的對像數組並刪除一一呈現。以下是相關的API端點和一些示例代碼(JavaScript +用PHP編寫的用於發出API請求的代理)來執行刪除資產的任務。

資產端點

這是您需要刪除資產的相關資產端點。對於所有這些端點,基本URL為:

  https://cms.api.brightcove.com/v1/accounts

轉譯

GET演繹

  /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));
  }

代理