milestone 4k. manyfold.sh: add default pre-optimized 3D assets (fontmap e.g.)

This commit is contained in:
Leon van Kammen 2025-08-11 16:19:41 +02:00
parent d486414605
commit 5c24372488
10 changed files with 158 additions and 10 deletions

View file

@ -16,6 +16,7 @@ $ docker load < $(nix-build nix/docker.nix)
| environment variable | default | info |
|-----------------------|--------------|------------------------|
| `APPNAME` | `manyfold` | manyfold instance name |
| `HOMEPAGE` | `/models` | show '/models' URL as homepage (use `/` for manyfold default) |
| `THEME` | `default` | bootstrap theme |
| `RUNTESTS` | `0` | set to `1` to run XRForge related [/test](test) scripts |
| `NO_OVERLAYFS` | `` | disable the filesystem overlay mechanism |

View file

@ -2,6 +2,8 @@
oci=$(which podman || which docker)
test -n "$APPNAME" || APPNAME=xrforge
test -n "$UPLOAD_PATH" || UPLOAD_PATH=/mnt/experiences
test -n "$THEME" || THEME=vapor # xrforge (public/assets/themes/xrforge.css gives err)
test -n "$HOMEPAGE" || HOMEPAGE=/models
db=/config/manyfold.sqlite3
# utility funcs
@ -28,7 +30,8 @@ run(){
-e SUDO_RUN_UNSAFELY=enabled \
-e MULTIUSER=enabled \
-e FEDERATION=enabled \
-e THEME=vapor \
-e THEME=$THEME \
-e HOMEPAGE=$HOMEPAGE \
-e FEDERATE_DRIVE_CACHE=5s \
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
xrforge
@ -146,6 +149,12 @@ set_modelpath(){
debug sqlite3 /config/manyfold.sqlite3 "UPDATE settings SET value = replace('--- \"{creator}/{modelId}\"\n','\n',char(10)) WHERE var == 'model_path_template';"
}
set_homepage(){
test "$HOMEPAGE" = "/" && return 0 # nothing to do
echocolor "[$APPNAME]" "enforcing homepage path"
debug sed -i 's|root to:.*|root to: redirect("'$HOMEPAGE'")|g' /usr/src/app/config/routes.rb
}
rename_app(){
echocolor "[$APPNAME]" "renaming manyfold to $APPNAME"
sed -i 's/title: Manyfold/title: '$APPNAME'/g' /usr/src/app/config/locales/*.yml
@ -169,6 +178,7 @@ boot(){
test -z "$NO_DEFAULTDB" && db default
start_syslog
rename_app
set_homepage
set_theme
set_modelpath
rclone_mount

View file

@ -143,16 +143,19 @@ INSERT INTO ar_internal_metadata VALUES('environment','production','2025-07-25 1
CREATE TABLE IF NOT EXISTS "libraries" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "path" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" varchar, "caption" varchar, "name" varchar, "tag_regex" text, "icon" text, "storage_service" varchar DEFAULT 'filesystem' NOT NULL, "s3_endpoint" varchar DEFAULT NULL, "s3_region" varchar DEFAULT NULL, "s3_bucket" varchar DEFAULT NULL, "s3_access_key_id" varchar DEFAULT NULL, "s3_secret_access_key" varchar DEFAULT NULL, "public_id" varchar, "s3_path_style" boolean DEFAULT 1 NOT NULL);
INSERT INTO libraries VALUES(6,'/mnt/experiences','2025-08-07','2025-08-07','','','experiences',NULL,'','filesystem','','','','','','experiences',1);
CREATE TABLE IF NOT EXISTS "tags" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime, "updated_at" datetime, "taggings_count" integer DEFAULT 0);
INSERT INTO tags VALUES(1,'fontmap','2025-08-11 07:14:34.877804','2025-08-11 07:14:34.877804',1);
CREATE TABLE IF NOT EXISTS "taggings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "tag_id" integer, "taggable_type" varchar, "taggable_id" integer, "tagger_type" varchar, "tagger_id" integer, "context" varchar(128), "created_at" datetime, CONSTRAINT "fk_rails_9fcd2e236b"
FOREIGN KEY ("tag_id")
REFERENCES "tags" ("id")
);
INSERT INTO taggings VALUES(1,1,'Model',1,NULL,NULL,'tags','2025-08-11 07:14:34.907021');
CREATE TABLE IF NOT EXISTS "links" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar, "linkable_type" varchar, "linkable_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "synced_at" datetime(6));
INSERT INTO links VALUES(1,'https://xrfragment.org','Creator',1,'2025-08-11 07:07:58.791010','2025-08-11 07:07:58.791010',NULL);
CREATE TABLE IF NOT EXISTS "settings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "var" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
INSERT INTO settings VALUES(1,'default_library','6','2025-07-25 10:58:00.004576','2025-07-28 13:30:03.381376');
INSERT INTO settings VALUES(2,'site_name',replace('--- XRForge\n','\n',char(10)),'2025-07-25 10:59:04.496016','2025-07-25 10:59:04.496016');
INSERT INTO settings VALUES(3,'site_tagline',replace('--- Self-sovereign XR Experiences. Connect 3D files via URLs\n','\n',char(10)),'2025-07-25 10:59:04.519264','2025-08-07 10:49:23.348065');
INSERT INTO settings VALUES(4,'theme',replace('--- vapor\n','\n',char(10)),'2025-07-25 10:59:04.522670','2025-08-07 10:47:16.469331');
INSERT INTO settings VALUES(4,'theme','vapor','2025-07-25 10:59:04.522670','2025-08-07 10:47:16.469331');
INSERT INTO settings VALUES(5,'about',replace('--- |-\n XRForge is a preconfigured Manyfold, tailored to an XR Audience.\n\n # Features\n\n * linked VR-experiences (via XR Fragments spec)\n * federated libraries / network drives\n * automatic packaging for game-engines\n','\n',char(10)),'2025-07-25 10:59:04.527612','2025-08-07 10:51:18.592181');
INSERT INTO settings VALUES(6,'rules',replace('--- ''''\n','\n',char(10)),'2025-07-25 10:59:04.531378','2025-07-25 10:59:04.531378');
INSERT INTO settings VALUES(7,'support_link',replace('--- https://forgejo.isvery.ninja/coderofsalvation/xrforge\n','\n',char(10)),'2025-07-25 10:59:04.533678','2025-07-25 10:59:04.533678');
@ -174,6 +177,7 @@ INSERT INTO settings VALUES(22,'default_viewer_role',replace('--- member\n','\n'
INSERT INTO settings VALUES(23,'enable_user_quota',replace('--- false\n','\n',char(10)),'2025-08-07 10:46:21.944399','2025-08-07 10:46:21.944399');
INSERT INTO settings VALUES(24,'default_user_quota',replace('--- 0\n','\n',char(10)),'2025-08-07 10:46:21.950723','2025-08-07 10:46:21.950723');
CREATE TABLE IF NOT EXISTS "problems" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "problematic_type" varchar, "problematic_id" integer, "category" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "note" varchar DEFAULT NULL, "ignored" boolean DEFAULT 0 NOT NULL, "public_id" varchar, "in_progress" boolean DEFAULT 0 NOT NULL);
INSERT INTO problems VALUES(2,'Model',1,11,'2025-08-11 07:14:44.067192','2025-08-11 07:14:44.067192',NULL,0,'hwlxhqvk7w7r',0);
CREATE TABLE IF NOT EXISTS "favorites" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "favoritable_type" varchar NOT NULL, "favoritable_id" integer NOT NULL, "favoritor_type" varchar NOT NULL, "favoritor_id" integer NOT NULL, "scope" varchar DEFAULT 'printed' NOT NULL, "blocked" boolean DEFAULT 0 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
CREATE TABLE IF NOT EXISTS "flipper_features" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "key" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
CREATE TABLE IF NOT EXISTS "flipper_gates" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "feature_key" varchar NOT NULL, "key" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
@ -186,7 +190,7 @@ CREATE TABLE IF NOT EXISTS "users_roles" ("user_id" integer, "role_id" integer);
INSERT INTO users_roles VALUES(1,4);
INSERT INTO users_roles VALUES(1,1);
CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar DEFAULT '' NOT NULL, "encrypted_password" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "username" varchar NOT NULL, "pagination_settings" json DEFAULT '{"models":true,"creators":true,"collections":true,"per_page":12}', "renderer_settings" json DEFAULT '{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}', "tag_cloud_settings" json DEFAULT '{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}', "problem_settings" json DEFAULT '{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}', "file_list_settings" json DEFAULT '{"hide_presupported_versions":true}', "reset_password_token" varchar, "remember_created_at" datetime(6), "reset_password_sent_at" datetime(6), "interface_language" varchar, "failed_attempts" integer DEFAULT 0 NOT NULL, "locked_at" datetime(6), "auth_provider" varchar, "auth_uid" varchar, "sensitive_content_handling" varchar DEFAULT NULL, "public_id" varchar, "approved" boolean DEFAULT 1 NOT NULL, "quota" integer DEFAULT 1 NOT NULL, "quota_use_site_default" boolean DEFAULT 1 NOT NULL);
INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-07-25 12:46:27.338917','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-07-25 12:46:27.325287',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1);
INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-08-11 07:05:45.209885','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-08-11 07:05:45.208500',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1);
CREATE TABLE IF NOT EXISTS "federails_followings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "actor_id" integer NOT NULL, "target_actor_id" integer NOT NULL, "status" integer DEFAULT 0, "federated_url" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "uuid" varchar DEFAULT NULL, CONSTRAINT "fk_rails_2e62338faa"
FOREIGN KEY ("actor_id")
REFERENCES "federails_actors" ("id")
@ -198,7 +202,22 @@ CREATE TABLE IF NOT EXISTS "federails_activities" ("id" integer PRIMARY KEY AUTO
FOREIGN KEY ("actor_id")
REFERENCES "federails_actors" ("id")
);
INSERT INTO federails_activities VALUES(1,'Federails::Actor',2,'Create',1,'2025-08-11 07:07:58.701474','2025-08-11 07:07:58.876261','533e3d24-4f3b-41ce-aea4-2b44c51f3d04');
INSERT INTO federails_activities VALUES(2,'Federails::Actor',3,'Create',1,'2025-08-11 07:08:57.465310','2025-08-11 07:08:57.525980','de39545b-7f21-47f2-b283-3f48150dc1de');
INSERT INTO federails_activities VALUES(3,'Federails::Actor',4,'Create',1,'2025-08-11 07:14:35.073201','2025-08-11 07:14:35.102927','3c137d07-e8ae-47af-9c47-ba97f25c1746');
INSERT INTO federails_activities VALUES(4,'Comment',1,'Create',2,'2025-08-11 07:15:26.394452','2025-08-11 07:15:26.394452','91b2b8d4-5d56-4b17-9ba6-7db5ac0fd3a5');
INSERT INTO federails_activities VALUES(5,'Comment',2,'Create',2,'2025-08-11 07:24:45.549316','2025-08-11 07:24:45.549316','25aee6f6-d57c-4fc7-b9a9-8546ef058749');
INSERT INTO federails_activities VALUES(6,'Federails::Actor',4,'Update',1,'2025-08-11 07:29:38.394492','2025-08-11 07:29:38.489061','91c075fa-ac0b-467e-b2f6-6f82cbc40f69');
INSERT INTO federails_activities VALUES(7,'Federails::Actor',4,'Update',1,'2025-08-11 13:42:47.136658','2025-08-11 13:42:47.275209','d587a29e-e2b6-4892-ad24-44bcd748186b');
CREATE TABLE IF NOT EXISTS "caber_relations" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "subject_type" varchar, "subject_id" integer, "permission" varchar, "object_type" varchar NOT NULL, "object_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
INSERT INTO caber_relations VALUES(1,'User',1,'own','Creator',1,'2025-08-11 07:07:58.784365','2025-08-11 07:07:58.784365');
INSERT INTO caber_relations VALUES(2,'Role',4,'view','Creator',1,'2025-08-11 07:07:58.903544','2025-08-11 07:07:58.903544');
INSERT INTO caber_relations VALUES(3,'User',1,'own','Collection',1,'2025-08-11 07:08:57.495084','2025-08-11 07:08:57.495084');
INSERT INTO caber_relations VALUES(4,'Role',4,'view','Collection',1,'2025-08-11 07:08:57.537413','2025-08-11 07:08:57.537413');
INSERT INTO caber_relations VALUES(5,'User',1,'own','Model',1,'2025-08-11 07:14:34.852077','2025-08-11 07:14:34.852077');
INSERT INTO caber_relations VALUES(6,'Role',4,'view','Model',1,'2025-08-11 07:14:35.135758','2025-08-11 07:14:35.135758');
INSERT INTO caber_relations VALUES(7,NULL,NULL,'view','Creator',1,'2025-08-11 07:15:19.800404','2025-08-11 07:15:19.800404');
INSERT INTO caber_relations VALUES(8,NULL,NULL,'view','Model',1,'2025-08-11 07:15:19.851560','2025-08-11 07:15:19.851560');
CREATE TABLE IF NOT EXISTS "federails_moderation_reports" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "federated_url" varchar, "federails_actor_id" integer, "content" varchar, "object_type" varchar, "object_id" integer, "resolved_at" datetime(6), "resolution" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_a5cda24d4c"
FOREIGN KEY ("federails_actor_id")
REFERENCES "federails_actors" ("id")
@ -208,6 +227,8 @@ CREATE TABLE IF NOT EXISTS "comments" ("id" integer PRIMARY KEY AUTOINCREMENT NO
FOREIGN KEY ("federails_actor_id")
REFERENCES "federails_actors" ("id")
);
INSERT INTO comments VALUES(1,'q6hxq3r8jwnv','Creator',1,'Model',1,'A new 3D model, ["Fontmap"](http://localhost:3214/models/vrpw4zlgzzm8), was just published!','2025-08-11 07:15:26.378633','2025-08-11 07:15:26.378633',1,0,NULL,2);
INSERT INTO comments VALUES(2,'s6w0nbxv8wmt','Creator',1,'Model',1,'The 3D model ["XR Fragments assets"](http://localhost:3214/models/vrpw4zlgzzm8), was just updated!','2025-08-11 07:24:45.534105','2025-08-11 07:24:45.534105',1,0,NULL,2);
CREATE TABLE IF NOT EXISTS "oauth_applications" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "uid" varchar NOT NULL, "secret" varchar NOT NULL, "redirect_uri" text, "scopes" varchar DEFAULT '' NOT NULL, "confidential" boolean DEFAULT 1 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "owner_id" bigint, "owner_type" varchar);
CREATE TABLE IF NOT EXISTS "oauth_access_grants" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "resource_owner_id" integer NOT NULL, "application_id" integer NOT NULL, "token" varchar NOT NULL, "expires_in" integer NOT NULL, "redirect_uri" text NOT NULL, "scopes" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "revoked_at" datetime(6), CONSTRAINT "fk_rails_b4b53e07b8"
FOREIGN KEY ("application_id")
@ -225,6 +246,9 @@ FOREIGN KEY ("resource_owner_id")
);
CREATE TABLE IF NOT EXISTS "federails_actors" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "federated_url" varchar, "username" varchar, "server" varchar, "inbox_url" varchar, "outbox_url" varchar, "followers_url" varchar, "followings_url" varchar, "profile_url" varchar, "entity_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "entity_type" varchar DEFAULT NULL, "public_key" text, "private_key" text, "uuid" varchar, "extensions" json, "local" boolean DEFAULT 0 NOT NULL, "actor_type" varchar, "tombstoned_at" datetime(6));
INSERT INTO federails_actors VALUES(1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-07-25 10:52:57.029315','2025-07-25 10:52:57.029315','User',NULL,NULL,'eb64d114-1bc7-4cb3-8be6-350d23ccfb3e',NULL,1,NULL,NULL);
INSERT INTO federails_actors VALUES(2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:07:58.778020','2025-08-11 07:07:58.778020','Creator',NULL,NULL,'bdff9ca9-88da-4b14-a7cb-01887e5d3c8e',NULL,1,NULL,NULL);
INSERT INTO federails_actors VALUES(3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:08:57.485286','2025-08-11 07:08:57.485286','Collection',NULL,NULL,'8478020b-6b34-4e86-8511-4a1bb738a331',NULL,1,NULL,NULL);
INSERT INTO federails_actors VALUES(4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:14:34.840250','2025-08-11 07:14:34.840250','Model',NULL,NULL,'18ccb599-8b40-4778-91f7-6b7970f0b256',NULL,1,NULL,NULL);
CREATE TABLE IF NOT EXISTS "model_files" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "filename" varchar, "model_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "presupported" boolean DEFAULT 0 NOT NULL, "y_up" boolean DEFAULT 0 NOT NULL, "digest" varchar, "notes" text, "caption" text, "size" bigint, "presupported_version_id" integer, "attachment_data" json, "public_id" varchar, "filename_lower" varchar GENERATED ALWAYS AS (LOWER(filename)) STORED, "previewable" boolean DEFAULT 0 NOT NULL, CONSTRAINT "fk_rails_b5ac05b6e3"
FOREIGN KEY ("presupported_version_id")
REFERENCES "model_files" ("id")
@ -232,6 +256,10 @@ FOREIGN KEY ("presupported_version_id")
FOREIGN KEY ("model_id")
REFERENCES "models" ("id")
);
INSERT INTO model_files VALUES(1,'fontmap.glb',1,'2025-08-11 07:14:35.064935','2025-08-11 07:14:44.111333',0,0,'35e8f851a1e012681f160d62c5acdb7f670b0f9a0060debe43858d70d804660485280a5ba110ff7a778aab603caeea786bb479d595a82d7ec0acff36a7e35eca',NULL,NULL,8600,NULL,'{"id":"xrfragments/#1/fontmap.glb","storage":"library_6","metadata":{"filename":"fontmap.glb","size":8600,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:14:35.337+00:00","mtime":"2025-08-11T07:14:35.338+00:00","remote_etag":null,"remote_last_modified":null}}','mlv2qfcv99s1',0);
INSERT INTO model_files VALUES(2,'datapackage.json',1,'2025-08-11 07:14:39.060349','2025-08-11 13:42:56.905818',0,0,NULL,NULL,NULL,1967,NULL,'{"id":"xrfragments/#1/datapackage.json","storage":"library_6","metadata":{"filename":null,"size":1967,"mime_type":"application/json","ctime":"2025-08-11T13:42:56.859+00:00","mtime":"2025-08-11T13:42:56.867+00:00","remote_etag":null,"remote_last_modified":null}}','d44635nm6z3k',0);
INSERT INTO model_files VALUES(7,'tree.glb',1,'2025-08-11 07:29:50.850906','2025-08-11 07:29:57.592832',0,0,'79f2f9dc9c771bcbed1fc18285eeebd420b7f33446b7b7cb7453d34a5566318db0920e97835e385f270321b901b76dc3eab12eb8b895eabc321326738ba2a249',NULL,NULL,6764,NULL,'{"id":"xrfragments/#1/tree.glb","storage":"library_6","metadata":{"filename":"tree.glb","size":6764,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:29:50.913+00:00","mtime":"2025-08-11T07:29:50.914+00:00","remote_etag":null,"remote_last_modified":null}}','1hmcw2bnbh7x',0);
INSERT INTO model_files VALUES(8,'assets.webp',1,'2025-08-11 13:42:47.085596','2025-08-11 13:42:57.003069',0,0,'1090220f0d208cc142a1025818cb11e8692a58b21aff9d7156eaa40ecd2566389f8a434bc15c9d192574d847ff14efd7b35edc9c3655ea90b0c8a4bb4072b0c4',NULL,NULL,90642,NULL,'{"id":"xrfragments/#1/assets.webp","storage":"library_6","metadata":{"filename":"assets.webp","size":90642,"mime_type":"image/webp","ctime":"2025-08-11T13:42:47.402+00:00","mtime":"2025-08-11T13:42:47.402+00:00","remote_etag":null,"remote_last_modified":null}}','4sjr984nmhtr',1);
CREATE TABLE IF NOT EXISTS "altcha_solutions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "algorithm" varchar, "challenge" varchar, "salt" varchar, "signature" varchar, "number" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
CREATE TABLE IF NOT EXISTS "models" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "path" varchar NOT NULL, "library_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "preview_file_id" integer, "creator_id" integer, "notes" text, "caption" text, "collection_id" integer, "slug" varchar, "license" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "sensitive" boolean DEFAULT 0 NOT NULL, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_cdf016e15c"
FOREIGN KEY ("collection_id")
@ -243,7 +271,9 @@ FOREIGN KEY ("library_id")
FOREIGN KEY ("creator_id")
REFERENCES "creators" ("id")
);
INSERT INTO models VALUES(1,'XR Fragments assets','xrfragments/#1',6,'2025-08-11 07:14:34.789236','2025-08-11 13:42:57.006778',8,1,'','',1,'fontmap','CC-BY-SA-4.0','vrpw4zlgzzm8',0,NULL,NULL);
CREATE TABLE IF NOT EXISTS "creators" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" text, "caption" text, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "indexable" varchar, "ai_indexable" varchar);
INSERT INTO creators VALUES(1,'xrfragments','2025-08-11 07:07:58.701474','2025-08-11 07:09:11.600140',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'','xrfragments','fjb71m9sbcl0','yes',NULL);
CREATE TABLE IF NOT EXISTS "collections" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "notes" text, "caption" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "collection_id" integer, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "creator_id" integer, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_63724415e9"
FOREIGN KEY ("collection_id")
REFERENCES "collections" ("id")
@ -251,19 +281,46 @@ FOREIGN KEY ("collection_id")
FOREIGN KEY ("creator_id")
REFERENCES "creators" ("id")
);
INSERT INTO sqlite_sequence VALUES('taggings',0);
INSERT INTO collections VALUES(1,'XR Fragments',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'3D assets which are XR Fragment-compatible.','2025-08-11 07:08:57.465310','2025-08-11 07:09:26.849151',NULL,'xr-fragments','z924drvlr4k1',1,NULL,NULL);
INSERT INTO sqlite_sequence VALUES('libraries',6);
INSERT INTO sqlite_sequence VALUES('tags',1);
INSERT INTO sqlite_sequence VALUES('taggings',1);
INSERT INTO sqlite_sequence VALUES('links',1);
INSERT INTO sqlite_sequence VALUES('settings',24);
INSERT INTO sqlite_sequence VALUES('problems',2);
INSERT INTO sqlite_sequence VALUES('roles',4);
INSERT INTO sqlite_sequence VALUES('users',1);
INSERT INTO sqlite_sequence VALUES('comments',0);
INSERT INTO sqlite_sequence VALUES('federails_activities',7);
INSERT INTO sqlite_sequence VALUES('caber_relations',8);
INSERT INTO sqlite_sequence VALUES('comments',2);
INSERT INTO sqlite_sequence VALUES('federails_actors',4);
INSERT INTO sqlite_sequence VALUES('model_files',8);
INSERT INTO sqlite_sequence VALUES('models',1);
INSERT INTO sqlite_sequence VALUES('creators',1);
INSERT INTO sqlite_sequence VALUES('collections',1);
INSERT INTO sqlite_sequence VALUES('libraries',6);
INSERT INTO sqlite_sequence VALUES('settings',24);
INSERT INTO sqlite_sequence VALUES('roles',4);
INSERT INTO sqlite_sequence VALUES('users',1);
INSERT INTO sqlite_sequence VALUES('federails_actors',4);
INSERT INTO sqlite_sequence VALUES('taggings',1);
INSERT INTO sqlite_sequence VALUES('users',1);
INSERT INTO sqlite_sequence VALUES('comments',2);
INSERT INTO sqlite_sequence VALUES('oauth_access_grants',0);
INSERT INTO sqlite_sequence VALUES('oauth_access_tokens',0);
INSERT INTO sqlite_sequence VALUES('federails_actors',1);
INSERT INTO sqlite_sequence VALUES('model_files',0);
INSERT INTO sqlite_sequence VALUES('models',0);
INSERT INTO sqlite_sequence VALUES('creators',0);
INSERT INTO sqlite_sequence VALUES('collections',0);
INSERT INTO sqlite_sequence VALUES('model_files',7);
INSERT INTO sqlite_sequence VALUES('models',1);
INSERT INTO sqlite_sequence VALUES('creators',1);
INSERT INTO sqlite_sequence VALUES('collections',1);
INSERT INTO sqlite_sequence VALUES('roles',4);
INSERT INTO sqlite_sequence VALUES('libraries',6);
INSERT INTO sqlite_sequence VALUES('settings',24);
INSERT INTO sqlite_sequence VALUES('caber_relations',8);
INSERT INTO sqlite_sequence VALUES('links',1);
INSERT INTO sqlite_sequence VALUES('federails_activities',6);
INSERT INTO sqlite_sequence VALUES('tags',1);
INSERT INTO sqlite_sequence VALUES('problems',2);
CREATE UNIQUE INDEX "index_tags_on_name" ON "tags" ("name");
CREATE UNIQUE INDEX "taggings_idx" ON "taggings" ("tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type");
CREATE INDEX "taggings_taggable_context_idx" ON "taggings" ("taggable_id", "taggable_type", "context");

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View file

@ -0,0 +1,68 @@
{
"$schema": "https://manyfold.app/profiles/0.0/datapackage.json",
"name": "xr-fragments-assets",
"title": "XR Fragments assets",
"caption": "",
"description": "",
"homepage": "http://localhost:3214/models/vrpw4zlgzzm8",
"image": "assets.webp",
"keywords": [
"fontmap"
],
"licenses": [
{
"name": "CC-BY-SA-4.0",
"path": "https://spdx.org/licenses/CC-BY-SA-4.0.html"
}
],
"resources": [
{
"name": "fontmap",
"path": "fontmap.glb",
"mediatype": "model/gltf",
"up": "+z",
"presupported": false
},
{
"name": "tree",
"path": "tree.glb",
"mediatype": "model/gltf",
"up": "+z",
"presupported": false
},
{
"name": "assets",
"path": "assets.webp",
"mediatype": "image/webp",
"up": "+z",
"presupported": false
}
],
"sensitive": false,
"contributors": [
{
"title": "xrfragments",
"path": "http://localhost:3214/creators/xrfragments",
"roles": [
"creator"
],
"caption": "",
"description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .",
"links": [
{
"path": "https://xrfragment.org"
}
]
}
],
"collections": [
{
"title": "XR Fragments",
"path": "http://localhost:3214/collections/z924drvlr4k1",
"caption": "3D assets which are XR Fragment-compatible.",
"description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .",
"links": []
}
],
"links": []
}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,13 @@
#!/bin/sh
test -z "$RUNTESTS" && exit 0 # nothing to do
echo ""
echo "[!] RUNTESTS=1 was set "
echo "[.] running tests in /test/*"
echo ""
find -L /test/* -type f -executable -maxdepth 1 | while read testscript; do
echo "[.] test: "$testscript
$testscript "$@" 2>&1 | awk '{ print " | "$0 }'
done

View file

@ -1,6 +1,5 @@
<div class="col mb-4">
<div class="card preview-card <%= (file === @model.preview_file) ? "border-primary" : "" %>">
<h2>FOO</h2>
<% if file.is_image? %>
<%= content_tag :div, nil, class: "card-img-top card-img-top-background", style: "background-image: url(#{model_model_file_path(@model, file, format: file.extension)})" %>
<%= image_tag model_model_file_path(@model, file, format: file.extension), class: "card-img-top image-preview", alt: file.name %>