in amplify/backend/function/mapsmediaconvertstartjob/src/lambda_function.py [0:0]
def lambda_handler(event, context):
print(event)
for record in event['Records']:
parsed_record = json.loads(record['body'])
bucket = parsed_record['Records'][0]['s3']['bucket']['name']
key = unquote_plus(parsed_record['Records'][0]['s3']['object']['key'])
eventTime = parsed_record['Records'][0]['eventTime']
fileSize = parsed_record['Records'][0]['s3']['object']['size']
# Restrict calls on folders
if key[-1] != '/':
objExists, assetId = asset_exists("{}/{}".format(bucket, key))
folderExists, permissionGroups = get_folder_permissions(bucket, key.rsplit('/', 1)[0])
apiKeyRes = appsync_client.list_api_keys(apiId=GQL_API_ID, maxResults=10)
API_KEY = apiKeyRes['apiKeys'][0]['id']
if not objExists:
assetId = str(uuid.uuid4())
create_asset(bucket, key, assetId, eventTime, fileSize, API_KEY)
else:
update_asset(bucket, key, eventTime, fileSize, API_KEY)
file_input = "s3://" + bucket + "/" + key
thumbnail_destination = "s3://" + OUTPUT_BUCKET + "/" + 'private/assets/' + assetId + "/"
proxy_destination = "s3://" + OUTPUT_BUCKET + "/" + 'private/assets/' + assetId + "/"
# Get user-defined location for generic data file
thumbnail_position = 7
# Get mediaconvert endpoint from cache if available
if ("MEDIACONVERT_ENDPOINT" in os.environ):
mediaconvert_endpoint = os.environ["MEDIACONVERT_ENDPOINT"]
customer_mediaconvert = boto3.client("mediaconvert", region_name=REGION, endpoint_url=mediaconvert_endpoint)
else:
try:
response = mediaconvert.describe_endpoints()
except Exception as e:
print("Exception:\n", e)
raise e
else:
mediaconvert_endpoint = response["Endpoints"][0]["Url"]
# Cache the mediaconvert endpoint in order to avoid getting throttled on
# the DescribeEndpoints API.
os.environ["MEDIACONVERT_ENDPOINT"] = mediaconvert_endpoint
customer_mediaconvert = boto3.client("mediaconvert", region_name=REGION, endpoint_url=mediaconvert_endpoint)
try:
response = customer_mediaconvert.create_job(
Role=MEDIA_CONVERT_ROLE,
Settings={
"OutputGroups": [
{
"CustomName": "thumbnail",
"Name": "File Group",
"Outputs": [
{
"ContainerSettings": {
"Container": "RAW"
},
"VideoDescription": {
"ScalingBehavior": "DEFAULT",
"TimecodeInsertion": "DISABLED",
"AntiAlias": "ENABLED",
"Sharpness": 50,
"CodecSettings": {
"Codec": "FRAME_CAPTURE",
"FrameCaptureSettings": {
"FramerateNumerator": 1,
"FramerateDenominator": thumbnail_position,
"MaxCaptures": 2,
"Quality": 80
}
},
"DropFrameTimecode": "ENABLED",
"ColorMetadata": "INSERT"
},
"Extension": "jpg",
"NameModifier": "_thumbnail"
}
],
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": {
"Destination": thumbnail_destination
}
}
},
{
"CustomName": "proxy",
"Name": "File Group",
"Outputs": [
{
"VideoDescription": {
"ScalingBehavior": "DEFAULT",
"TimecodeInsertion": "DISABLED",
"AntiAlias": "ENABLED",
"Sharpness": 50,
"CodecSettings": {
"Codec": "H_264",
"H264Settings": {
"InterlaceMode": "PROGRESSIVE",
"NumberReferenceFrames": 3,
"Syntax": "DEFAULT",
"Softness": 0,
"GopClosedCadence": 1,
"GopSize": 90,
"Slices": 1,
"GopBReference": "DISABLED",
"SlowPal": "DISABLED",
"SpatialAdaptiveQuantization": "ENABLED",
"TemporalAdaptiveQuantization": "ENABLED",
"FlickerAdaptiveQuantization": "DISABLED",
"EntropyEncoding": "CABAC",
"Bitrate": 5000000,
"FramerateControl": "SPECIFIED",
"RateControlMode": "CBR",
"CodecProfile": "MAIN",
"Telecine": "NONE",
"MinIInterval": 0,
"AdaptiveQuantization": "HIGH",
"CodecLevel": "AUTO",
"FieldEncoding": "PAFF",
"SceneChangeDetect": "ENABLED",
"QualityTuningLevel": "SINGLE_PASS",
"FramerateConversionAlgorithm": "DUPLICATE_DROP",
"UnregisteredSeiTimecode": "DISABLED",
"GopSizeUnits": "FRAMES",
"ParControl": "SPECIFIED",
"NumberBFramesBetweenReferenceFrames": 2,
"RepeatPps": "DISABLED",
"FramerateNumerator": 30,
"FramerateDenominator": 1,
"ParNumerator": 1,
"ParDenominator": 1
}
},
"AfdSignaling": "NONE",
"DropFrameTimecode": "ENABLED",
"RespondToAfd": "NONE",
"ColorMetadata": "INSERT"
},
"AudioDescriptions": [
{
"AudioTypeControl": "FOLLOW_INPUT",
"CodecSettings": {
"Codec": "AAC",
"AacSettings": {
"AudioDescriptionBroadcasterMix": "NORMAL",
"RateControlMode": "CBR",
"CodecProfile": "LC",
"CodingMode": "CODING_MODE_2_0",
"RawFormat": "NONE",
"SampleRate": 48000,
"Specification": "MPEG4",
"Bitrate": 64000
}
},
"LanguageCodeControl": "FOLLOW_INPUT",
"AudioSourceName": "Audio Selector 1"
}
],
"ContainerSettings": {
"Container": "MP4",
"Mp4Settings": {
"CslgAtom": "INCLUDE",
"FreeSpaceBox": "EXCLUDE",
"MoovPlacement": "PROGRESSIVE_DOWNLOAD"
}
},
"Extension": "mp4",
"NameModifier": "_proxy"
}
],
"OutputGroupSettings": {
"Type": "FILE_GROUP_SETTINGS",
"FileGroupSettings": {
"Destination": proxy_destination
}
}
}
],
"Inputs": [{
"AudioSelectors": {
"Audio Selector 1": {
"Offset": 0,
"DefaultSelection": "DEFAULT",
"ProgramSelection": 1
}
},
"VideoSelector": {
"ColorSpace": "FOLLOW"
},
"FileInput": file_input
}]
}
)
# TODO: Add support for boto client error handling
except Exception as e:
print("Exception:\n", e)
raise e
else:
job_id = response['Job']['Id']
else:
res = s3_client.head_object(Bucket=bucket, Key=key)
owner = res['Metadata']['owner']
# Structure permission group
permissionGroup = { 'L': [] }
res = cognito_client.admin_list_groups_for_user(
Username=owner,
UserPoolId=COGNITO_USER_POOL
)
groups = res['Groups']
if len(groups) > 0:
groupName = groups[0]['GroupName']
if groupName != 'admin':
permissionGroup['L'].append({'S': 'admin'})
permissionGroup['L'].append({'S': groups[0]['GroupName']})
else:
permissionGroup['L'].append({'S': 'admin'})
res = ddb_client.put_item(
TableName=PERMISSIONS_DB_TABLE,
Item={
'bucket': { 'S': bucket },
'folderKey': { 'S': key },
'permissionGroups': permissionGroup
}
)