# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

# Purpose:
# Demonstrates how to create an HLS job using the AWS SDK for Ruby.

# snippet-start:[elastictranscoder.ruby.create_hls_job.import]
require "aws-sdk-elastictranscoder"
require "aws-sdk-s3"

def create_elastictranscoder_job(transcoder_client, s3_resource, pipeline_name)
  bucket_name = "transcoder-bucket-#{rand(10**4)}"
  s3_resource.create_bucket(bucket: bucket_name)

  resp = transcoder_client.create_pipeline({
                                             name: pipeline_name, # required
                                             input_bucket: bucket_name, # required
                                             output_bucket: bucket_name,
                                             role: "arn:aws:iam::260778392212:role/Elastic_Transcoder_Default_Role" # required
                                           })

  pipeline_id = resp["pipeline"]["id"]

  # This is the name of the input key that you would like to transcode.
  input_key = ".Jabberwocky.mp3"

  # HLS Presets that will be used to create an adaptive bitrate playlist.
  hls_64k_audio_preset_id = "1351620000001-200071"
  hls_0400k_preset_id     = "1351620000001-200050"
  hls_0600k_preset_id     = "1351620000001-200040"
  hls_1000k_preset_id     = "1351620000001-200030"
  hls_1500k_preset_id     = "1351620000001-200020"
  hls_2000k_preset_id     = "1351620000001-200010"

  # Additional variables
  segment_duration        = "2"
  output_key_prefix       = "elastic-transcoder-samples/output/hls/"

  input = { key: input_key }
  output_key = OpenSSL::Digest::SHA256.new(input_key.encode("UTF-8")).to_s


  hls_audio = {
    key: "hlsAudio/" + output_key,
    preset_id: hls_64k_audio_preset_id,
    segment_duration: segment_duration
  }

  hls_400k = {
    key: "hls0400k/" + output_key,
    preset_id: hls_0400k_preset_id,
    segment_duration: segment_duration
  }

  hls_600k = {
    key: "hls0600k/" + output_key,
    preset_id: hls_0600k_preset_id,
    segment_duration: segment_duration
  }

  hls_1000k = {
    key: "hls1000k/" + output_key,
    preset_id: hls_1000k_preset_id,
    segment_duration: segment_duration
  }

  hls_1500k = {
    key: "hls1500k/" + output_key,
    preset_id: hls_1500k_preset_id,
    segment_duration: segment_duration
  }

  hls_2000k = {
    key: "hls2000k/" + output_key,
    preset_id: hls_2000k_preset_id,
    segment_duration: segment_duration
  }

  outputs = [hls_audio, hls_400k, hls_600k, hls_1000k, hls_1500k, hls_2000k]
  playlist = {
    name: "hls_" + output_key,
    format: "HLSv3",
    output_keys: outputs.map { |output| output[:key] }
  }

  job = transcoder_client.create_job(
    pipeline_id: pipeline_id,
    input: input,
    output_key_prefix: output_key_prefix + output_key + "/",
    outputs: outputs,
    playlists: [playlist]
  )[:job]

  puts "HLS job has been created: " + JSON.pretty_generate(job)
end
# snippet-end:[elastictranscoder.ruby.create_hls_job.import]

if __FILE__ == $0
  transcoder_client = Aws::ElasticTranscoder::Client.new
  s3_resource = Aws::S3::Resource.new
  pipeline_name = "transcoder-pipeline-#{rand(10**4)}"
  create_elastictranscoder_job(transcoder_client, s3_resource, pipeline_name)
end
