2016-06-26 23:52:09 +08:00
|
|
|
#!/usr/bin/ruby
|
2014-11-13 01:54:45 +08:00
|
|
|
|
|
|
|
require File.expand_path('../../lib/recordandplayback', __FILE__)
|
|
|
|
require 'nokogiri'
|
|
|
|
require 'trollop'
|
|
|
|
|
2014-11-13 02:19:57 +08:00
|
|
|
props = YAML::load(File.open(File.expand_path('../bigbluebutton.yml', __FILE__)))
|
2014-11-13 01:54:45 +08:00
|
|
|
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"
|
2015-03-19 02:56:00 +08:00
|
|
|
done_file = "#{props['recording_dir']}/status/bbb-0.9-beta-recording-update-v2.done"
|
2014-11-13 01:54:45 +08:00
|
|
|
|
|
|
|
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)
|