#!/usr/bin/env ruby require 'json' require_relative './../../xrforge.rb' # Check if a filename is provided if ARGV.length != 1 puts "Usage: #{$0} " exit 1 end filename = ARGV[0] JMLHeuristic = /.*?<\/fireboxroom>/im begin # dont run for each file-update if ! filename.end_with?("datapackage.json") exit 0 end # Change the directory dir = File.dirname(filename) dirPublic = dir.gsub("/mnt/","").gsub("#","%23") Dir.chdir( File.dirname(filename) ) # Read and parse the JSON file data = JSON.parse( File.read( "datapackage.json" ) ) #if data['keywords'].empty? || data['keywords'].include?('janusxr') logfile = File.join( File.dirname(filename), ".xrforge/log.txt" ) XRForge.log("✅ starting build janusXR XR scene", logfile) model_file = XRForge.getExperienceFile(data,dir,logfile) # Check if a model file was found after the loop if ! model_file XRForge.log("❌ No suitable 3D file found for JanusXR-compatible experience", logfile) exit 0 end # Get the value of the environment variable FEDERATE_DRIVE_HOST federate_drive_host = ENV['FEDERATE_DRIVE_HOST'] autogenerate = true if data['description'] && data['description'].match(JMLHeuristic) if data['description'].match(/autogenerate=["']false["']/i) XRForge.log("✅ autogenerate='false' found in JML..keeping this JML",logfile) autogenerate = false jmlMatch = data['description'].match(JMLHeuristic) jml = jmlMatch[0] end end if autogenerate assets = "\n" objects = "" # detect audio track sidecarfile as per XR Fragment spec: https://xrfragment.org/#%F0%9F%93%9C%20level0%3A%20File xrf_ext = File.extname(model_file) xrf_base = File.basename(model_file, xrf_ext) data['resources'].each do |resource| ext = File.extname(resource['path']) if ext.match(/mp3/i) base = File.basename(resource['path'], ext) if base == xrf_base XRForge.log("✅ XR Fragments side-car file found: #{resource['path']}",logfile) assets = assets + " \n" objects = objects + "\n" end end end private = data['keywords'].include?('singleuser') ? "private='true'" : "" # tags to JML rooms *REFACTOR PLEASE* use_local_asset = "" use_local_asset = data['keywords'].include?('room1') ? "use_local_asset=\"room1\"" : use_local_asset use_local_asset = data['keywords'].include?('room2') ? "use_local_asset=\"room2\"" : use_local_asset use_local_asset = data['keywords'].include?('room3') ? "use_local_asset=\"room3\"" : use_local_asset use_local_asset = data['keywords'].include?('room4') ? "use_local_asset=\"room4\"" : use_local_asset use_local_asset = data['keywords'].include?('room5') ? "use_local_asset=\"room5\"" : use_local_asset use_local_asset = data['keywords'].include?('room6') ? "use_local_asset=\"room5\"" : use_local_asset use_local_asset = data['keywords'].include?('room1_pedestal') ? "use_local_asset=\"room1_pedestal\"" : use_local_asset use_local_asset = data['keywords'].include?('room2_pedestal') ? "use_local_asset=\"room2_pedestal\"" : use_local_asset use_local_asset = data['keywords'].include?('room2_narrow') ? "use_local_asset=\"room3_narrow\"" : use_local_asset objects = objects + " " jml = <<~JML #{assets} #{objects} JML data['description'] = data['description'] ? data['description'] : "your description here\n" data['description'] = <<~DESCRIPTION#{data['description']} #{jml} DESCRIPTION File.write("datapackage.json", JSON.pretty_generate(data) ) end html = <<~HTML janusxr room #{jml} HTML File.write('.xrforge/janusxr.html', html) File.write('.xrforge/scene.jml', jml) XRForge.log("✅ generated scene.jml", logfile) XRForge.log("✅ generated janusxr.html", logfile) XRForge.log(" ", logfile) # tag it! if ! data['keywords'].include?('janusxr') data['keywords'].push('janusxr') File.write("datapackage.json", JSON.pretty_generate(data) ) end rescue Errno::ENOENT puts "File #{filename} not found" rescue JSON::ParserError puts "Error parsing JSON from #{filename}" rescue => e puts "An error occurred: #{e.message}" end