bigbluebutton-Github/record-and-playback/podcast/scripts/publish/podcast.rb

154 lines
5.4 KiB
Ruby
Executable File

# Set encoding to utf-8
# encoding: UTF-8
#
# BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
#
# Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below).
#
# This program is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free Software
# Foundation; either version 3.0 of the License, or (at your option) any later
# version.
#
# BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
#
performance_start = Time.now
require '../../core/lib/recordandplayback'
require 'rubygems'
require 'optimist'
require 'yaml'
require 'builder'
require 'fastimage' # require fastimage to get the image size of the slides (gem install fastimage)
# This script lives in scripts/archive/steps while properties.yaml lives in scripts/
bbb_props = YAML::load(File.open('../../core/scripts/bigbluebutton.yml'))
podcast_props = YAML::load(File.open('podcast.yml'))
opts = Optimist::options do
opt :meeting_id, "Meeting id to archive", :default => '58f4a6b3-cd07-444d-8564-59116cb53974', :type => String
end
meeting_id = opts[:meeting_id]
puts meeting_id
match = /(.*)-(.*)/.match meeting_id
meeting_id = match[1]
playback = match[2]
puts meeting_id
puts playback
begin
if (playback == "podcast")
log_dir = bbb_props['log_dir']
logger = Logger.new("#{log_dir}/podcast/publish-#{meeting_id}.log", 'daily' )
BigBlueButton.logger = logger
recording_dir = bbb_props['recording_dir']
raw_archive_dir = "#{recording_dir}/raw/#{meeting_id}"
process_dir = "#{recording_dir}/process/podcast/#{meeting_id}"
publish_dir = podcast_props['publish_dir']
playback_protocol = bbb_props['playback_protocol']
playback_host = bbb_props['playback_host']
target_dir = "#{recording_dir}/publish/podcast/#{meeting_id}"
if not FileTest.directory?(target_dir)
BigBlueButton.logger.info("Making dir target_dir")
FileUtils.mkdir_p target_dir
BigBlueButton.logger.info("copying: #{process_dir}/audio.ogg to -> #{target_dir}")
FileUtils.cp("#{process_dir}/audio.ogg", target_dir)
@doc = Nokogiri::XML(File.open("#{raw_archive_dir}/events.xml"))
recording_time = BigBlueButton::Events.get_recording_length(@doc)
BigBlueButton.logger.info("Creating metadata.xml")
#### INSTEAD OF CREATING THE WHOLE metadata.xml FILE AGAIN, ONLY ADD <playback>
# Copy metadata.xml from process_dir
FileUtils.cp("#{process_dir}/metadata.xml", target_dir)
BigBlueButton.logger.info("Copied metadata.xml file")
# Update state and add playback to metadata.xml
## Load metadata.xml
metadata = Nokogiri::XML(File.open("#{target_dir}/metadata.xml"))
## Update state
recording = metadata.root
state = recording.at_xpath("state")
state.content = "published"
published = recording.at_xpath("published")
published.content = "true"
## Remove empty playback
metadata.search('//recording/playback').each do |playback|
playback.remove
end
## Add the actual playback
metadata_with_playback = Nokogiri::XML::Builder.with(metadata.at('recording')) do |xml|
xml.playback {
xml.format("podcast")
xml.link("#{playback_protocol}://#{playback_host}/podcast/#{meeting_id}/audio.ogg")
xml.duration("#{recording_time}")
}
end
## Write the new metadata.xml
metadata_file = File.new("#{target_dir}/metadata.xml","w")
metadata = Nokogiri::XML(metadata.to_xml) { |x| x.noblanks }
metadata_file.write(metadata.root)
metadata_file.close
BigBlueButton.logger.info("Added playback to metadata.xml")
# Now publish this recording files by copying them into the publish folder.
if not FileTest.directory?(publish_dir)
FileUtils.mkdir_p publish_dir
end
# Get raw size of recording files
raw_dir = "#{recording_dir}/raw/#{meeting_id}"
# After all the processing we'll add the published format and raw sizes to the metadata file
BigBlueButton.add_raw_size_to_metadata(target_dir, raw_dir)
BigBlueButton.add_playback_size_to_metadata(target_dir)
FileUtils.cp_r(target_dir, publish_dir) # Copy all the files.
BigBlueButton.logger.info("Finished publishing script podcast.rb successfully.")
BigBlueButton.logger.info("Removing processed files.")
FileUtils.rm_r(process_dir)
BigBlueButton.logger.info("Removing published files.")
FileUtils.rm_r(target_dir)
publish_done = File.new("#{recording_dir}/status/published/#{meeting_id}-podcast.done", "w")
publish_done.write("Published #{meeting_id}")
publish_done.close
else
BigBlueButton.logger.info("#{target_dir} is already there")
end
end
rescue Exception => e
BigBlueButton.logger.error(e.message)
e.backtrace.each do |traceline|
BigBlueButton.logger.error(traceline)
end
publish_done = File.new("#{recording_dir}/status/published/#{meeting_id}-podcast.fail", "w")
publish_done.write("Failed Publishing #{meeting_id}")
publish_done.close
exit 1
end