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 with gem 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}"