Skip to content

Opencast CERN-CDS-VIDEOS Workflow

One single Workflow for multiple encoding and publication pruposes.

Input params and default values:

        <configuration key="publish">true</configuration>
        <configuration key="publishToApi">true</configuration>       
        <configuration key="flagQuality360p">true</configuration>
        <configuration key="flagQuality480p">true</configuration>
        <configuration key="flagQuality720p">true</configuration>
        <configuration key="flagQuality1080p">true</configuration>
        <configuration key="flagQuality2160p">true</configuration>
        <configuration key="flagQualityParallel">false</configuration>
  • When flagQualityParallel= true, all previous encoding profiles are skipped. It has the highest priority.

  • If publishToApi=false, intermediate publications (between encodings) will be skipped except the last one, before the workflow ends.

cern-cds-videos.xml

<?xml version="1.0" encoding="UTF-8"?>
<definition xmlns="http://workflow.opencastproject.org">

  <id>cern-cds-videos</id>
  <title>CDS Main Workflow</title>
  <tags>
    <tag>archive</tag>
    <tag>upload</tag>
    <tag>schedule</tag>
  </tags>
  <displayOrder>500</displayOrder>
  <description>
    A regular workflow that transcodes the media into distribution formats, then
    sends the resulting distribution files, along with their associated metadata,
    to the distribution channels.
  </description>

  <configuration_panel>
  </configuration_panel>

  <operations>

    <operation
      id="defaults"
      description="Applying default configuration values">
      <configurations>
        <configuration key="publishToApi">true</configuration>   
        <configuration key="flagQualityMultiple">false</configuration>
        <configuration key="flagQualityParallel">false</configuration>  
        <configuration key="flagQuality360p">true</configuration>
        <configuration key="flagQuality480p">true</configuration>
        <configuration key="flagQuality720p">true</configuration>
        <configuration key="flagQuality1080p">true</configuration>
        <configuration key="flagQuality2160p">true</configuration>           
      </configurations>
    </operation>

    <!-- Apply ACL from series to the mediapackage -->
    <operation
      id="series"
      fail-on-error="true"
      exception-handler-workflow="partial-error"
      description="Applying access control entries from series">
      <configurations>
        <configuration key="apply-acl">true</configuration>
      </configurations>
    </operation>

    <!-- Inspect the media -->

    <operation
      id="inspect"
      fail-on-error="true"
      exception-handler-workflow="partial-error"
      description="Inspecting audio and video streams">
      <configurations>
        <configuration key="overwrite">false</configuration>
        <configuration key="accept-no-media">false</configuration>
        <configuration key="accurate-frame-count">false</configuration>        
      </configurations>
    </operation>

    <operation
    id="encode"
    if="${flagQuality720p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
    fail-on-error="false"
    retry-strategy="retry"
    max-attempts="3"
    exception-handler-workflow="cern-encoding-error"
    description="Encoding 720p video to MP4 download">
    <configurations>
      <configuration key="source-flavor">*/source</configuration>
      <configuration key="target-flavor">*/delivery720p</configuration>
      <configuration key="target-tags">engage-download,720p-quality</configuration>
      <configuration key="encoding-profile">cds-720p.http</configuration>
    </configurations>
  </operation>

  <operation
    id="publish-configure"
    if="${publishToApi} AND ${flagQuality720p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
    exception-handler-workflow="cern-critical-error"
    description="Publish 720p to external api publication channel">
    <configurations>
      <configuration key="channel-id">api</configuration>
      <configuration key="mimetype">application/json</configuration>
      <configuration key="download-source-tags">engage-download</configuration>
      <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
      <configuration key="with-published-elements">false</configuration>
      <configuration key="check-availability">true</configuration>
    </configurations>
  </operation>

  <operation
    id="encode"
    if="${flagQuality1080p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
    fail-on-error="false"
    retry-strategy="retry"
    max-attempts="3"
    exception-handler-workflow="cern-encoding-error"
    description="Encoding 1080p video to MP4 download">
    <configurations>
      <configuration key="source-flavor">*/source</configuration>
      <configuration key="target-flavor">*/delivery1080p</configuration>
      <configuration key="target-tags">engage-download,1080p-quality</configuration>
      <configuration key="encoding-profile">cds-1080p.http</configuration>
    </configurations>
  </operation>

  <operation
    id="publish-configure"
    if="${publishToApi} AND ${flagQuality1080p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
    exception-handler-workflow="cern-critical-error"
    description="Publish 1080p to external api publication channel">
    <configurations>
      <configuration key="channel-id">api</configuration>
      <configuration key="mimetype">application/json</configuration>
      <configuration key="download-source-tags">engage-download</configuration>
      <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
      <configuration key="with-published-elements">false</configuration>
      <configuration key="check-availability">true</configuration>
    </configurations>
  </operation>

  <operation
  id="encode"
  if="${flagQuality480p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
  fail-on-error="false"
  retry-strategy="retry"
  max-attempts="3"
  exception-handler-workflow="cern-encoding-error"
  description="Encoding 480p video to MP4 download">
  <configurations>
    <configuration key="source-flavor">*/source</configuration>
    <configuration key="target-flavor">*/delivery480p</configuration>
    <configuration key="target-tags">engage-download,480p-quality</configuration>
    <configuration key="encoding-profile">cds-480p.http</configuration>
  </configurations>
</operation>

