Initial commit

This commit is contained in:
Senad Uka
2022-03-23 05:44:42 +01:00
parent 1405281a5c
commit eea10dd03b
113 changed files with 3617 additions and 81 deletions

View 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

View 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

View 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