def lambda_handler()

in broadcast-monitoring/src/manifest_parser/main.py [0:0]


def lambda_handler(event, context):
    """
    Download the playlist manifest file. Determine if it's the master manifest, and if it's child manifest,
     find the latest segment and calculate its starting date time using metadata in the manifest file.
    :param event: example
    {
        "Execution" : "arn:aws:states:us-east-1:12312312312:execution:statemachine-name:exc-id
        "Input": {
          "s3Bucket": "aws-rnd-broadcast-maas-video-processing-dev",
          "s3Key": "live/test_video_single_pipeline/test_1.m3u8",
          "s3VersionId": "T.Lfm.fslzaZa5lkV_bJrI.MmrQG7mE_"
        }
    }
    :param context: lambda context object https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
    :return: whether this is a master manifest. If it's child manifest, find the latest segment and starting date time.
    {
        "isMasterManifest": false,
        "streamId": "test_1",
        "lastSegment": { # only if isMasterManifest = false
            "s3Key": "live/test_video_single_pipeline/test_1_00039.ts",
            "startDateTime": "2020-01-23T21:36:35.290000Z",
            "durationSec": 6
        }
    }
    """
    logger.info('Received event: %s', json.dumps(event, indent=2))
    s3_bucket = event['Input']['s3Bucket']
    manifest_s3_key = event['Input']['s3Key']
    manifest_s3_version_id = event['Input']['s3VersionId']

    manifest_content = read_file_from_s3_w_versionid(s3_bucket, manifest_s3_key, manifest_s3_version_id)
    if is_master_manifest(manifest_content):
        logger.info('Is master manifest. Skip processing')
        return {'isMasterManifest': True}
    else:
        last_segment, starting_time, duration_sec = get_last_segment_and_start_timestamp(manifest_content)
        segment_s3_key = os.path.join(os.path.dirname(manifest_s3_key), last_segment)
        segment_s3_version_id = get_s3_object_latest_version_id(s3_bucket, segment_s3_key)
        stream_id = os.path.splitext(os.path.basename(manifest_s3_key))[0]
        starting_time_str = parse_date_time_to_str(starting_time)

        fragment_ddb_entry = {
            'SFNArn': event['Execution'],
            'Stream_ID': stream_id,
            'Start_DateTime': starting_time_str,
            'S3_Key': segment_s3_key,
            'S3_VersionID': segment_s3_version_id,
            'Duration_Sec': convert_float_to_dec(duration_sec)
        }
        put_item_ddb(DDB_FRAGMENT_TABLE, fragment_ddb_entry)

        result = {'isMasterManifest': False,
                  'streamId': stream_id,
                  'lastSegment': {
                      's3Key': segment_s3_key,
                      'versionId': segment_s3_version_id,
                      'durationSec': duration_sec,
                      "startDateTime": starting_time_str}
                  }
        logger.info('Response : %s', json.dumps(result, indent=2))
    return result