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.
- checksums.yaml +7 -0
- data/lib/awslive-poster.rb +1 -0
- data/lib/awslive-poster/awslive_poster.rb +135 -0
- metadata +106 -0
checksums.yaml
ADDED
|
@@ -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: []
|