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