{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://doc.dezrann.net/schemas/piece.schema.json",
  "title": "Dezrann Piece",
  "description": "Schema for a single Dezrann piece",
  "type": "object",
  "required": ["opus", "sources"],
  "properties": {
    "opus": {
      "type": "object",
      "required": ["id", "title"],
      "properties": {
        "id": {"type": "string", "description": "Unique piece identifier"},
        "title": {"type": "string", "description": "Piece title"},
        "piece:title": {"type": "string"},
        "nickname": {"type": "string"},
        "piece:nickname": {"type": "string"},
        "corpus": {"type": "string", "description": "Corpus name"},
        "collection": {"type": "string", "description": "Collection name"},
        "opus": {"type": "string", "description": "Catalogue or opus number"},
     
        "genre": {"type": "string", "description": "Musical genre"},
        "key": {"type": "string", "description": "Musical key"},
        "meter": {"type": "string", "description": "Time signature"},
        "movement:num": {"type": ["string", "integer"]},
        "movement:title": {"type": "string"}
      },
      "allOf": [{"$ref": "https://doc.dezrann.net/schemas/metadata.schema.json"}],
      "patternProperties": {
        "^(title|nickname):[a-z]{2}(-[A-Z]{2})?$": {"type": "string", "description": "Localized title/nickname"}
      }
    },
    "sources": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "oneOf": [
          {"required": ["score"]},
          {"required": ["tab"]},
          {"required": ["audio"]},
          {"required": ["video"]},
          {"required": ["audio:yt"]},
          {"required": ["video:yt"]},
          {"required": ["images"]},
          {"required": ["analysis"]},
          {"required": ["lyrics"]},
          {"required": ["score:neuma"]},
          {"required": ["score:gallica"]}
        ],
        "properties": {
          "id": {"type": "string", "description": "Source identifier"},
          "name": {"type": "string", "description": "Short name (< 40 characters)"},
          "ref-source": {"type": "string", "description": "Reference to another source by ID"},
     
          "score": {"type": "string", "format": "uri"},
          "score:neuma": {"type": "string"},
          "score:gallica": {"type": "string"},
          "measure-map": {"type": "string", "format": "uri"},
          "tab": {"type": "string", "format": "uri"},
          "audio": {"type": "string", "format": "uri"},
          "audio:yt": {"type": "string"},
          "video": {"type": "string", "format": "uri"},
          "video:yt": {"type": "string"},
          "images": {"type": "array", "items": {"type": "string", "format": "uri"}},
          "positions": {"type": "string", "format": "uri"},
          "analysis": {"type": "string", "format": "uri"},
          "lyrics": {"type": "string", "format": "uri"},
          "synchro": {"type": "string", "format": "uri", "description": "Synchronization file URL"}
        },
        "allOf": [{"$ref": "https://doc.dezrann.net/schemas/metadata.schema.json"}]
      }
    },
    "settings": {"type": "object", "additionalProperties": true}
  },
  "patternProperties": {
    "^quality:": {"type": ["string", "integer"], "description": "Quality information"}
  },
  "allOf": [{"$ref": "https://doc.dezrann.net/schemas/metadata.schema.json"}],
  "additionalProperties": true
}
