awslive-poster 0.1.3

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: 2a152c0a326f20e403907ed4e03eebcdbf1c4aecddcd8e99ce3a38bc7cc53440
4
+ data.tar.gz: 80abe13a0cd6bee94d5ca8926646d7394ef1957279c5be5ff65979129ddbb517
5
+ SHA512:
6
+ metadata.gz: acb0ff3bce664b7c27e0c5271dc55e424b7de77a34752eb4a45bf47699cb85eaa4860c1135fad7ce68d90c5605a8a46a836b012e12ff73f17247fbea27039b49
7
+ data.tar.gz: ea66913af0b716f445fad40c0887f652d5c8ae8cf48633b69b4e6bf9030a4385c565943d940e332fc562dbc0aec35b3576afb2b119ff7c4173c961c954fd92c4
@@ -0,0 +1 @@
1
+ require 'awslive-poster/awslive_poster'
@@ -0,0 +1,150 @@
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
+ MAX_CHANNEL_START_TIME = 2 * 60
14
+
15
+ def initialize(channel_id)
16
+ credentials = Aws::SharedCredentials.new
17
+ if credentials.set?
18
+ @medialiveclient = Aws::MediaLive::Client.new(:credentials => credentials)
19
+ @s3 = Aws::S3::Resource.new(:credentials => credentials)
20
+ else
21
+ @medialiveclient = Aws::MediaLive::Client.new
22
+ @s3 = Aws::S3::Resource.new
23
+ end
24
+ @channel_id = channel_id
25
+ @last_computed_time = nil
26
+ @last_preview_url = nil
27
+ @interval = nil
28
+ end
29
+
30
+ def get_url(channel_info = nil)
31
+ if !@last_computed_time.nil? && !@last_preview_url.nil? && !@interval.nil?
32
+ threshold_gap = @interval > MAX_CHANNEL_START_TIME ? MAX_CHANNEL_START_TIME : @interval
33
+ current_time = Time.now.to_i
34
+ if current_time - @last_computed_time < threshold_gap
35
+ # quick fetch hence returning already computed preview URL.
36
+ puts "returning from cache"
37
+ return @last_preview_url
38
+ end
39
+ end
40
+ preview_url = nil
41
+ channel_info = @medialiveclient.describe_channel({ :channel_id => "#{@channel_id}" }) if channel_info.nil?
42
+ channel_state = channel_info[:state]
43
+ if channel_state == "RUNNING"
44
+ @last_computed_time = Time.now.to_i
45
+ out_group = get_framecapture_group(channel_info["encoder_settings"])
46
+ raise NoFrameCaptureOutputGroup.new("Framecapture output group should be configured!") if out_group.nil?
47
+ start_time = get_channel_start_time(channel_info)
48
+ raise NoStartTimeInTag.new("channel_start_time should be provisioned in Channel tag!") if start_time.nil?
49
+ dest_id = get_dest_info(out_group)
50
+ url = get_dest_url(dest_id, channel_info)
51
+ uri = URI(url)
52
+ modifier = get_framecapture_modifier(out_group)
53
+ @interval = get_framecapture_interval(out_group, channel_info)
54
+ seq_counter = compute_index(start_time, @interval)
55
+ suffix = uri.path[1..-1]
56
+ bucket = @s3.bucket("#{uri.host}")
57
+ obj = bucket.object("#{suffix}#{modifier}.#{seq_counter}.jpg")
58
+ if obj.exists?
59
+ preview_url = obj.presigned_url(:get)
60
+ else
61
+ raise PosterImageDoesNotExist.new("Poster Image #{suffix}#{modifier}.#{seq_counter}.jpg Does not exist!")
62
+ end
63
+ else
64
+ raise InvalidChannelState.new("Channel Need to be in running state!, current state is #{channel_state}")
65
+ end
66
+ @last_preview_url = preview_url
67
+ preview_url
68
+ end
69
+
70
+ def compute_index(start_time, interval)
71
+ channel_start_time = Time.iso8601(start_time).to_i
72
+ current_time = Time.now.utc.to_i
73
+ diff_time = current_time - channel_start_time
74
+ image_index = (diff_time / interval.to_i).to_i
75
+ index = image_index.to_s.rjust(5,'0')
76
+ index
77
+ end
78
+
79
+ def get_channel_start_time(channel_info)
80
+ start_time = channel_info.tags["channel_start_time"]
81
+ start_time
82
+ end
83
+
84
+ def get_framecapture_group(encode_setting)
85
+ out_grp = nil
86
+ outputgroups = encode_setting["output_groups"] rescue nil
87
+ unless outputgroups.nil?
88
+ outputgroups.each do | output |
89
+ if !output["output_group_settings"]["frame_capture_group_settings"].nil?
90
+ out_grp = output
91
+ break if !out_grp.nil?
92
+ end
93
+ end
94
+ end
95
+ out_grp
96
+ end
97
+
98
+ def get_dest_info(out_grp)
99
+ dest = nil
100
+ if !out_grp["output_group_settings"]["frame_capture_group_settings"].nil?
101
+ dest = out_grp["output_group_settings"]["frame_capture_group_settings"]["destination"]["destination_ref_id"] rescue nil
102
+ end
103
+ dest
104
+ end
105
+
106
+ def get_dest_url(dest_info, channel_info)
107
+ url = nil
108
+ if !channel_info["destinations"].nil?
109
+ channel_info["destinations"].each do | dest |
110
+ if dest["id"] == dest_info
111
+ url = dest["settings"][0]["url"]
112
+ break if !url.nil?
113
+ end
114
+ end
115
+ end
116
+ url
117
+ end
118
+
119
+ def get_framecapture_modifier(out_grp)
120
+ modifier = out_grp["outputs"][0]["output_settings"]["frame_capture_output_settings"]["name_modifier"] rescue nil
121
+ modifier
122
+ end
123
+
124
+ def get_framecapture_interval(out_grp, channel_info)
125
+ interval = nil
126
+ video_desc_name = out_grp["outputs"][0]["video_description_name"]
127
+ if !video_desc_name.nil?
128
+ video_desc_info = get_video_description_info(video_desc_name, channel_info)
129
+ if !video_desc_info.nil?
130
+ interval = video_desc_info["codec_settings"]["frame_capture_settings"]["capture_interval"]
131
+ end
132
+ end
133
+ interval
134
+ end
135
+
136
+ def get_video_description_info(desc_name, channel_info)
137
+ video_info = nil
138
+ videos_desc = channel_info["encoder_settings"]["video_descriptions"]
139
+ if !videos_desc.nil?
140
+ videos_desc.each do | description |
141
+ if description["name"] == desc_name
142
+ video_info = description
143
+ break
144
+ end
145
+ end
146
+ end
147
+ video_info
148
+ end
149
+ end
150
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: awslive-poster
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Maheshwaran G
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-01-23 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
+ rubygems_version: 3.1.2
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: Utility that generates the Poster Image URL for the running AWS medialive
104
+ channel
105
+ test_files: []