bigbluebutton-Github/record-and-playback/core/scripts/bbb-0.9-beta-recording-update
2016-06-26 11:52:09 -04:00

115 lines
3.5 KiB
Ruby
Executable File

#!/usr/bin/ruby
require File.expand_path('../../lib/recordandplayback', __FILE__)
require 'nokogiri'
require 'trollop'
props = YAML::load(File.open(File.expand_path('../bigbluebutton.yml', __FILE__)))
log_dir = props['log_dir']
raw_recording_dir = "#{props['recording_dir']}/raw"
published_dir = props['published_dir']
unpublished_dir = "#{published_dir}/../unpublished"
opts = Trollop::options do
opt(:force, "Run script even if it has previously been run",
:default => false)
opt(:quiet, "Minimal output mode, for automated use",
:default => false)
end
log_file = "#{log_dir}/bbb-0.9-beta-recording-update.log"
done_file = "#{props['recording_dir']}/status/bbb-0.9-beta-recording-update-v2.done"
logger = Logger.new(log_file)
logger.level = Logger::INFO
BigBlueButton.logger = logger
if File.exist?(done_file) and !opts.force
if !opts.quiet
puts "Script has previously been run, doing nothing"
puts "Use the --force option to override"
end
exit 0
end
def do_recording_update(recording_dir, raw_recording_dir)
match = /([^\/]*)$/.match(recording_dir)
meeting_id = match[1]
BigBlueButton.logger.info("Processing recording #{meeting_id}")
# Read the metadata.xml file to check if the URL needs update
metadata_xml = nil
File.open("#{recording_dir}/metadata.xml") do |io|
metadata_xml = Nokogiri::XML(io)
end
link_xml = metadata_xml.at_xpath('/recording/playback/link')
link = link_xml.content
# Check whether the recording already has a versioned playback link
m = /presentation\/([0-9.]+)\/playback\.html/.match(link)
if (m)
BigBlueButton.logger.info("Recording using playback scripts version #{m[1]}, ok")
return
end
# Determine which version playback is appropriate for the recording
events_xml = nil
File.open("#{raw_recording_dir}/#{meeting_id}/events.xml") do |io|
events_xml = Nokogiri::XML(io)
end
recording_xml = events_xml.at_xpath('/recording')
bbb_version = recording_xml['bbb_version']
if (!bbb_version)
bbb_version = '0.81'
elsif bbb_version == '0.90' # Old beta versions
bbb_version = '0.9.0'
elsif bbb_version == '0.9.0' # Current version
else
BigBlueButton.logger.error("Unsupported BigBlueButton version #{bbb_version}")
return
end
BigBlueButton.logger.info("Rewriting link with version #{bbb_version}")
link.sub!(/presentation\/playback\.html/, "presentation/#{bbb_version}/playback.html")
link_xml.content = link
# Rewrite the metadata.xml file
IO.write("#{recording_dir}/metadata.xml", metadata_xml.to_xml)
rescue StandardError => e
BigBlueButton.logger.error("Failed to update recording #{meeting_id}: #{e}")
e.backtrace.each do |traceline|
BigBlueButton.logger.error(traceline)
end
end
BigBlueButton.logger.info("Updating playback path of 0.9 beta recordings")
puts "Updating recording links for 0.9.0..."
num_recordings = 0
BigBlueButton.logger.info("Checking recordings in #{published_dir}")
Dir.glob("#{published_dir}/presentation/*-*").each do |recording_dir|
print '.' if num_recordings % 10 == 0
num_recordings += 1
do_recording_update(recording_dir, raw_recording_dir)
end
BigBlueButton.logger.info("Checking recordings in #{unpublished_dir}")
Dir.glob("#{unpublished_dir}/presentation/*-*").each do |recording_dir|
print '.' if num_recordings % 10 == 0
num_recordings += 1
do_recording_update(recording_dir, raw_recording_dir)
end
puts "done"
puts "See the output in #{log_file} for details"
BigBlueButton.logger.info("Processed #{num_recordings} recordings")
IO.write(done_file, Time.now)