def lambda_handler()

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