Skip to content

Opencast All-In-One-File Ingest script

Simple script for automatic event creation and video file upload from external URL:

--url=the video url param is required.

#!/bin/bash

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

title="CDS test video"
url="unknown"

URL1="https://videos.cern.ch/api/files/33b10b08-1f65-4966-bda5-c1a0b6b42938/2160ph265.mp4"
URL2="https://videos.cern.ch/api/files/546fbdba-7f32-4516-8dc8-9fbeb43dc380/1080p.mp4"

function usage()
{
    echo "Opencast ingest media package and run workflow."
    echo ""
    echo "./ingest_cds_url.sh"
    echo "--host=https://ocweb01-test2.cern.ch"
    echo "--title=CDS test video"
    echo "--url=${URL2}"
    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
            ;;                  
        --title)
            title=$VALUE
            ;;              
        --url)
            url=$VALUE
            ;;     
        *)
            echo "ERROR: unknown parameter \"$PARAM\""
            usage
            exit 1
            ;;
    esac
    shift
done

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

echo "host is $host";
echo "title is $title";
echo "url is $url";

TMP_MP="$(mktemp)"
TMP_DC="$(mktemp)"
TMP_ACL="$(mktemp)"
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" standalone="no"?>
<dublincore xmlns="http://www.opencastproject.org/xsd/1.0/dublincore/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    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> '${url}'</dcterms:description>
  <dcterms:subject>cds videos</dcterms:subject>
  <dcterms:language>eng</dcterms:language>
  <dcterms:spatial>Remote</dcterms:spatial>
  <dcterms:title>'${title}'-'${url}'</dcterms:title>
  <dcterms:isPartOf>723eb22b-383f-4f9d-8abc-5816e69f574a</dcterms:isPartOf>   
</dublincore>' > "${TMP_DC}"

echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Policy PolicyId="c4c87a0a-75d6-48cb-af47-6875fe0a7ddb" Version="2.0" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:permit-overrides" xmlns="urn:oasis:names:tc:xacml:2.0:policy:schema:os">
    <Target>
        <Resources>
            <Resource>
                <ResourceMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">c4c87a0a-75d6-48cb-af47-6875fe0a7ddb</AttributeValue>
                    <ResourceAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
                </ResourceMatch>
            </Resource>
        </Resources>
    </Target>
    <Rule RuleId="CDSVIDEOS_read_Permit" Effect="Permit">
        <Target>
            <Actions>
                <Action>
                    <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
                        <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
                    </ActionMatch>
                </Action>
            </Actions>
        </Target>
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">CDSVIDEOS</AttributeValue>
                <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role" DataType="http://www.w3.org/2001/XMLSchema#string"/>
            </Apply>
        </Condition>
    </Rule>
    <Rule RuleId="CDSVIDEOS_write_Permit" Effect="Permit">
        <Target>
            <Actions>
                <Action>
                    <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">write</AttributeValue>
                        <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
                    </ActionMatch>
                </Action>
            </Actions>
        </Target>
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">CDSVIDEOS</AttributeValue>
                <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role" DataType="http://www.w3.org/2001/XMLSchema#string"/>
            </Apply>
        </Condition>
    </Rule>

    <Rule RuleId="ROLE_ADMIN_read_Permit" Effect="Permit">
        <Target>
            <Actions>
                <Action>
                    <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</AttributeValue>
                        <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
                    </ActionMatch>
                </Action>
            </Actions>
        </Target>
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">ROLE_ADMIN</AttributeValue>
                <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role" DataType="http://www.w3.org/2001/XMLSchema#string"/>
            </Apply>
        </Condition>
    </Rule>
    <Rule RuleId="ROLE_ADMIN_write_Permit" Effect="Permit">
        <Target>
            <Actions>
                <Action>
                    <ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">write</AttributeValue>
                        <ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id" DataType="http://www.w3.org/2001/XMLSchema#string"/>
                    </ActionMatch>
                </Action>
            </Actions>
        </Target>
        <Condition>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">ROLE_ADMIN</AttributeValue>
                <SubjectAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:subject:role" DataType="http://www.w3.org/2001/XMLSchema#string"/>
            </Apply>
        </Condition>
    </Rule> 
    <Rule RuleId="DenyRule" Effect="Deny"/>
</Policy>' > "${TMP_ACL}"

# 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}"
echo "Catalog sent"

# Episode ACL XML
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}"
echo "ACL sent"


MP=$(cat ${TMP_MP})
echo "${MP}"
echo "\n"
echo "${URL}"

# Add external URI Presenter/Camera -X POST -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
curl -v --insecure \
  -u ${USER}:${PASSWORD} "${HOST}/ingest/addTrack" \
  --data-urlencode "url=${url}" \
  --data-urlencode 'flavor=presenter/source' \
  --data-urlencode "mediaPackage=${MP}" \
  -o "${TMP_MP}"
echo "Track sent" 

#  Ingest Mediapackage with workflow
curl -v --insecure -u ${USER}:${PASSWORD} \
 "${HOST}/ingest/ingest/${WF}" -F "mediaPackage=<${TMP_MP}" \
  -F "publish=true" -F "flagQuality360p=false" -F "flagQuality2160p=true" -o "${TMP_MP}"
echo "WF running..."

# 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}"