Initial commit
This commit is contained in:
57
app/services/vendors/broad_sign/broad_sign_fetch_schedule.rb
vendored
Normal file
57
app/services/vendors/broad_sign/broad_sign_fetch_schedule.rb
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../log/loggable'
|
||||
require_relative '../errors/schedule_fetch_error'
|
||||
require 'net/http'
|
||||
|
||||
module Vendors
|
||||
module BroadSign
|
||||
class BroadSignFetchSchedule
|
||||
include Log::Loggable
|
||||
|
||||
AIR_DOMAIN = 'air.broadsign.com'
|
||||
PATH = 'playlist/v1/generate'
|
||||
|
||||
def initialize(tokens)
|
||||
@tokens = tokens
|
||||
end
|
||||
|
||||
def call(params)
|
||||
params = ActiveSupport::HashWithIndifferentAccess.new(
|
||||
screen: '1',
|
||||
duration: 3600
|
||||
).merge(params_whitelist(params))
|
||||
logger.info "BroadSign fetch schedule request for player #{params[:player]}"
|
||||
url = URI.join("https://#{AIR_DOMAIN}", PATH)
|
||||
res = Net::HTTP.post(
|
||||
url,
|
||||
{
|
||||
player_identifier: params[:player].to_s,
|
||||
screen_identifier: params[:screen]&.to_s,
|
||||
duration: "#{params[:duration]}s"
|
||||
}.to_json,
|
||||
{
|
||||
"Authorization": "Bearer #{@tokens.auth_token}",
|
||||
"Content-Type": 'application/json'
|
||||
}
|
||||
)
|
||||
case res
|
||||
when Net::HTTPSuccess
|
||||
JSON.parse(res.body).with_indifferent_access
|
||||
else
|
||||
logger.error "Error fetching BroadSign Air schedule: #{res.code}"
|
||||
raise Vendors::Errors::ScheduleFetchError, { player: params[:player], response_code: res.code }.to_json
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def params_whitelist(params)
|
||||
params.slice(
|
||||
:player,
|
||||
:screen,
|
||||
:duration
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
15
app/services/vendors/broad_sign/broad_sign_tokens.rb
vendored
Normal file
15
app/services/vendors/broad_sign/broad_sign_tokens.rb
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../log/loggable'
|
||||
|
||||
module Vendors
|
||||
module BroadSign
|
||||
class BroadSignTokens
|
||||
include Singleton
|
||||
|
||||
def auth_token
|
||||
AppConfig.get_mandatory 'vendors.broad_sign.token'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
47
app/services/vendors/broad_sign/broad_sign_transform_schedule.rb
vendored
Normal file
47
app/services/vendors/broad_sign/broad_sign_transform_schedule.rb
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../../log/loggable'
|
||||
require_relative '../../schedule_pipeline/models/schedule'
|
||||
require_relative '../../schedule_pipeline/models/schedule_item'
|
||||
require_relative '../errors/schedule_transform_error'
|
||||
|
||||
module Vendors
|
||||
module BroadSign
|
||||
class BroadSignTransformSchedule
|
||||
include Log::Loggable
|
||||
|
||||
def call(vendor, player, schedule, content_map)
|
||||
logger.debug("BroadSign schedule transform for vendor #{vendor}, player #{player}")
|
||||
start_time = nil
|
||||
|
||||
# for performance reasons, here we truncate the items list to the first N items where N is the number of contents
|
||||
# in the schedule. This assumes the schedule round-robins content!
|
||||
truncate_schedule(schedule, content_map.size)
|
||||
|
||||
items = schedule[:items].collect do |item|
|
||||
start_time ||= item[:startTime]
|
||||
SchedulePipeline::Models::ScheduleItem.new(
|
||||
item[:duration],
|
||||
content_map[item[:contentIndex] || 0][:id],
|
||||
# TODO: build full POP reporting url using this token
|
||||
item[:token]
|
||||
)
|
||||
end
|
||||
raise Vendors::Errors::ScheduleTransformError, 'Schedule without a start time' if start_time.nil?
|
||||
|
||||
SchedulePipeline::Models::Schedule.new(
|
||||
"BroadSign schedule for player #{player}",
|
||||
vendor,
|
||||
player,
|
||||
start_time,
|
||||
items
|
||||
)
|
||||
end
|
||||
|
||||
private
|
||||
def truncate_schedule(schedule, size)
|
||||
schedule[:items] = schedule[:items].first(size)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user