Skip to main content
Skip table of contents

Two-stage VOD workflow with JITP

Overview

OpenTV Video Platform supports two-stage VOD workflows with JITP, such as those used with Harmonic VOS360. It also includes an adaptor for Harmonic VOS360.

The following diagram shows the main interactions between the Content Workflow Manager (CWM), the Business Configuration Manager (BCM), the external encoder/packager, the CDN, and so on for the two-stage VOD workflow with JITP:

NAGRA has created adaptors for Harmonic VOS360 and AWS Elemental encoders/packagers. If you are using a different encoder and/or packager, they must implement the appropriate NAGRA Encoding and Packaging API or Publish/Purge API.

Main steps

Setting up a VOD workflow consists of the following main stages, which are explained in detail in the following sections:

  1. Specify source, processing, and destination devices.
  2. Configure encoding profiles and attach them to the editorial content.
  3. Configure packaging profiles and attach them to the editorial content.
  4. Configure feature profiles and attach them to the technical content.

Once these are set up, the encoding job will be run according to a schedule based on the content start date and the dueDateOffset configured in the encoding profile. (For example, if the dueDateOffset is seven days, the encoding job will be run seven days before the configured content start date.)

Asset transfer and content purge are also supported. These are explained in the following pages:

Prerequisites

Content must have been ingested

The VOD content must have been ingested into the Content and Product Manager (CPM) via the CIM-NIS module. See the following example:

Sample CIM-NIS XML file

CODE
<?xml version="1.0" encoding="UTF-8"?>
<cmsData executionDate="2023-06-01T00:00:00Z"
    xmlns="nis.cim.sp.ml.nagra.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="Nagravision-Import-Full-Specification-v5.x.xsd">
   <editorialContent providerId="preclear34" providerResourceId="processing_GenericAssetContent34"
                     name="Generic Asset Editorial Content34"
                     contentType="movie" profileIds="pivot_creation_DEMO34;purge_vod_VOS360_34">
      <metadataSet locale="none">
         <metadata key="Duration">2760</metadata>
         <metadata key="EpisodeNumber">14</metadata>
         <metadata key="Rating">177</metadata>
         <metadata key="PromoImages">http://host40/data/posters/InfernalAffairsSeason1.jpg</metadata>
         <metadata key="Subtitles">chi-Standard</metadata>
         <metadata key="AudioMode">Nicam Stereo</metadata>
         <metadata key="Language">chi</metadata>
         <metadata key="Definition">HD</metadata>
         <metadata key="Img_event_270_360_shows">https://host37/poster/InfernalAffairsSeason1.jpg</metadata>
         <metadata key="Img_event_480_270_shows">https://host37/poster/InfernalAffairsSeason1.jpg</metadata>
      </metadataSet>
      <metadataSet locale="en_GB">
         <metadata key="Title">Infernal Affairs S1E14</metadata>
         <metadata key="Description">Mainland CID Officer JIANG ZIDAN,nicknamed "BULLET", infiltrates a Hong Kong triad group to investigate a cross-border drug trafficking case. HON LONG, works closely with BULLET and CHUN-HIN on the surface, but what lies underneath is indeed immeasurable power struggle, causing endless rivalry between the good and the evil, among these "frenemies"</metadata>
         <metadata key="Episode">Infernal Affairs (Season 1) [HD]</metadata>
         <metadata key="Synopsis">Mainland CID Officer JIANG ZIDAN,nicknamed "BULLET", infiltrates a Hong Kong triad group to investigate a cross-border drug trafficking case. HON LONG, works closely with BULLET and CHUN-HIN on the surface, but what lies underneath is indeed immeasurable power struggle, causing endless rivalry between the good and the evil, among these "frenemies"</metadata>
         <metadata key="Actors">Him Law;Gallen Lo;Damian Lau;Wang Yang</metadata>
         <metadata key="Genre">Drama Series</metadata>
         <metadata key="SubGenre">Drama</metadata>
      </metadataSet>
      <period start="2019-02-01T00:00:00Z" end="2019-03-01T00:00:00Z"/>
      <referenceAsset uri="ch100.ts" type="HD">
         <metadataSet locale="none">
            <metadata key="FileSize">3000000</metadata>
            <metadata key="FrameDuration">69000</metadata>
         </metadataSet>
         <assetDeviceLocation relativePath="" storageDeviceId="s3_device34" type="source"/>
      </referenceAsset>
   </editorialContent>
   <technicalContent providerId="Demo_tech_34" providerResourceId="providerResource_Demo_tech_34"
                     name="Generic Asset technical Content34"
                     profileId="DASH_package_creation_DEMO_For_Clear12">
      <metadataSet locale="none">
         <metadata key="Duration">2760</metadata>
         <metadata key="Definition">HD</metadata>
      </metadataSet>
      <period start="2019-02-01T00:00:00Z" end="2019-03-01T00:00:00Z"/>
      <editorialContentRef providerResourceId="processing_GenericAssetContent34" providerId="preclear34" />
      <securityInfo id="cc653259-fee6-401c-8d57-51b7ba34ae99" securityDeviceId="securityDevice01">
        <metadataSet locale="none">
             <metadata key="securityDeviceKey1">securityDeviceValue1</metadata>
        </metadataSet>
    </securityInfo> 
      
   </technicalContent>
