awslive-poster 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []