awslive-inputlooper 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 34c42835fefb68681c4cb5c5a30bcf86b2f07a69359d17f25d7ef33f0fbb79e1
4
- data.tar.gz: 64d6ea47aa196236dd23a0bbe6142502e78dce9c3e60289d1008cb3ed2e520c3
3
+ metadata.gz: a808cc52ee361a7bad8e992f5b986e1d6bd7ad9106d0a4a99983e4d75173ba62
4
+ data.tar.gz: 6afc3d0c102de956d418bd8a4e9ab0c732abc0d615d82f4a2499547ec5b6b376
5
5
  SHA512:
6
- metadata.gz: 0a73e00dc2f4b7c8edd491e9a7206ebb2b257eea96568b67cfbb3e66964443bb7a1b9282d3946cfc3dd29735ac5256669def897ec11cc359034e28e1aece6cf1
7
- data.tar.gz: a1faf5d6fdd71591166fbac43a7aa7114134ad07f6cc50a801d10ca0b5165e38bfc8e18774b96bb83c9307598bec3aa0267b9f8cd51ac18999a606ca4feac009
6
+ metadata.gz: 76344f3ac9c93b5637fd0ec24aba60a7c1fc815eff27927957b7d3c0fcb39852de05f0bc2e738cd7ac0f8aa7a6c4b61eab7a0589975363fe2df7148c7cbcb3b0
7
+ data.tar.gz: 4abb1f5ac234ce5768b0bc7d12c64134988be068f8018db611425ef2165c6d4d85fa30370577698eb9a06de64fb47acce51cb06ebcf629359b98fd129cd7be67
@@ -32,6 +32,7 @@ module Awslive
32
32
  @channel_id = channel_id
33
33
  @playlist = playlist
34
34
  @loop_thread = nil
35
+ set_log_flag(true)
35
36
  end
36
37
 
37
38
  def switch_and_loop_playlist(playlist, sleep_time = nil)
@@ -73,7 +74,7 @@ module Awslive
73
74
  return playlist_loop_alive
74
75
  end
75
76
 
76
- def switch_input(force_immed = nil, exclude_query_param = nil)
77
+ def switch_input(force_immed = nil, exclude_query_param = nil, loopback = nil)
77
78
  # Fetching the channel information every time to know the state of the channel and input in pipeline.
78
79
  channel_info = get_channel_info
79
80
  channel_state = channel_info[:state]
@@ -102,14 +103,20 @@ module Awslive
102
103
  end
103
104
 
104
105
  follow_schedule = @scheduler.get_follow_schedule(@channel_id, current_input_action_name)
106
+ log( "Follow Schedule => #{follow_schedule}")
105
107
  current_url = @scheduler.get_action_url(@channel_id, current_input_action_name)
106
- log( "current URL #{current_url} next URL #{follow_schedule}")
108
+ log("Current URL => #{current_url}")
109
+ next_file = identify_next_input(current_url, exclude_query_param, loopback )
110
+ log("Next URL => #{next_file}")
111
+ if next_file.nil? && follow_schedule.nil? && !loopback
112
+ log ("end of playlist and loopback not enabled!!")
113
+ return
114
+ end
115
+ log( "current URL #{current_url} next URL #{next_file}")
107
116
  unless follow_schedule.nil?
108
117
  follow_url = @scheduler.get_follow_action_url(@channel_id, current_input_action_name)
109
118
  log("Follow URL #{follow_url}")
110
- next_file = identify_next_input(current_url, exclude_query_param)
111
- log( "Next URL #{next_file}")
112
- if !follow_url[0].nil? && next_file != follow_url[0]
119
+ if !follow_url[0].nil? && next_file.split('?')[0] != follow_url[0].split('?')[0]
113
120
  log( "Playlist seems to be changed, hence aligning.")
114
121
  @scheduler.delete( @channel_id,[ "#{follow_schedule[:action_name]}"])
115
122
  next_input_name = dynamic_input[:input_attachment_name]
@@ -125,7 +132,7 @@ module Awslive
125
132
  end
126
133
  else
127
134
  log("No follow Schedule!")
128
- next_file = identify_next_input(current_url, exclude_query_param)
135
+ #next_file = identify_next_input(current_url, exclude_query_param)
129
136
  unless next_file.nil?
130
137
  next_input_name = dynamic_input[:input_attachment_name]
131
138
  log( "Next input Name #{next_input_name} #{next_file}")
@@ -142,18 +149,59 @@ module Awslive
142
149
  end
143
150
  end
144
151
 
