153 lines
4.8 KiB
Ruby
Executable file
153 lines
4.8 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
require 'json'
|
|
require_relative './../../xrforge.rb'
|
|
|
|
# Check if a filename is provided
|
|
if ARGV.length != 1
|
|
puts "Usage: #{$0} <path/to/experience/datapackage.json>"
|
|
exit 1
|
|
end
|
|
|
|
filename = ARGV[0]
|
|
JMLHeuristic = /<fireboxroom>.*?<\/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)
|
|
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)
|
|
|
|
# Extract the desired field (assuming the field is named 'model_file')
|
|
thumb_file = data['image']
|
|
|
|
XRForge.log("✅ thumbnail sidecar-file '#{thumb_file}' detected", logfile)
|
|
|
|
# Get the base name of the thumbnail file without its extension
|
|
base_name = File.basename(thumb_file, File.extname(thumb_file))
|
|
|
|
model_file = nil # Initialize model_file to nil
|
|
|
|
# Loop over the list of extensions
|
|
XRForge::MODEL_EXT.each do |ext|
|
|
# Construct the filename with the current extension
|
|
filename = "#{base_name}#{ext}"
|
|
|
|
# Check if the file exists
|
|
if File.exist?(filename)
|
|
XRForge.log("✅ 3D file '#{filename}' detected", logfile)
|
|
model_file = "#{dir.gsub("/mnt/","")}/#{filename}" # Store the found filename
|
|
break # Stop the loop once a file is found
|
|
else
|
|
# Log a message for the file that was not found, but don't stop
|
|
XRForge.log("⚠️ 3D file '#{filename}' not detected", logfile)
|
|
end
|
|
end
|
|
|
|
# Check if a model file was found after the loop
|
|
if model_file
|
|
XRForge.log("✅ Final model file: '#{model_file}'", logfile)
|
|
else
|
|
XRForge.log("❌ No suitable 3D file found for XR Fragments- / JanusXR-compatible experience", logfile)
|
|
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['"]/)
|
|
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
|
|
jml = <<~JML
|
|
<FireBoxRoom>
|
|
<Assets>
|
|
<assetobject id="experience" src="#{federate_drive_host}/#{model_file.gsub("#","%23")}"/>
|
|
</Assets>
|
|
<Room autogenerate="true" #{ data['keywords'].include?('singleuser') ? "private='true'" : ""}>
|
|
<object pos="0 0 5" rotation="-180 0 180" lighting="false" collision_id="experience" id="experience" />
|
|
</Room>
|
|
</FireBoxRoom>
|
|
<!-- archive.org hints -->
|
|
<a href="#{federate_drive_host}/#{model_file.gsub("#","%23")}"></a>
|
|
JML
|
|
|
|
data['description'] = data['description'] ? data['description'] : "your description here\n"
|
|
data['description'] = <<~DESCRIPTION#{data['description']}
|
|
<!-- Hi there! Below is autogenerated JanusXR Markup (JML). -->
|
|
<!-- If you want to tweak it, then first disable autogeneration -->
|
|
<!-- How? make sure to set autogenerate="false" (see room-tag below) -->
|
|
<!-- -->
|
|
<!-- JML info: -->
|
|
<!-- https://coderofsalvation.github.io/janus-guide/#/examples/markup -->
|
|
<!-- https://janusxr.org/docs/build/introtojml/index.html -->
|
|
|
|
#{jml}
|
|
DESCRIPTION
|
|
File.write("datapackage.json", JSON.pretty_generate(data) )
|
|
end
|
|
|
|
html = <<~HTML
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>janusxr room</title>
|
|
</head>
|
|
<body>
|
|
<script src="https://web.janusvr.com/janusweb.js"></script>
|
|
<janus-viewer>
|
|
#{jml}
|
|
</janus-viewer>
|
|
|
|
<!-- map query args as attributes -->
|
|
<script>
|
|
args = new URLSearchParams(document.location.search)
|
|
for( const [k,v] of args.entries()) document.querySelector("Room").setAttribute(k,v)
|
|
</script>
|
|
|
|
<!-- archive.org hints -->
|
|
<a href="#{federate_drive_host}/#{model_file.gsub("#","%23")}"></a>
|
|
</body>
|
|
</html>
|
|
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
|
|
|