Files
libretro/schemas/site-api-envelope.schema.json
T
Abdessamad Derraz 33041b6bd1 feat: find a file by any hash, out of the search
Hashes, link lists, install commands, member tables and long reference
tables leave the site search: the index drops from 21.0 MB (4.88 MB
gzip) to 6.8 MB (1.33 MB gzip). Names and prose stay searchable.

files/?hash= takes a SHA1, MD5, CRC32 or SHA256 and reads one shard of
api/v1/lookup/ (about 22 KB gzip, was 675 KB) listing the collection
card, the platforms that declare the value and the profiles that check
it. files/?sha1= still opens the card, and a sha1- anchor missing from
a page is looked up there, so a card can move between pages.

Excluded blocks are section elements: the search plugin compares
elements by tag, so a div ended at the first nested div.
2026-10-22 12:46:40 +02:00

399 lines
9.3 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/Abdess/retrobios/schemas/site-api-envelope.schema.json",
"title": "RetroBIOS static API v1 envelope",
"type": "object",
"additionalProperties": false,
"required": [
"schema_version",
"generated_at",
"kind",
"count",
"items"
],
"properties": {
"schema_version": {
"const": 1
},
"generated_at": {
"type": "string",
"format": "date-time"
},
"kind": {
"type": "string",
"enum": [
"catalog",
"platforms",
"emulators",
"systems",
"verification-and-coverage-gaps",
"file-locations",
"file-lookup"
]
},
"count": {
"type": "integer",
"minimum": 0
},
"items": {
"type": "array",
"items": {
"type": "object"
}
}
},
"description": "Every endpoint shares this envelope. Within v1 an item keeps the fields listed for its kind and their types: fields may be added, never renamed or removed. A breaking change takes a new prefix.",
"allOf": [
{
"if": {
"properties": {
"kind": {
"const": "catalog"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"bytes",
"media_type",
"sha256",
"title",
"url"
],
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"media_type": {
"type": "string"
},
"bytes": {
"type": "integer",
"minimum": 0
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "emulators"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"id",
"profile"
],
"properties": {
"id": {
"type": "string"
},
"profile": {
"type": "object"
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "platforms"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"contract",
"coverage",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"contract": {
"type": "object"
},
"coverage": {
"type": "object"
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "verification-and-coverage-gaps"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"destination",
"discrepancy",
"emulator",
"expected",
"in_repo",
"layer",
"name",
"platform",
"platform_id",
"reason",
"required",
"status",
"system"
],
"properties": {
"name": {
"type": "string"
},
"platform": {
"type": "string"
},
"platform_id": {
"type": "string"
},
"system": {
"type": "string"
},
"emulator": {
"type": "string"
},
"destination": {
"type": "string"
},
"status": {
"type": "string"
},
"layer": {
"type": "string"
},
"reason": {
"type": "string"
},
"expected": {
"type": "string"
},
"discrepancy": {
"type": "string"
},
"required": {
"type": "boolean"
},
"in_repo": {
"type": [
"boolean",
"string"
]
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "file-locations"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"sha1",
"url"
],
"properties": {
"sha1": {
"type": "string",
"pattern": "^[0-9a-f]{40}$"
},
"url": {
"type": "string"
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "systems"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"consoles",
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"consoles": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"path",
"sha1"
],
"properties": {
"name": {
"type": "string"
},
"path": {
"type": "string"
},
"size": {
"type": "integer",
"minimum": 0
},
"sha1": {
"type": "string",
"pattern": "^[0-9a-f]{40}$"
},
"md5": {
"type": "string"
},
"sha256": {
"type": "string"
},
"crc32": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
},
{
"if": {
"properties": {
"kind": {
"const": "file-lookup"
}
}
},
"then": {
"properties": {
"items": {
"items": {
"type": "object",
"required": [
"value",
"algorithm",
"layer",
"name",
"url"
],
"properties": {
"value": {
"type": "string",
"pattern": "^[0-9a-f]+$"
},
"algorithm": {
"enum": [
"sha1",
"md5",
"crc32",
"sha256"
]
},
"layer": {
"enum": [
"collection",
"data-directory",
"platform",
"emulator"
]
},
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"sha1": {
"type": "string",
"pattern": "^[0-9a-f]{40}$"
},
"owner": {
"type": "string"
}
}
}
}
}
}
}
]
}