in slot_detection/app.py [0:0]
def lambda_handler(event, context):
print("We got the following event:\n", event)
operator_object = MediaInsightsOperationHelper(event)
# Get media metadata from input event
try:
workflow_id = operator_object.workflow_execution_id
asset_id = operator_object.asset_id
loudness_bucket = operator_object.input["Media"]["Loudness"]["S3Bucket"]
loudness_key = operator_object.input["Media"]["Loudness"]["S3Key"]
except Exception as exception:
operator_object.update_workflow_status("Error")
operator_object.add_workflow_metadata(
SlotDetectionError="Missing a required metadata key {e}".format(e=exception))
raise MasExecutionError(operator_object.return_output_object())
# Get asset metadata from dataplane
try:
asset_metadata = __get_asset_metadata(asset_id)
except Exception as exception:
operator_object.update_workflow_status("Error")
operator_object.add_workflow_metadata(
SlotDetectionError="Unable to retrieve metadata for asset {}: {}".format(asset_id, exception))
raise MasExecutionError(operator_object.return_output_object())
try:
# Get detected reasons' timestamps from media and asset metadata
silences = detect_silences(loudness_bucket, loudness_key)
black_frames, end_credits = detect_technical_cues(asset_metadata)
shots = detect_shots(asset_metadata)
reasons_timestamps = {
"Silence": silences,
"BlackFrame": black_frames,
"ShotChange": shots,
"EndCredits": end_credits
}
media_info = asset_metadata["shotDetection"]["VideoMetadata"][0]
# Create slots from reasons' timestamps
print("reasons_timestamps: {}".format(reasons_timestamps))
slots = []
for reason in reasons_timestamps:
for timestamp in reasons_timestamps[reason]:
slots.append({
"Timestamp": float(timestamp),
"Score": 1.0,
"Reasons": [reason]
})
print("slots: {}".format(slots))
# Consolidate slots and calculate scores
slots = calculate_scores(slots, media_info, asset_metadata)
print("scored_slots: {}".format(slots))
except Exception as exception:
operator_object.update_workflow_status("Error")
operator_object.add_workflow_metadata(SlotDetectionError=str(exception))
raise MasExecutionError(operator_object.return_output_object())
operator_object.add_workflow_metadata(
AssetId=asset_id,
WorkflowExecutionId=workflow_id)
operator_object.update_workflow_status("Complete")
metadata_upload = dataplane.store_asset_metadata(
asset_id=asset_id,
operator_name=operator_object.name,
workflow_id=workflow_id,
results={"slots": slots}
)
print("metadata_upload: {}".format(metadata_upload))
if metadata_upload["Status"] == "Success":
print("Uploaded metadata for asset: {asset}".format(asset=asset_id))
elif metadata_upload["Status"] == "Failed":
operator_object.update_workflow_status("Error")
operator_object.add_workflow_metadata(
SlotDetectionError="Unable to upload metadata for asset {}: {}".format(asset_id, metadata_upload))
raise MasExecutionError(operator_object.return_output_object())
else:
operator_object.update_workflow_status("Error")
operator_object.add_workflow_metadata(
SlotDetectionError="Unable to upload metadata for asset {}: {}".format(asset_id, metadata_upload))
raise MasExecutionError(operator_object.return_output_object())
return operator_object.return_output_object()