Content Publishing

End-to-end pipeline for publishing entertainment content. Validates incoming metadata, enriches it with catalog data, runs content moderation and license checks in parallel, transcodes the media into multiple formats, then publishes to all active streaming platforms.
{
  "Comment": "End-to-end content publishing pipeline for entertainment media",
  "StartAt": "ValidateContent",
  "States": {
    "ValidateContent": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${ValidateContentFunctionArn}",
        "Payload.$": "$"
      },
      "ResultPath": "$.validation",
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "ValidationError"
        }
      ],
      "Next": "IsContentValid"
    },
    "IsContentValid": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.validation.Payload.isValid",
          "BooleanEquals": true,
          "Next": "EnrichMetadata"
        }
      ],
      "Default": "ValidationError"
    },
    "ValidationError": {
      "Type": "Fail",
      "Error": "InvalidContent",
      "Cause": "Content submission failed metadata validation"
    },
    "EnrichMetadata": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${EnrichMetadataFunctionArn}",
        "Payload.$": "$"
      },
      "ResultPath": "$.enriched",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "EnrichmentError"
        }
      ],
      "Next": "ComplianceScreening"
    },
    "EnrichmentError": {
      "Type": "Fail",
      "Error": "EnrichmentFailed",
      "Cause": "Could not enrich content metadata"
    },
    "ComplianceScreening": {
      "Type": "Parallel",
      "Comment": "Run content moderation and license checks concurrently.",
      "Branches": [
        {
          "StartAt": "ModerationCheck",
          "States": {
            "ModerationCheck": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "FunctionName": "${ContentModerationFunctionArn}",
                "Payload.$": "$.enriched.Payload"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "LicenseCheck",
          "States": {
            "LicenseCheck": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "Parameters": {
                "FunctionName": "${LicenseCheckFunctionArn}",
                "Payload.$": "$.enriched.Payload"
              },
              "End": true
            }
          }
        }
      ],
      "ResultPath": "$.compliance",
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "ComplianceError"
        }
      ],
      "Next": "IsModerationClean"
    },
    "ComplianceError": {
      "Type": "Fail",
      "Error": "ComplianceCheckFailed",
      "Cause": "Moderation or license check lambda failed unexpectedly"
    },
    "IsModerationClean": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.compliance[0].Payload.isViolation",
          "BooleanEquals": false,
          "Next": "IsLicenseCleared"
        }
      ],
      "Default": "RejectModerationViolation"
    },
    "RejectModerationViolation": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${RejectContentFunctionArn}",
        "Payload": {
          "reason": "MODERATION_VIOLATION",
          "content.$": "$"
        }
      },
      "ResultPath": "$.rejection",
      "End": true
    },
    "IsLicenseCleared": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.compliance[1].Payload.isCleared",
          "BooleanEquals": true,
          "Next": "TranscodeMedia"
        }
      ],
      "Default": "RejectLicenseFailure"
    },
    "RejectLicenseFailure": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${RejectContentFunctionArn}",
        "Payload": {
          "reason": "LICENSE_NOT_CLEARED",
          "content.$": "$"
        }
      },
      "ResultPath": "$.rejection",
      "End": true
    },
    "TranscodeMedia": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${TranscodeMediaFunctionArn}",
        "Payload.$": "$.enriched.Payload"
      },
      "ResultPath": "$.transcode",
      "TimeoutSeconds": 60,
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 5,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "TranscodeError"
        }
      ],
      "Next": "PublishContent"
    },
    "TranscodeError": {
      "Type": "Fail",
      "Error": "TranscodeFailed",
      "Cause": "Media transcoding job failed"
    },
    "PublishContent": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${PublishContentFunctionArn}",
        "Payload.$": "$"
      },
      "ResultPath": "$.publish",
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "PublishError"
        }
      ],
      "Next": "ContentLive"
    },
    "PublishError": {
      "Type": "Fail",
      "Error": "PublishFailed",
      "Cause": "Content could not be published to streaming platforms"
    },
    "ContentLive": {
      "Type": "Succeed"
    }
  }
}
JSON
Expand
100%

Entertainment teams can use patterns like this to build reliable, compliant, and scalable automation for payment systems and can test and refine these flows locally with Thrubit to reduce cloud cost and speed up iteration.

Free Trial