awslive-poster 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 753564e7fb69e7762afb65b2769c30a63e146286844916c9e93f2a29cde5c32e
4
+ data.tar.gz: 47422fa3163d44c695efd6ace54816fb4686c68f2bb8dd45c6e8ce496d89b4d8
5
+ SHA512:
6
+ metadata.gz: 94175fc4a89bf329e446b9b279870ec37d0c4a2feb737fb4243ce8841410f57c08727257e69f48173786fb7bfddaaf40ca7b48a4ba4a6944ba6de5120143c4a6
7
+ data.tar.gz: 84af17c7191aac1373b29afdbaee1d49951ebc97546c962e9d67f55a9caf7feb69f2c92a398bb1007569ad66f687fedd35edc0f5ee8485ad107abcd7faf25a3a
@@ -0,0 +1 @@
1
+ require 'awslive-poster/awslive_poster'
@@ -0,0 +1,135 @@
1
+ require 'aws-sdk-medialive'
2
+ require 'aws-sdk-s3'
3
+ require 'uri'
4
+
5
+ module Awslive
6
+ class Poster
7
+
8
+ class InvalidChannelState < StandardError; end
9
+ class NoFrameCaptureOutputGroup < StandardError; end
10
+ class PosterImageDoesNotExist < StandardError; end
11
+ class NoStartTimeInTag < StandardError; end
12
+
13
+ def initialize(channel_id)
14
+ credentials = Aws::SharedCredentials.new
15
+ if credentials.set?
16
+ @medialiveclient = Aws::MediaLive::Client.new(:credentials => credentials)
17
+ @s3 = Aws::S3::Resource.new(:credentials => credentials)
18
+ else
19
+ @medialiveclient = Aws::MediaLive::Client.new
20
+ @s3 = Aws::S3::Resource.new
21
+ end
22
+ @channel_id = channel_id
23
+ end
24
+
25
+ def get_url(channel_info = nil)
26
+ preview_url = nil
27
+ channel_info = @medialiveclient.describe_channel({ :channel_id => "#{@channel_id}" }) if channel_info.nil?
28
+ channel_state = channel_info[:state]
29
+ if channel_state == "RUNNING"
30
+ out_group = get_framecapture_group(channel_info["encoder_settings"])
31
+ raise NoFrameCaptureOutputGroup.new("Framecapture output group should be configured!") if out_group.nil?
32
+ start_time = get_channel_start_time(channel_info)
33
+ raise NoStartTimeInTag.new("channel_start_time should be provisioned in Channel tag!") if start_time.nil?
34
+ dest_id = get_dest_info(out_group)
35
+ url = get_dest_url(dest_id, channel_info)
36
+ uri = URI(url)
37
+ modifier = get_framecapture_modifier(out_group)
38
+ interval = get_framecapture_interval(out_group, channel_info)
39
+ seq_counter = compute_index(start_time, interval)
40
+ suffix = uri.path[1..-1]
41
+ bucket = @s3.bucket("#{uri.host}")
42
+ obj = bucket.object("#{suffix}#{modifier}.#{seq_counter}.jpg")
43
+ if obj.exists?
44
+ preview_url = obj.presigned_url(:get)
45
+ else
46
+ raise PosterImageDoesNotExist.new("Poster Image #{suffix}#{modifier}.#{seq_counter}.jpg Does not exist!")
47
+ end
48
+ else
49
+ raise InvalidChannelState.new("Channel Need to be in running state!, current state is #{channel_state}")
50
+ end
51
+ preview_url
52
+ end
53
+
54
+ def compute_index(start_time, interval)
55
+ channel_start_time = Time.iso8601(start_time).to_i
56
+ current_time = Time.now.utc.to_i
57
+ diff_time = current_time - channel_start_time
58
+ image_index = (diff_time / interval.to_i).to_i
59
+ index = image_index.to_s.rjust(5,'0')
60
+ index
61
+ end
62
+
63
+ def get_channel_start_time(channel_info)
64
+ start_time = channel_info.tags["channel_start_time"]
65
+ start_time
66
+ end
67
+
68
+ def get_framecapture_group(encode_setting)
69
+ out_grp = nil
70
+ outputgroups = encode_setting["output_groups"] rescue nil
71
+ unless outputgroups.nil?
72
+ outputgroups.each do | output |
73
+ if !output["output_group_settings"]["frame_capture_group_settings"].nil?
74
+ out_grp = output
75
+ break if !out_grp.nil?
76
+ end
77
+ end
78
+ end
79
+ out_grp
80
+ end
81
+
82
+ def get_dest_info(out_grp)
83
+ dest = nil
84
+ if !out_grp["output_group_settings"]["frame_capture_group_settings"].nil?
85
+ dest = out_grp["output_group_settings"]["frame_capture_group_settings"]["destination"]["destination_ref_id"] rescue nil
86
+ end
87
+ dest
88
+ end
89
+
90
+ def get_dest_url(dest_info, channel_info)
91
+ url = nil
92
+ if !channel_info["destinations"].nil?
93
+ channel_info["destinations"].each do | dest |
94
+ if dest["id"] == dest_info
95
+ url = dest["settings"][0]["url"]
96
+ break if !url.nil?
97
+ end
98
+ end
99
+ end
100
+ url
101
+ end
102
+
103
+ def get_framecapture_modifier(out_grp)
104
+ modifier = out_grp["outputs"][0]["output_settings"]["frame_capture_output_settings"]["name_modifier"] rescue nil
105
+ modifier
106
+ end
107
+
108
+ def get_framecapture_interval(out_grp, channel_info)
109
+ interval = nil
110
+ video_desc_name = out_grp["outputs"][0]["video_description_name"]
111
+ if !video_desc_name.nil?
112
+ video_desc_info = get_video_description_info(video_desc_name, channel_info)
113
+ if !video_desc_info.nil?
114
+ interval = video_desc_info["codec_settings"]["frame_capture_settings"]["capture_interval"]
115
+ end
116
+ end
117
+ interval
118
+ end
119
+
120
+ def get_video_description_info(desc_name, channel_info)
121
+ video_info = nil
122
+ videos_desc = channel_info["encoder_settings"]["video_descriptions"]
123
+ if !videos_desc.nil?
124
+ videos_desc.each do | description |
125
+ if description["name"] == desc_name
126
+ video_info = description
127
+ break
128
+ end
129
+ end
130
+ end
131
+ video_info
132
+ end
133
+ end
134
+ end
135
+
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: awslive-poster
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Maheshwaran G
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-medialive
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.40'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.40'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-s3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.40'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.40'
69
+ description: Utility that generates the Poster Image URL for the running AWS medialive
70
+ channel
71
+ email:
72
+ - maheshwarang@ooyala.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - lib/awslive-poster.rb
78
+ - lib/awslive-poster/awslive_poster.rb
79
+ homepage: https://github.com/cloudaffair/awslive-poster
80
+ licenses:
81
+ - MIT
82
+ metadata:
83
+ homepage_uri: https://github.com/cloudaffair/awslive-poster
84
+ source_code_uri: https://github.com/cloudaffair/awslive-poster
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.7.3
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Utility that generates the Poster Image URL for the running AWS medialive
105
+ channel
106
+ test_files: []