soporte Contactar con asistencia técnica | estado del sistema Estado del Sistema

Administrando Clips

En este tema, aprenderá cómo administrar videoclips usando la CMS API.

Introducción

Los clips son videos creados a partir de segmentos de otros videos generados por Brightcove Social y otras herramientas Si los clips se crean para compartir a través de Brightcove Social, es posible que desee eliminar sus representaciones para reducir su almacenamiento administrado y / o desactivarlas para evitar que aparezcan en sus flujos de trabajo de video.

Encontrar clips

Hay términos de búsqueda especiales para el CMS API para ayudarte a localizar clips en tu cuenta:

  • q=%2Bis_clip:true - devuelve solo clips
  • q=%2Dis_clip:true - devuelve solo no clips
  • q=%2Bis_clip:false - devuelve solo no clips (funcionalmente idéntico al elemento anterior)
  • q=%2Bclip_source_video_id: video_id - devuelve clips generados a partir del video especificado

Muestra

Solicitar

  https://cms.api.brightcove.com/v1/accounts/57838016001/videos?q=%2Bis_clip:true

Respuesta

  [
    {
      "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"
    }
  ]

Eliminando activos

Si no va a utilizar sus clips para ningún otro propósito que no sea compartirlos con los sitios de las redes sociales, tal vez desee reducir su almacenamiento gestionado quitándole activos. En términos de almacenamiento, las representaciones hacen la mayor diferencia, pero también puede eliminar carteles y miniaturas, si lo desea (esto también ayudaría a identificar los clips en Studio como videos que no son de uso general).

Para eliminar activos, usará los puntos finales activos de la CMS API. La lógica es simple: primero OBTENGA los recursos para recuperar sus identificadores en el Video Cloud sistema, y ​​luego eliminarlos:

Lógica para eliminar los descuentos
Lógica para eliminar interpretaciones

Por lo general, solo habrá un solo póster y una miniatura para eliminar, pero generalmente habrá múltiples rendiciones, por lo que si va a hacer esto programáticamente, deberá recorrer la matriz de objetos devueltos por la solicitud de entregas GET y eliminar el entregas una a una. A continuación se muestran los puntos finales relevantes de API y algunos ejemplos de código (JavaScript + un proxy escrito en PHP para realizar las solicitudes de API) para realizar las tareas de eliminación de los activos.

Puntos finales de los activos

Estos son los puntos finales de los activos relevantes que necesitará para eliminar los activos. Para todos estos puntos finales, la URL base es:

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

Rendiciones

Obtener interpretaciones

  /account_id/videos/video_id/assets/renditions

BORRAR una rendición

  /account_id/videos/video_id/assets/renditions/rendition_id

Sesiones de póster:

GET posters

  /account_id/videos/video_id/assets/poster

ELIMINAR un póster

  /account_id/videos/video_id/assets/poster/poster_id

Miniaturas

OBTENER miniaturas

  /account_id/videos/video_id/assets/thumbnail

BORRAR una miniatura

  /account_id/videos/video_id/assets/thumbnail/thumbnail_id

Aplicación de ejemplo

A continuación, se muestra el código de muestra de una aplicación que encuentra todos los clips en una cuenta y luego elimina todas las entregas, así como el póster y la miniatura de cada clip.

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

apoderado


Página actualizada por última vez el 12 jun 2020