Ruby
Simple Ruby script to upload a capture zip file.
It retrieves an authentication token using the client_id
and client_secret
found in your Developer Dashboard.
Read the Quick Start Guide and the Upload Captures pages to learn more.
⚠️ To run this you need the
http
gem. Install it withgem install http
require 'http'
require 'json'
CLIENT_ID = 'insert-it-here'
CLIENT_SECRET = 'insert-it-here'
AUTH_ENDPOINT = 'https://signin.teleport.varjo.com/oauth2/token'
API_BASE = 'https://teleport.varjo.com'
# Step 1: Authenticate
auth_response = HTTP.post(
AUTH_ENDPOINT,
form: {
grant_type: 'client_credentials',
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
scope: 'openid profile email'
}
)
unless auth_response.status.success?
abort("Authentication failed: #{auth_response.status}")
end
access_token = auth_response.parse['access_token']
# Step 2: Prepare the capture file
filename = ARGV[0]
abort("Usage: ruby upload_capture.rb <file>") unless filename
bytesize = File.size(filename)
puts "Uploading capture of #{bytesize} bytes..."
# Step 3: Create capture
created = HTTP.auth("Bearer #{access_token}")
.post("#{API_BASE}/api/v1/captures", json: {
name: File.basename(filename),
bytesize: bytesize,
input_data_format: 'bulk-images'
})
unless created.status.success?
abort("Failed to create capture: #{created.status}")
end
data = created.parse
eid = data['eid']
num_parts = data['num_parts']
chunk_size = data['chunk_size']
puts "Uploading #{num_parts} parts..."
# Step 4: Upload file parts
parts = []
File.open(filename, 'rb') do |file|
(1..num_parts).each do |part_no|
url_resp = HTTP.auth("Bearer #{access_token}")
.post("#{API_BASE}/api/v1/captures/#{eid}/create-upload-url/#{part_no}",
json: { eid: eid, bytesize: bytesize })
unless url_resp.status.success?
abort("Failed to get upload URL for part #{part_no}: #{url_resp.status}")
end
upload_url = url_resp.parse['upload_url']
puts "Uploading part #{part_no}..."
part_data = file.read(chunk_size)
put_resp = HTTP.put(upload_url, body: part_data)
unless put_resp.status.success?
abort("Failed to upload part #{part_no}: #{put_resp.status}")
end
etag = put_resp.headers['ETag'].to_s.delete('"')
parts << { number: part_no, etag: etag }
end
end
# Step 5: Notify upload completion
completed = HTTP.auth("Bearer #{access_token}")
.post("#{API_BASE}/api/v1/captures/#{eid}/uploaded",
json: { eid: eid, parts: parts })
unless completed.status.success?
abort("Failed to finalize upload: #{completed.status}")
end
state = completed.parse['state']
puts "Upload done!"
puts "Capture state: #{state}"