<operation
  id="publish-configure"
  if="${publishToApi} AND ${flagQuality480p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
  exception-handler-workflow="cern-critical-error"
  description="Publish 480p to external api publication channel">
  <configurations>
    <configuration key="channel-id">api</configuration>
    <configuration key="mimetype">application/json</configuration>
    <configuration key="download-source-tags">engage-download</configuration>
    <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
    <configuration key="with-published-elements">false</configuration>
    <configuration key="check-availability">true</configuration>
  </configurations>
</operation>

    <operation
      id="encode"
      if="${flagQuality360p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
      fail-on-error="false"
      retry-strategy="retry"
      max-attempts="3"
      exception-handler-workflow="cern-encoding-error"
      description="Encoding 360p video to MP4 download">
      <configurations>
        <configuration key="source-flavor">*/source</configuration>
        <configuration key="target-flavor">*/delivery360p</configuration>
        <configuration key="target-tags">engage-download,360p-quality</configuration>
        <configuration key="encoding-profile">cds-360p.http</configuration>
      </configurations>
    </operation>

    <operation
      id="publish-configure"
      if="${publishToApi} AND ${flagQuality360p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
      exception-handler-workflow="cern-critical-error"
      description="Publish 360p to external api publication channel">
      <configurations>
        <configuration key="channel-id">api</configuration>
        <configuration key="mimetype">application/json</configuration>
        <configuration key="download-source-tags">engage-download</configuration>
        <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
        <configuration key="with-published-elements">false</configuration>
        <configuration key="check-availability">true</configuration>
        <!--configuration key="strategy">merge</configuration-->           
      </configurations>
    </operation>


  <operation
    if="${flagQuality2160p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
    id="encode"
    fail-on-error="false"
    retry-strategy="retry"
    max-attempts="3"
    exception-handler-workflow="cern-encoding-error"
    description="Encoding 2160p video to MP4 download">
    <configurations>
      <configuration key="source-flavor">*/source</configuration>
      <configuration key="target-flavor">*/delivery2160p</configuration>
      <configuration key="target-tags">engage-download,2160p-quality</configuration>
      <configuration key="encoding-profile">cds-2160p.http</configuration>
    </configurations>
  </operation>

  <operation
  id="publish-configure"
  if="${publishToApi} AND ${flagQuality2160p} AND NOT ${flagQualityMultiple} AND NOT ${flagQualityParallel}"
  exception-handler-workflow="cern-critical-error"
  description="Publish 2160p to external api publication channel">
  <configurations>
    <configuration key="channel-id">api</configuration>
    <configuration key="mimetype">application/json</configuration>
    <configuration key="download-source-tags">engage-download</configuration>
    <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
    <configuration key="with-published-elements">false</configuration>
    <configuration key="check-availability">true</configuration>
  </configurations>
</operation>

  <operation
    if="${flagQualityMultiple} AND NOT ${flagQualityParallel}"    
    id="multiencode"
    fail-on-error="true"
    retry-strategy="retry"
    max-attempts="3"      
    exception-handler-workflow="cern-critical-error"
    description="Encoding multiple qualities to different worker nodes video to MP4 download">
    <configurations>
      <configuration key="source-flavors">*/source</configuration>
      <configuration key="target-flavors">*/delivery360p,*/delivery480p,*/delivery720p,*/delivery1080p</configuration>
      <configuration key="target-tags">engage-download</configuration>
      <configuration key="encoding-profiles">adaptive-360p.http,adaptive-480p.http,adaptive-720p.http,adaptive-1080p.http</configuration>
      <configuration key="tag-with-profile">true</configuration>
    </configurations>
  </operation>

  <operation
    id="encode"
    if="${flagQualityParallel} AND NOT ${flagQualityMultiple}"
    fail-on-error="true"
    retry-strategy="retry"
    max-attempts="3"      
    exception-handler-workflow="cern-critical-error"
    description="Encoding multiple qualities to one single worker video to MP4 download">
    <configurations>
      <configuration key="source-flavor">*/source</configuration>
      <configuration key="target-flavor">*/delivery</configuration>
      <configuration key="target-tags">engage-download</configuration>
      <configuration key="encoding-profiles">cds-parallel.http</configuration>
      <configuration key="tag-with-profile">true</configuration>
    </configurations>
  </operation>

  <operation
    id="publish-configure"
    if="${publishToApi} AND (${flagQualityMultiple} OR ${flagQualityParallel})"
    exception-handler-workflow="cern-critical-error"
    description="Publish Parallel-Multiple to external api publication channel">
    <configurations>
      <configuration key="channel-id">api</configuration>
      <configuration key="mimetype">application/json</configuration>
      <configuration key="download-source-tags">engage-download</configuration>
      <configuration key="url-pattern">https://<%= @fqdn %>/api/events/${event_id}</configuration>
      <configuration key="with-published-elements">false</configuration>
      <configuration key="check-availability">true</configuration>
    </configurations>
  </operation>

    <!-- Archive the current state of the media package -->
    <operation
      id="snapshot"
      fail-on-error="true"
      exception-handler-workflow="partial-error"
      description="Archiving">
      <configurations>
        <configuration key="source-flavors">*/source,dublincore/*,security/*</configuration>
      </configurations>
    </operation>

    <!-- Clean up the working file repository -->

    <operation
      id="cleanup"
      fail-on-error="false"
      description="Cleaning up">
      <configurations>
        <configuration key="delete-external">true</configuration>
        <configuration key="preserve-flavors">security/*</configuration>
      </configurations>
    </operation>


  </operations>

</definition>