지원 지원 문의 | 시스템 상태 시스템 상태

클립 관리

이 항목에서는 다음을 사용하여 비디오 클립을 관리하는 방법을 학습합니다. CMS API.

소개

클립은 다른 동영상의 세그먼트에서 생성 된 동영상입니다. Brightcove Social 그리고 다른 도구들. 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": "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. 논리는 간단합니다. 먼저 에셋을 가져 와서 자신의 ID를 가져옵니다. Video Cloud 시스템을 삭제 한 다음 삭제하십시오.

렌 디션 제거 로직
렌디 제거를위한 논리

일반적으로 삭제할 포스터와 미리보기 이미지는 하나 뿐이지 만 일반적으로 여러 개의 렌 디션이 있으므로 프로그래밍 방식으로이 작업을 수행하려는 경우 GET renditions 요청에서 반환 된 객체 배열을 반복하여 삭제해야합니다. 하나씩 번역 아래에는 관련 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>

자바 스크립트

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

대리


12 년 2020 월 XNUMX 일에 마지막으로 업데이트 된 페이지