</cmsData>

Technical content must contain encryption information

If the content needs to be encrypted, make sure that the TechnicalContent contains a securityInfo section:

  • If you specify the securityId for each technical content, it will be sent to the encoder as part of the packaging request.
  • If you do not specify the securityId as part of the ingest, but have defined the securityInfo section, the CPM automatically generates a securityId which will be sent as part of the packaging request.

Example

Sample technical content with securityInfo defined

CODE
<?xml version="1.0" encoding="UTF-8"?>
<cmsData executionDate="2023-06-01T00:00:00Z"
    xmlns="nis.cim.sp.ml.nagra.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="Nagravision-Import-Full-Specification-v5.x.xsd">
   <editorialContent providerId="preclear34" providerResourceId="processing_GenericAssetContent34"
                     name="Generic Asset Editorial Content34"
                     contentType="movie" profileIds="pivot_creation_DEMO34;purge_vod_VOS360_34">
      <metadataSet locale="none">
         <metadata key="Duration">2760</metadata>
         <metadata key="EpisodeNumber">14</metadata>
         <metadata key="Rating">177</metadata>
         <metadata key="PromoImages">http://host40/data/posters/InfernalAffairsSeason1.jpg</metadata>
         <metadata key="Subtitles">chi-Standard</metadata>
         <metadata key="AudioMode">Nicam Stereo</metadata>
         <metadata key="Language">chi</metadata>
         <metadata key="Definition">HD</metadata>
         <metadata key="Img_event_270_360_shows">https://host37/poster/InfernalAffairsSeason1.jpg</metadata>
         <metadata key="Img_event_480_270_shows">https://host37/poster/InfernalAffairsSeason1.jpg</metadata>
      </metadataSet>
      <metadataSet locale="en_GB">
         <metadata key="Title">Infernal Affairs S1E14</metadata>
         <metadata key="Description">Mainland CID Officer JIANG ZIDAN,nicknamed "BULLET", infiltrates a Hong Kong triad group to investigate a cross-border drug trafficking case. HON LONG, works closely with BULLET and CHUN-HIN on the surface, but what lies underneath is indeed immeasurable power struggle, causing endless rivalry between the good and the evil, among these "frenemies"</metadata>
         <metadata key="Episode">Infernal Affairs (Season 1) [HD]</metadata>
         <metadata key="Synopsis">Mainland CID Officer JIANG ZIDAN,nicknamed "BULLET", infiltrates a Hong Kong triad group to investigate a cross-border drug trafficking case. HON LONG, works closely with BULLET and CHUN-HIN on the surface, but what lies underneath is indeed immeasurable power struggle, causing endless rivalry between the good and the evil, among these "frenemies"</metadata>
         <metadata key="Actors">Him Law;Gallen Lo;Damian Lau;Wang Yang</metadata>
         <metadata key="Genre">Drama Series</metadata>
         <metadata key="SubGenre">Drama</metadata>
      </metadataSet>
      <period start="2019-02-01T00:00:00Z" end="2019-03-01T00:00:00Z"/>
      <referenceAsset uri="ch100.ts" type="HD">
         <metadataSet locale="none">
            <metadata key="FileSize">3000000</metadata>
            <metadata key="FrameDuration">69000</metadata>
         </metadataSet>
         <assetDeviceLocation relativePath="" storageDeviceId="s3_device34" type="source"/>
      </referenceAsset>
   </editorialContent>
   <technicalContent providerId="Demo_tech_34" providerResourceId="providerResource_Demo_tech_34"
                     name="Generic Asset technical Content34"
                     profileId="DASH_package_creation_DEMO_For_Clear12">
      <metadataSet locale="none">
         <metadata key="Duration">2760</metadata>
         <metadata key="Definition">HD</metadata>
      </metadataSet>
      <period start="2019-02-01T00:00:00Z" end="2019-03-01T00:00:00Z"/>
      <editorialContentRef providerResourceId="processing_GenericAssetContent34" providerId="preclear34" />
      <securityInfo id="cc653259-fee6-401c-8d57-51b7ba34ae99" securityDeviceId="securityDevice01">
        <metadataSet locale="none">
             <metadata key="securityDeviceKey1">securityDeviceValue1</metadata>
        </metadataSet>
    </securityInfo> 
      
   </technicalContent>
