The curator app (Python backend, tests, systemd units, config, scripts) now lives in this repo under scenarios/curator/backend, exported from the standalone checkout's tracked tree (.pi mirror, venv and caches excluded). 149 unit tests pass from the new location; _SHARED_LIB and eval GOLDEN_DIR resolve unchanged. History not preserved per decision. verify-no-secrets: the ASSIGN heuristic now requires the value to carry entropy (a digit or uppercase letter), so vendored Python kwargs like token=extraction_token no longer false-positive while real base64/hex/random secrets still trip it.
131 lines
3.2 KiB
JSON
131 lines
3.2 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://curator.local/schemas/fact_pack.json",
|
|
"title": "fact_pack",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"library": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"matches": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"instance": {
|
|
"type": "string",
|
|
"description": "Which catalog instance, e.g. sonarr-4k."
|
|
},
|
|
"quality": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"maxLength": 300
|
|
},
|
|
"year": {
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
],
|
|
"minimum": 1000,
|
|
"maximum": 2999,
|
|
"description": "Four-digit year, or null when not known. Never a guess."
|
|
},
|
|
"has_file": {
|
|
"type": "boolean",
|
|
"description": "A file exists. Tracking alone is not ownership."
|
|
},
|
|
"has_file_basis": {
|
|
"type": "string",
|
|
"description": "What has_file was derived from."
|
|
},
|
|
"episode_count": {
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
]
|
|
},
|
|
"episode_file_count": {
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
]
|
|
},
|
|
"monitored": {
|
|
"type": [
|
|
"boolean",
|
|
"null"
|
|
]
|
|
},
|
|
"file_qualities": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"catalogs_checked": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Catalogs that actually answered."
|
|
},
|
|
"catalogs_unavailable": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"catalog": {
|
|
"type": "string"
|
|
},
|
|
"state": {
|
|
"type": "string",
|
|
"enum": [
|
|
"ok",
|
|
"not_configured",
|
|
"failed"
|
|
]
|
|
},
|
|
"error": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"errors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"online": {
|
|
"type": "object"
|
|
},
|
|
"counts": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"action_result": {
|
|
"type": [
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"retry": {
|
|
"type": "object"
|
|
}
|
|
}
|
|
}
|