# frozen_string_literal: true
require "cgi"
module Decidim
module Meetings
# This class handles the streaming url to be included in the iframe present
# in the live event. For some services it is required to transform a bit
# the structure of the URL.
class MeetingIframeEmbedder
# Public: Initializes the service.
# online_meeting_service_url - A String containing the url of the online meeting
def initialize(online_meeting_service_url)
@online_meeting_service_url = online_meeting_service_url
end
def embed_transformed_url(request_host)
return nil if parsed_online_meeting_uri.nil?
case parsed_online_meeting_uri.host
when "www.youtube.com"
transform_youtube_url(parsed_online_meeting_uri)
when "www.twitch.tv"
transform_twitch_url(parsed_online_meeting_uri, request_host)
else
online_meeting_service_url
end
end
def embeddable?
return nil if parsed_online_meeting_uri.nil?
embeddable_services.include?(parsed_online_meeting_uri.host)
end
def embed_code(request_host)
return nil if parsed_online_meeting_uri.nil?
<<~HTML
HTML
end
private
attr_accessor :online_meeting_service_url
def embeddable_services
@embeddable_services ||= Meetings.embeddable_services
end
# YouTube transformation consists on:
# 1. extract the video id from the parameter v
# 2. Create a new URL using the domain youtube-nocookie.com, converting it to an embed
# and appending the video id
def transform_youtube_url(uri)
return online_meeting_service_url if uri.query.blank?
parsed_query = CGI.parse(uri.query)
video_id = parsed_query.has_key?("v") ? CGI.parse(uri.query).fetch("v")&.first : nil
return online_meeting_service_url if video_id.blank?
"https://www.youtube-nocookie.com/embed/#{video_id}"
end
# Twitch transformation consists on:
# 1. extract the video id from the third URL parameter
# 2. extract the request host
# 3. build the embed url using both the video ID and the request host as parent argument
def transform_twitch_url(uri, request_host)
_, param_name, video_id = *uri.path.split("/")
return online_meeting_service_url if video_id.blank? || param_name != "videos"
"https://player.twitch.tv/?video=#{video_id}&parent=#{request_host}"
end
def parsed_online_meeting_uri
@parsed_online_meeting_uri ||= URI.parse(online_meeting_service_url) if online_meeting_service_url.present?
end
end
end
end