Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(recording): process published external videos #12739

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,23 @@ def self.get_record_status_events(events_xml)
rec_events.sort_by {|a| a[:timestamp]}
end

def self.get_external_video_events(events_xml)
BigBlueButton.logger.info "Getting external video events"
external_videos_events = []
events_xml.xpath("//event[@eventname='StartExternalVideoRecordEvent']").each do |event|
s = {
:timestamp => event['timestamp'].to_i,
:external_video_url => event.at_xpath("externalVideoUrl").text
}
external_videos_events << s
end
events_xml.xpath("//event[@eventname='StopExternalVideoRecordEvent']").each do |event|
s = { :timestamp => event['timestamp'].to_i }
external_videos_events << s
end
external_videos_events.sort_by {|a| a[:timestamp]}
end

# Get events when the moderator wants the recording to start or stop
def self.get_start_and_stop_rec_events(events_xml, allow_empty_events=false)
BigBlueButton.logger.info "Getting start and stop rec button events"
Expand All @@ -507,6 +524,17 @@ def self.get_start_and_stop_rec_events(events_xml, allow_empty_events=false)
rec_events.sort_by {|a| a[:timestamp]}
end

# Get events when the moderator wants the recording to start or stop
def self.get_start_and_stop_external_video_events(events_xml)
BigBlueButton.logger.info "Getting start and stop externalvideo events"
external_video_events = BigBlueButton::Events.get_external_video_events(events_xml)
if external_video_events.size.odd?
# user did not click to stop external video before ending meeting
external_video_events << { :timestamp => BigBlueButton::Events.last_event_timestamp(events_xml) }
end
external_video_events.sort_by {|a| a[:timestamp]}
end

# Match recording start and stop events
def self.match_start_and_stop_rec_events(rec_events)
BigBlueButton.logger.info ("Matching record events")
Expand All @@ -522,6 +550,22 @@ def self.match_start_and_stop_rec_events(rec_events)
matched_rec_events
end

# Match external video start and stop events
def self.match_start_and_stop_external_video_events(external_video_events)
BigBlueButton.logger.info ("Matching external video events")
matched_external_video_events = []
external_video_events.each_with_index do |evt,i|
if i.even?
matched_external_video_events << {
:start_timestamp => evt[:timestamp],
:stop_timestamp => external_video_events[i + 1][:timestamp],
:external_video_url => evt[:external_video_url],
}
end
end
matched_external_video_events
end

# Adjust the recoding start and stop events to trim them to a meeting
# segment
def self.trim_start_and_stop_rec_events(rec_events, start, stop)
Expand Down
34 changes: 34 additions & 0 deletions record-and-playback/presentation/scripts/publish/presentation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1202,6 +1202,38 @@ def processPollEvents(events, package_dir)
end
end

def processExternalVideoEvents(events, package_dir)
BigBlueButton.logger.info("Processing external video events")

# Retrieve external video events
external_video_events = BigBlueButton::Events.match_start_and_stop_external_video_events(
BigBlueButton::Events.get_start_and_stop_external_video_events(@doc))

external_videos = []
$rec_events.each do |re|
external_video_events.each do |event|
#BigBlueButton.logger.info("Processing rec event #{re} and external video event #{event}")
timestamp = (translateTimestamp(event[:start_timestamp]) / 1000).to_i
# do not add same external_video twice
if (external_videos.find {|ev| ev[:timestamp] == timestamp}.nil?)
if ((event[:start_timestamp] >= re[:start_timestamp] and event[:start_timestamp] <= re[:stop_timestamp]) ||
(event[:start_timestamp] < re[:start_timestamp] and event[:stop_timestamp] >= re[:start_timestamp]))
external_videos << {
:timestamp => timestamp,
:external_video_url => event[:external_video_url]
}
end
end
end
end

if not external_videos.empty?
File.open("#{package_dir}/external_videos.json", "w") do |f|
f.puts(external_videos.to_json)
end
end
end

$shapes_svg_filename = 'shapes.svg'
$panzooms_xml_filename = 'panzooms.xml'
$cursor_xml_filename = 'cursor.xml'
Expand Down Expand Up @@ -1401,6 +1433,8 @@ def processPollEvents(events, package_dir)

processPollEvents(@doc, package_dir)

processExternalVideoEvents(@doc, package_dir)

# Write slides.xml to file
File.open("#{package_dir}/slides_new.xml", 'w') { |f| f.puts $slides_doc.to_xml }

Expand Down