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:
Main steps
Setting up a VOD workflow consists of the following main stages, which are explained in detail in the following sections:
- Specify source, processing, and destination devices.
- Configure encoding profiles and attach them to the editorial content.
- Configure packaging profiles and attach them to the editorial content.
- 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
<?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 thesecurityInfo
section, the CPM automatically generates asecurityId
which will be sent as part of the packaging request.
Example
Sample technical content with securityInfo defined
<?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
Specify the source device
To specify the source device:
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.
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:
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.
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:
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.
Send a POST request to the BCM's devices API with the above payload:
https://<host>:<port>/businessConfig/admin/v1/devices/
Configure profiles
To enable automatic retry of failed jobs, include the following attributes in encoding, packaging, and purge profiles:
autoRetry
– set totrue
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:
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.
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:
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.
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:
Construct a profile that looks like this example:
CODEjitp_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" } }
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