</cmsData>

No playable assets

Technical content must not have any playable assets.

Specify source, processing, and destination devices

VSPP requires a specific device configuration – see VSPP VOD configuration.

Specify the source device

To specify the source device:

  1. Construct the request payload so that it looks like this:

    CODE
    {
        "id": "deviceId1",
        "name": "cmsftp01",
        "workflow": {
            "accessPoints": [
            {
                "endPoint": "ftp://root:Superuser@localhost:21/data/2SW/",
                "type": "ftp"
            }
            ],
            "pendingJobs": 0
        }
    }

    The full list of fields is available in Device attributes.

  2. Send a POST request to the BCM's devices API with the above payload:

    https://<host>:<port>/businessConfig/admin/v1/devices/
    

Specify the processing device

To specify the processing device:

  1. Construct the request payload so that it looks like this:

    CODE
    {
        "id": "deviceId2",
        "name": "Envivio4Balancer",
        "workflow": {
            "accessPoints": [
            {
                "endPoint": "http://localhost:6666/EncoderControlWS",
                "type": "soap"
            }
            ],
            "pendingJobs": 0,
            "maxJobsAllowed": 10
        }
    }

    The full list of fields is available in Device attributes.

  2. Send a POST request to the BCM's devices API with the above payload:

    https://<host>:<port>/businessConfig/admin/v1/devices/
    

Specify the destination device

To specify the destination device:

  1. Construct the request payload so that it looks like this:

    CODE
    {
        "id": "deviceId3",
        "name": "cmsftp02",
        "workflow": {
            "accessPoints": [
            {
                "endPoint": "ftp://root:Superuser@localhost:21/data/2SW/",
                "type": "ftp"
            }
            ],
            "pendingJobs": 0,
            "maxJobsAllowed": 10
        }
    }

    The full list of fields is available in Device attributes.

  2. Send a POST request to the BCM's devices API with the above payload:

    https://<host>:<port>/businessConfig/admin/v1/devices/
    

Configure profiles

VSPP requires a specific profile configuration – see VSPP VOD configuration.

To enable automatic retry of failed jobs, include the following attributes in encoding, packaging, and purge profiles:

  • autoRetry – set to true to enable automatic retry. Default: false.
  • rescheduleDelay – specifies how long (in seconds) to wait after failure before retrying the job. Default: 3600.
  • numberOfRetriesForRescheduling – the maximum number of times the job will be retried. Default: 3.
  • channelBuffer – specifies the time period in the past (in seconds) that the event must exist in for it to be captured. For example, if you set this to 86400, only events whose start time was in the last 24 hours will have their capture retried. Capture will not be retried for events that are older than 24 hours. Default: events' age is not considered – all failed jobs are retried.

Configure encoding profiles

You need to configure a separate encoding profile for each technical version there will be of each asset.

To configure an encoding profile:

  1. Construct a profile that looks like this example:

    CODE
    {
        "id": "pivot_creation",
        "type": "ContentPreparation",
        "name": "Profile for EncoderControl workflow",
        "businessRulesProperties": {
            "sourceAssetType": "HD",
            "sourceAssetDeviceLinkType": "source",
            "destinationAssetType": "Pivot",
            "destinationAssetDeviceLinkType": "source"
        },
        "workflow": {
            "deviceUsedForResourceAllocation": "processingDevice",
            "processingDevice": {
                "id": "deviceId2",
                "accessPointType": "soap"
            },
            "sourceDevice": {
                "accessPointType": "ftp"
            },
            "destinationDevice": {
                "id": "deviceId1",
                "accessPointType": "ftp",
                "relPath": "./pivot/"
            },
            "workflowVersion": "genericEncodingWithEncoderControlAPIv0.9",
            "workflowInputProperties": {
                "sourceUri": "",
                "destinationUri": "",
                "processingUri": "",
                "encoderProfileId": "encProfileId01",
                "retryDelay": 15,
                "numberOfRetries": 3,
                "numberOfRetriesForRescheduling": 3,
                "rescheduleDelay": 3600,
                "loopBackTimer": 10,
                "jobCompletionTimeout": 3600
            },
            "workflowOutputProperties": {
                "fullDestinationUri": ""
            }
        }
    }

    The full list of fields is available in Profile attributes.

  2. Attach the profile to the editorial content by submitting it to the Business Configuration Manager (BCM). Send a POST request to the BCM's profiles API with the profile as the request payload:

    https://<host>:<port>/businessConfig/admin/v1/profiles/
    

Configure packaging profiles

You need to configure a packaging profile for the editorial content.

To configure a packaging profile:

  1. Construct a profile that looks like this example:

    CODE
    {
       "id":"vos360_packaging_profile",
       "name":"Packaging Profile for EncoderControl workflow",
       "isFeatureProfile":false,
       "type":"ContentPreparation",
       "jobType":"Packaging",
       "businessRulesProperties":{
          "sourceAssetType":"Pivot",
          "sourceAssetDeviceLinkType":"source",
          "destinationAssetDeviceLinkType":"destination"
       },
       "workflow":{
          "deviceUsedForResourceAllocation":"processingDevice",
          "sourceDevice":{
             "accessPointType":"http"
          },
          "processingDevice":{
             "id":"VOS360_Adapter_PKG",
             "accessPointType":"soap"
          },
          "destinationDevice":{
             "id":"deviceId3",
             "accessPointType":"http",
             "relativePath":""
          },
          "workflowVersion":"genericEncodingWithEncoderControlAPIv0.9",
          "workflowInputProperties":{
             "numberOfRetries":1,
             "destinationUri":"",
             "processingUri":"",
             "sourceUri":"",
             "checkForSourceAssetPresence":false,
             "encoderProfileId":"HLS;SS;DASH",//previously it was single profile
             "processWithEncryption":true,
             "securityId":""
          },
          "workflowOutputProperties":{
             "fullDestinationUri":""
          }
       },
       "metadataSet":{
          "workflowName":"package",
          "workflowId":"JITP_ENC_PACK_PURGE_5",
          "assetType":"HLS/SS/DASH/JITP"//previously it was single
       }
    }

    The full list of fields is available in Profile attributes.

  2. Submit the profile to the Business Configuration Manager (BCM). Send a POST request to the BCM's profiles API with the profile as the request payload:

    https://<host>:<port>/businessConfig/admin/v1/profiles/
    

Configure feature profiles

You need to configure a feature profile for each technical version there will be of each asset.

To configure a feature profile:

  1. Construct a profile that looks like this example:

    CODE
    jitp_features_hls :-
    --------------------
    {
      "id": "jitp_features_hls",
      "type": "Feature",
      "name": "Feature Profile for JITP for HLS",
      "isFeatureProfile":true,
      "features": "HLS",
      "businessRulesProperties":{
          "encoderProfileName": "HLS"
      }
    }
    
    
    jitp_features_ss :-
    -------------------
    {
      "id": "jitp_features_ss",
      "type": "Feature",
      "name": "Feature Profile for JITP for SS",
      "isFeatureProfile":true,
      "features": "SS",
      "businessRulesProperties":{
          "encoderProfileName": "SS"
      }
    }
    
    
    jitp_features_dash :-
    --------------------
    {
      "id": "jitp_features_dash",
      "type": "Feature",
      "name": "Feature Profile for JITP for DASH",
      "isFeatureProfile":true,
      "features": "DASH",
      "businessRulesProperties":{
          "encoderProfileName": "DASH"
      }
    }
    
    
  2. Submit the profile to the Business Configuration Manager (BCM). Send a POST request to the BCM's profiles API with the profile as the request payload:

    https://<host>:<port>/businessConfig/admin/v1/pr
JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.