Skip to content

Opencast CERN-CDS Ingest script

Simple script for automatic event creation and video file upload:

--event=event_name param required.

For skipping encoding operations can also add the params described in: https://codimd.web.cern.ch/JSv-QUUETomYEr5xx5fETw?view

Opencast ingest media package and run workflow.

./ingest_cds_wf.sh
--host=https://ocweb01-test2.cern.ch
--script_dir=pwd
--event=unknown
--root=/mnt/c/Users/mvaleron/cernbox/Devel/scripts/cdsingest/events
--title=CDS test video
--multiple=false (overrides previous encoding profiles)
--parallel=false (overrides previous encoding profiles)

#!/bin/bash

CAPTURE_AGENT="CDS"
HOST="https://ocweb01-test2.cern.ch"
USER="cdssoren"
PASSWORD='your_password'

#set -eux

script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
event="unknown"
root="${script_dir}/events"
title="CDS test video"
multiple="false"
parallel="false"

function usage()
{
    echo "Opencast ingest media package and run workflow."
    echo ""
    echo "./ingest_cds_wf.sh"
    echo "--host=https://ocweb01-test2.cern.ch"
    echo "--script_dir=pwd"
    echo "--event=$event"
    echo "--root=${script_dir}/events"
    echo "--title=${title}"
    echo "--multiple=false (overrides previous encoding profiles)"
    echo "--parallel=false (overrides previous encoding profiles)"
    echo ""
}

while [ "$1" != "" ]; do
    PARAM=`echo $1 | awk -F= '{print $1}'`
    VALUE=`echo $1 | awk -F= '{print $2}'`
    case $PARAM in
        -h | --help)
            usage
            exit
            ;;
        --host)
            HOST=$VALUE
            ;;                  
        --script_dir)
            script_dir=$VALUE
            ;;
        --event)
            event=$VALUE
            ;;            
        --root)
            root=$VALUE
            ;;
        --title)
            title=$VALUE
            ;;              
        --multiple)
            multiple=$VALUE
            ;;
        --parallel)
            parallel=$VALUE
            ;;         
        *)
            echo "ERROR: unknown parameter \"$PARAM\""
            usage
            exit 1
            ;;
    esac
    shift
done

if [ "$event" == "unknown" ]; then
    echo "ERROR: unknown event. Please add --event=event_name param"
    usage
    exit 1
fi

echo "script_dir is $script_dir";
echo "host is $host";
echo "root is $root";
echo "event is $event";
echo "title is $title";
echo "multiple is $multiple";
echo "parallel is $parallel";



TMP_MP="$(mktemp)"
TMP_WF="$(mktemp)"
TMP_DC="$(mktemp)"
TMP_PR="${root}/${event}/camera.mp4"
TMP_ACL="${root}/${event}/acl.xml"
WF='cern-cds'

START="$(date -d "1 min" --utc +%Y-%m-%dT%H:%MZ)"
END="$(date -d "2 min" --utc +%Y-%m-%dT%H:%MZ)"

echo '<?xml version="1.0" encoding="UTF-8"?>
<dublincore xmlns="http://www.opencastproject.org/xsd/1.0/dublincore/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:oc="http://www.opencastproject.org/matterhorn/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <dcterms:creator>CDS</dcterms:creator>
  <dcterms:contributor>CDS</dcterms:contributor>
  <dcterms:created xsi:type="dcterms:W3CDTF">'"${START}"'</dcterms:created>
  <dcterms:temporal xsi:type="dcterms:Period">start='"${START}"'; end='"${END}"'; scheme=W3C-DTF;</dcterms:temporal>
  <dcterms:description> multiple='${multiple}', parallel='${parallel}'</dcterms:description>
  <dcterms:subject>cds videos</dcterms:subject>
  <dcterms:language>eng</dcterms:language>
  <dcterms:spatial>Remote</dcterms:spatial>
  <dcterms:title>'${title}'- multiple='${multiple}', parallel='${parallel}'</dcterms:title>
  <dcterms:isPartOf>723eb22b-383f-4f9d-8abc-5816e69f574a</dcterms:isPartOf>   
</dublincore>' > "${TMP_DC}"


# Create media package
curl --insecure -f -u ${USER}:${PASSWORD} \
      "${HOST}/ingest/createMediaPackage" \
      -o "${TMP_MP}"

# Retuened mediapackage ID
mediaPackageId=$(head -n 1 ${TMP_MP})
id=$(grep -oPm1 'id="\K[^"]*' <<< "$mediaPackageId")


# Add DC Episode metadata
curl --insecure -f -u ${USER}:${PASSWORD} \
    "${HOST}/ingest/addDCCatalog" -F "mediaPackage=<${TMP_MP}" \
    -F "dublinCore=<${TMP_DC}" \
    -F "flavor=dublincore/episode" -o "${TMP_MP}"

# Add Presenter/Camera
if [ -f "$TMP_PR" ]; then
    echo "$TMP_PR exists."
    curl --insecure --insecure -f -u ${USER}:${PASSWORD} \
      "${HOST}/ingest/addTrack" -F "flavor=presenter/source" -F "mediaPackage=<${TMP_MP}" \
      -F "BODY=@${TMP_PR}" -o "${TMP_MP}"
      else 
    echo "$TMP_PR does not exist. We do not abort"
fi

# Episode ACL XML
if [ -f "$TMP_ACL" ]; then
    echo "$TMP_ACL exists."
    curl -v --insecure -u ${USER}:${PASSWORD} \
      "${HOST}/ingest/addAttachment" -F "mediaPackage=<${TMP_MP}" \
      -F "flavor=security/xacml+episode"  -F "BODY=@${TMP_ACL}" -o "${TMP_MP}"
      else 
    echo "$TMP_ACL does not exist. We do not abort but the WF will fail if the user has not privileges."
fi

#  Ingest Mediapackage with workflow
curl -v --insecure -u ${USER}:${PASSWORD} \
 "${HOST}/ingest/ingest/${WF}" -F "mediaPackage=<${TMP_MP}" \
  -F "publish=true" -F "flagQualityMultiple=${multiple}" -F "flagQualityParallel=${parallel}" -o "${TMP_MP}"

# Returned wf ID
wfId=$(head -n 1 ${TMP_MP})
wf=$(grep -oPm1 'id="\K[^"]*' <<< "$wfId")


echo "id:${id}"
echo "workflow:${wf}"


rm -f "${TMP_MP}" "${TMP_WF}"