145
- def identify_next_input(file_url, exclude_query_param)
152
+ def is_url_duplicated(url)
153
+ match_count = 0
154
+ is_duplicated = false
155
+ @playlist.each_with_index do | playlist_file, index |
156
+ playlist_file = playlist_file.split('?')[0]
157
+ if playlist_file == url.split('?')[0]
158
+ match_count = match_count + 1
159
+ end
160
+ if match_count >= 2
161
+ is_duplicated = true
162
+ break
163
+ end
164
+ end
165
+ is_duplicated
166
+ end
167
+
168
+ def get_order(url)
169
+ puts "URL => #{url}"
170
+ order = nil
171
+ if !url.nil?
172
+ uri = URI.parse(url) rescue nil
173
+ params = CGI.parse(uri.query) unless uri.nil?
174
+ if !params.nil?
175
+ order = params["order"].first rescue nil
176
+ end
177
+ end
178
+ order
179
+ end
180
+
181
+ def identify_next_input(file_url, exclude_query_param, loopback = true)
146
182
  next_file = @playlist[0]
147
183
  #puts " File Url #{file_url}"
148
184
  if !file_url.nil? && !file_url[0].nil?
185
+ is_duplicated = is_url_duplicated(file_url[0])
186
+ log( "URL Duplicate => #{is_duplicated}")
149
187
  @playlist.each_with_index do | playlist_file, index |
150
188
  #puts "next file identification #{playlist_file} #{file_url[0]} #{index}"
151
- if !exclude_query_param.nil?
189
+ if !exclude_query_param.nil? && !is_duplicated
152
190
  playlist_file = playlist_file.split('?')[0]
153
191
  file_url[0] = file_url[0].split('?')[0]
154
192
  end
155
193
  if playlist_file == file_url[0]
194
+ if is_duplicated
195
+ p_order = get_order(playlist_file)
196
+ c_order = get_order(file_url[0])
197
+ puts "playlist Order #{p_order} : current order #{c_order}"
198
+ end
199
+ next if is_duplicated && !p_order.nil? && !c_order.nil? && p_order != c_order
156
200
  if index == (@playlist.length - 1)
201
+ if !loopback
202
+ next_file = nil
203
+ break
204
+ end
157
205
  next_file = @playlist[0]
158
206
  else
159
207
  next_file = @playlist[index + 1]
@@ -41,7 +41,6 @@ module Awslive
41
41
  def get_follow_schedule_action(follow_input, trigger_input, urlpath = nil)
42
42
  action_hash = FOLLOW_HASH.clone
43
43
  action_hash[:action_name] = "#{get_action_id}"
44
- puts "action hash #{action_hash}"
45
44
  action_hash[:schedule_action_start_settings][:follow_mode_schedule_action_start_settings][:reference_action_name] = "#{follow_input}"
46
45
  action_hash[:schedule_action_settings][:input_switch_settings][:input_attachment_name_reference] = "#{trigger_input}"
47
46
  action_hash[:schedule_action_settings][:input_switch_settings][:url_path] = [ urlpath ] unless urlpath.nil?
@@ -46,6 +46,7 @@ module Awslive
46
46
  end
47
47
 
48
48
  def get_follow_schedule(channel_id, action_name)
49
+ puts "Follow for action Name : #{action_name}"
49
50
  follow_schedule = nil
50
51
  response = @mediaclient.describe_schedule({channel_id: "#{channel_id}", max_results: 100 } )
51
52
  loop do
@@ -53,6 +54,11 @@ module Awslive
53
54
  unless schedule_action[:schedule_action_start_settings][:follow_mode_schedule_action_start_settings].nil?
54
55
  # This is follow action
55
56
  if schedule_action[:schedule_action_start_settings][:follow_mode_schedule_action_start_settings][:reference_action_name] == action_name
57
+ # Identifying only the input switch follow action for right follow up! as it provides SCTE35 follow up as well.
58
+ puts "Scheduled Action #{schedule_action}"
59
+ if schedule_action[:schedule_action_settings][:input_switch_settings].nil?
60
+ next
61
+ end
56
62
  follow_schedule = schedule_action
57
63
  break
58
64
  end
@@ -94,7 +100,7 @@ module Awslive
94
100
  scheduled_action << @input_switch_schedule_action.get_follow_schedule_action(data[:follow_input], data[:trigger_input], data[:url_path])
95
101
  type, duration = get_type_duration(data[:url_path])
96
102
  if !type.nil? && !duration.nil? && type == "ad_marker"
97
- puts "Duration => #{duration}"
103
+ puts "ad marker provisioned for duration => #{duration}"
98
104
  ad_scheduled_action << @ad_marker_schedule_action.get_follow_schedule_action(data[:follow_input], duration.to_i)
99
105
  end
100
106
  end
@@ -148,7 +154,6 @@ module Awslive
148
154
  def get_action_url(channel_id, action_name)
149
155
  url = nil
150
156
  follow_schedule = get_scheudle_action(channel_id, action_name)
151
- puts "Follow Schedule #{follow_schedule}"
152
157
  url = follow_schedule[:schedule_action_settings][:input_switch_settings][:url_path] unless follow_schedule.nil?
153
158
  url
154
159
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awslive-inputlooper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maheshwaran G
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-24 00:00:00.000000000 Z
11
+ date: 2020-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler