{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://doc2.pstreamer.tv/schema/2.0.1.258/pss.schema.json",
  "title": "Perfect Streamer configuration file (pss.json)",
  "description": "Validates the on-disk configuration file of Perfect Streamer. Every member is optional: the file stores only the settings that differ from the built-in defaults, so an absent member is not an omission. Checked against the product version named in x-pss-version; validating against a different version gives confident wrong answers.",
  "x-pss-version": "2.0.1.258",
  "type": "object",
  "properties": {
    "server": {
      "$ref": "#/$defs/node_server"
    },
    "cluster": {
      "$ref": "#/$defs/node_cluster"
    },
    "user-default": {
      "$ref": "#/$defs/node_user_default"
    },
    "user": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_user"
      }
    },
    "web-server": {
      "$ref": "#/$defs/node_web_server"
    },
    "http-server": {
      "$ref": "#/$defs/node_http_server"
    },
    "epg-server": {
      "$ref": "#/$defs/node_epg_server"
    },
    "cs": {
      "$ref": "#/$defs/node_cs"
    },
    "mosaic": {
      "$ref": "#/$defs/node_mosaic"
    },
    "epg": {
      "$ref": "#/$defs/node_epg"
    },
    "alerter": {
      "$ref": "#/$defs/node_alerter"
    },
    "acme": {
      "$ref": "#/$defs/node_acme"
    },
    "dvb-adapter": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_dvb_adapter"
      }
    },
    "dvr-storage-list": {
      "$ref": "#/$defs/node_dvr_storage_list"
    },
    "stream": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_stream"
      }
    },
    "stream-adaptive": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_stream_adaptive"
      }
    }
  },
  "additionalProperties": false,
  "$defs": {
    "input_demuxer": {
      "properties": {
        "mpts-id": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "description": "Identifier of the multi-programme source to extract from. Required."
        },
        "src": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1
          ],
          "description": "0 = another stream, 1 = a tuner adapter"
        },
        "pnr": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "maximum": 16777215,
          "description": "Programme number to extract. Values above 65535 address a programme inside an encapsulated inner carrier."
        }
      }
    },
    "input_dvb": {
      "properties": {
        "adapter-id": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "description": "Identifier of the tuner adapter record to bind. Required."
        }
      }
    },
    "input_file": {
      "properties": {
        "file-path": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Absolute path, required."
        },
        "device": {
          "type": "boolean",
          "default": false,
          "description": "Treat the path as a device node rather than a regular file."
        }
      },
      "required": [
        "file-path"
      ]
    },
    "input_hls": {
      "properties": {
        "uri": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Playlist or stream URL, required."
        },
        "login": {
          "type": "string",
          "default": ""
        },
        "password": {
          "type": "string",
          "default": ""
        },
        "adaptive-stream-id": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "description": "Which rendition of a multi-bitrate playlist to pull, counted from 1."
        },
        "preload": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "maximum": 10,
          "description": "Number of segments fetched ahead of playback."
        },
        "cookies": {
          "type": "string",
          "default": ""
        },
        "user-agent": {
          "type": "string",
          "default": ""
        },
        "client-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 1,
          "description": "Seconds."
        },
        "mode": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = detect automatically, 1 = segmented playlist, 2 = plain progressive HTTP transport stream"
        },
        "disable-url-encode": {
          "type": "boolean",
          "default": false,
          "description": "Send segment URLs exactly as published instead of percent-encoding them."
        },
        "trace": {
          "type": "boolean",
          "default": false,
          "description": "Verbose protocol logging."
        }
      },
      "required": [
        "uri"
      ]
    },
    "input_muxer": {
      "properties": {
        "mpegts-streamid": {
          "type": "integer",
          "default": 1,
          "minimum": 0,
          "maximum": 65535
        },
        "mpegts-nid": {
          "type": "integer",
          "default": 1,
          "minimum": 0,
          "maximum": 65535,
          "description": "Network identifier signalled in the multiplex."
        },
        "mpegts-net-name": {
          "type": "string",
          "default": "",
          "description": "Network name signalled in the multiplex."
        },
        "sdt-provider-name": {
          "type": "string",
          "default": "",
          "maxLength": 251,
          "description": "Service provider name signalled for every aggregated programme."
        },
        "mpegts-country-code": {
          "type": "string",
          "default": "",
          "maxLength": 3,
          "description": "Three-letter country code, upper case; empty = not signalled."
        },
        "mpegts-output-bitrate": {
          "type": "number",
          "default": 20000,
          "minimum": 0,
          "description": "Multiplex rate in kbit/s; 0 = no rate scheduling or constant-rate pacing."
        },
        "auto-pid": {
          "type": "boolean",
          "default": true,
          "description": "true = remap every aggregated programme into an automatic identifier range; false = keep the original source identifiers, leaving collision avoidance to the operator."
        }
      }
    },
    "input_pipe": {
      "properties": {
        "file-name": {
          "type": "string",
          "default": "",
          "description": "Absolute path of an existing named pipe; empty = one is created automatically."
        }
      }
    },
    "input_prompeg": {
      "allOf": [
        {
          "$ref": "#/$defs/input_rtp"
        }
      ],
      "properties": {
        "prompeg-multiplexing": {
          "type": "boolean",
          "default": false,
          "description": "Carry all three channels on a single port. Non-standard."
        },
        "prompeg-header-xor": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "maximum": 255,
          "description": "Obfuscation constant applied to the forward-error-correction header; 0 = standard interoperability. Both endpoints must match."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Non-standard payload encryption; empty = none. Accepted length is 10 to 64 characters."
        }
      }
    },
    "input_ps1": {
      "properties": {
        "address": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Source host, required."
        },
        "port": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "maximum": 65535
        },
        "ps1-client-login": {
          "type": "string",
          "default": ""
        },
        "ps1-client-password": {
          "type": "string",
          "default": ""
        },
        "ps1-client-start-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 5,
          "maximum": 3600,
          "description": "Seconds."
        },
        "ps1-client-play-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 5,
          "maximum": 3600,
          "description": "Seconds."
        },
        "ps1-client-rtt-ms": {
          "type": "integer",
          "default": 300,
          "minimum": 40,
          "maximum": 10000,
          "description": "Milliseconds. Initial round-trip estimate only; the real value is measured and adapted while running."
        },
        "ps1-client-latency-ms": {
          "type": "integer",
          "default": 3000,
          "minimum": 250,
          "maximum": 10000,
          "description": "Milliseconds of receiver de-jitter and retransmission window. Keep at least four times the path round-trip time."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Payload encryption; empty = none. Accepted length is 10 to 64 characters."
        },
        "check-lost": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 99,
          "description": "Percent of packets deliberately dropped to simulate loss. Diagnostics only; leave at 0 in production."
        },
        "peer-auth": {
          "type": "boolean",
          "default": false,
          "description": "Authenticate to a cluster peer in the same domain with automatic credentials instead of a manual login."
        }
      },
      "required": [
        "address"
      ]
    },
    "input_rist": {
      "properties": {
        "rist-profile": {
          "type": "integer",
          "default": 1,
          "enum": [
            0,
            1
          ],
          "description": "0 = simple, 1 = main"
        },
        "allow-conn-ip": {
          "type": "string",
          "default": "",
          "description": "Accept only this remote IP address; empty = accept any."
        },
        "rist-addr-address": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "One entry per peer; required for multicast, ignored for unicast."
        },
        "rist-addr-port": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "description": "One entry per peer, same length as the other peer arrays."
        },
        "rist-addr-intf": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "One entry per peer; required for unicast, ignored for multicast."
        },
        "rist-addr-weight": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0
          },
          "description": "Load-balancing weight per peer; 0 = duplicate to every peer."
        },
        "rist-session-timeout": {
          "type": "integer",
          "default": 2000,
          "minimum": 100,
          "description": "Milliseconds."
        },
        "rist-recovery-rtt-min": {
          "type": "integer",
          "default": 50,
          "minimum": 10,
          "description": "Milliseconds."
        },
        "rist-recovery-rtt-max": {
          "type": "integer",
          "default": 500,
          "minimum": 10,
          "description": "Milliseconds."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Payload encryption; empty = none. Anything past 127 bytes is dropped, and both endpoints must match."
        },
        "trace": {
          "type": "boolean",
          "default": false,
          "description": "Verbose protocol logging."
        }
      }
    },
    "input_rtmp": {
      "properties": {
        "url": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Origin URL to pull from, required. Plain or TLS."
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Interface name or local IP address for the outgoing connection; empty = chosen automatically."
        },
        "client-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 1,
          "maximum": 120,
          "description": "Seconds."
        },
        "tls-verify": {
          "type": "boolean",
          "default": false,
          "description": "Verify the origin certificate on a TLS connection."
        },
        "trace": {
          "type": "boolean",
          "default": false,
          "description": "Verbose protocol logging."
        }
      },
      "required": [
        "url"
      ]
    },
    "input_rtp": {
      "allOf": [
        {
          "$ref": "#/$defs/input_udp"
        }
      ],
      "properties": {
        "rtp-reorder": {
          "type": "boolean",
          "default": false,
          "description": "Reorder packets through a jitter buffer."
        }
      }
    },
    "input_rtsp": {
      "properties": {
        "uri": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Source URL, required."
        },
        "cookies": {
          "type": "string",
          "default": ""
        },
        "user-agent": {
          "type": "string",
          "default": ""
        },
        "rtsp-login": {
          "type": "string",
          "default": ""
        },
        "rtsp-password": {
          "type": "string",
          "default": ""
        },
        "transport": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = UDP, 1 = TCP, 2 = tunnelled over HTTP"
        },
        "client-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 1,
          "description": "Seconds."
        },
        "trace": {
          "type": "boolean",
          "default": false,
          "description": "Verbose protocol logging."
        }
      },
      "required": [
        "uri"
      ]
    },
    "input_srt": {
      "properties": {
        "listen-mode": {
          "type": "boolean",
          "default": false,
          "description": "Wait for an incoming connection instead of dialling out."
        },
        "address": {
          "type": "string",
          "default": "",
          "description": "Source host when dialling out; permitted remote host when listening."
        },
        "port": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "maximum": 65535
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Interface name or local IP address; empty = chosen automatically."
        },
        "srt-client-login": {
          "type": "string",
          "default": "",
          "description": "When listening, this is the expected stream identifier."
        },
        "srt-client-password": {
          "type": "string",
          "default": "",
          "description": "Ignored when listening."
        },
        "peer-auth": {
          "type": "boolean",
          "default": false,
          "description": "Dial-out only: derive the stream identifier from the cluster domain to authenticate to a peer in the same domain."
        },
        "srt-client-latency-ms": {
          "type": "integer",
          "default": 1000,
          "minimum": 120,
          "description": "Milliseconds."
        },
        "srt-client-reorder": {
          "type": "integer",
          "default": 0,
          "description": "Maximum packet reordering tolerated before a loss is declared; 0 = none."
        },
        "srt-client-overhead-pc": {
          "type": "integer",
          "default": 25,
          "minimum": 5,
          "maximum": 100,
          "description": "Percent of the payload rate reserved for retransmissions."
        },
        "srt-client-maxbw-Bs": {
          "type": "integer",
          "default": 0,
          "minimum": -1,
          "description": "Bandwidth ceiling in bytes per second; 0 = automatic."
        },
        "srt-client-timeout-ms": {
          "type": "integer",
          "default": 3000,
          "minimum": 0,
          "description": "Connection timeout in milliseconds."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Payload encryption; empty = none. Accepted length is 10 to 79 bytes and both endpoints must match."
        },
        "aes-type": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = AES-128, 1 = AES-192, 2 = AES-256. Used only when a passphrase is set."
        },
        "disable-tsbpd": {
          "type": "boolean",
          "default": false,
          "description": "Turn off timestamp-based packet delivery."
        }
      }
    },
    "input_std": {
      "properties": {
        "std-cmd": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Absolute path of a program that writes a transport stream to its standard output. Required."
        },
        "std-args": {
          "type": "string",
          "default": "",
          "description": "Argument line, split like a shell command: quotes and backslash escapes are honoured."
        },
        "std-environment-name": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Environment variable names; same length as the matching value array."
        },
        "std-environment-value": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Environment variable values; same length as the matching name array."
        }
      },
      "required": [
        "std-cmd"
      ]
    },
    "input_tcp": {
      "properties": {
        "address": {
          "type": "string",
          "default": "",
          "description": "Remote host to connect to."
        },
        "port": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "maximum": 65534
        },
        "client-timeout": {
          "type": "integer",
          "default": 10,
          "minimum": 1,
          "description": "Seconds."
        }
      }
    },
    "input_test_stream": {
      "properties": {
        "bitrate": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Total transport rate in kbit/s, padded with stuffing; 0 = no padding."
        },
        "video-enc": {
          "type": "integer",
          "default": 1,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = MPEG-2, 1 = H.264, 2 = HEVC"
        },
        "video-bitrate": {
          "type": "integer",
          "default": 3000,
          "minimum": 100,
          "description": "kbit/s."
        },
        "width": {
          "type": "integer",
          "default": 1920,
          "minimum": 64,
          "description": "Pixels."
        },
        "height": {
          "type": "integer",
          "default": 1080,
          "minimum": 64,
          "description": "Pixels."
        },
        "width-par": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "description": "Horizontal term of the pixel aspect ratio."
        },
        "height-par": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "description": "Vertical term of the pixel aspect ratio."
        },
        "frame-rate": {
          "type": "integer",
          "default": 25,
          "minimum": 1,
          "description": "Frames per second."
        },
        "gop-interval": {
          "type": "integer",
          "default": 25,
          "minimum": 1,
          "description": "Frames between key frames."
        },
        "video-pattern": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "maximum": 25,
          "description": "Selects one of the built-in test patterns."
        },
        "audio-enc": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1
          ],
          "description": "0 = MPEG-1 Layer II, 1 = AAC"
        },
        "audio-wave": {
          "type": "integer",
          "default": 8,
          "minimum": 0,
          "maximum": 12,
          "description": "Selects one of the built-in test waveforms; 8 = ticks."
        },
        "audio-freq": {
          "type": "number",
          "default": 440,
          "minimum": 1,
          "description": "Hertz."
        },
        "audio-volume": {
          "type": "number",
          "default": 0.8,
          "minimum": 0,
          "maximum": 1,
          "description": "Linear gain, 0 = silent, 1 = full scale."
        },
        "enable-overlay": {
          "type": "boolean",
          "default": true,
          "description": "Burn the text and clock overlay into the picture."
        },
        "text-overlay": {
          "type": "string",
          "default": ""
        },
        "time-format": {
          "type": "string",
          "default": "",
          "description": "Clock format string; empty = hours:minutes:seconds."
        },
        "pnr": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "maximum": 65535,
          "description": "Programme number."
        },
        "pmt-pid": {
          "type": "integer",
          "default": 32,
          "minimum": 32,
          "maximum": 8190
        },
        "video-pid": {
          "type": "integer",
          "default": 33,
          "minimum": 32,
          "maximum": 8190
        },
        "audio-pid": {
          "type": "integer",
          "default": 34,
          "minimum": 32,
          "maximum": 8190
        }
      }
    },
    "input_transcoder": {
      "properties": {
        "decoder-id": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "description": "Identifier of the decoder to attach to. Required."
        },
        "enc-type": {
          "type": "integer",
          "default": 1,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = MPEG-2, 1 = H.264, 2 = HEVC"
        },
        "enc-video-profile": {
          "type": "integer",
          "default": 1,
          "enum": [
            0,
            1
          ],
          "description": "0 = Main, 1 = High. H.264 only."
        },
        "enc-bitrate": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Total multiplex rate in kbit/s, padded with stuffing; 0 = no padding."
        },
        "enc-video-bitrate": {
          "type": "integer",
          "default": 5000,
          "minimum": 100,
          "description": "kbit/s."
        },
        "enc-speed-preset": {
          "type": "integer",
          "default": 4,
          "minimum": 1,
          "maximum": 7,
          "description": "1 = slowest and best quality, 7 = fastest."
        },
        "enc-gop-interval": {
          "type": "integer",
          "default": 25,
          "minimum": 1,
          "description": "Frames between key frames."
        },
        "enc-bframe": {
          "type": "integer",
          "default": -1,
          "minimum": -1,
          "maximum": 8,
          "description": "-1 = encoder default, 0 = disabled."
        },
        "enc-lookahead": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Frames of look-ahead; 0 = disabled."
        },
        "enc-deinterlace": {
          "type": "boolean",
          "default": true
        },
        "enc-resize": {
          "type": "string",
          "default": "",
          "description": "Size preset: \"2\" or \"4\" to divide by that factor, or \"sd\", \"sd-pal\", \"sd-ntsc\", \"SD->HD\". Empty, \"0\" and \"1\" mean no preset. A preset overrides the explicit width and height."
        },
        "enc-height": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Output height in pixels; 0 = keep the source size."
        },
        "enc-width": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Output width in pixels; 0 = keep the source size."
        },
        "enc-aud-bitrate": {
          "type": "integer",
          "default": 128,
          "minimum": 1,
          "description": "kbit/s."
        },
        "enc-aud-rule-mpeg": {
          "type": "string",
          "default": "mpeg",
          "enum": [
            "",
            "skip",
            "mpeg",
            "aac",
            "ac3"
          ],
          "description": "What to do with an MPEG audio track: \"\" or \"skip\" = drop it, otherwise the target codec."
        },
        "enc-aud-rule-aac": {
          "type": "string",
          "default": "aac",
          "enum": [
            "",
            "skip",
            "mpeg",
            "aac",
            "ac3"
          ],
          "description": "What to do with an AAC audio track: \"\" or \"skip\" = drop it, otherwise the target codec."
        },
        "enc-aud-rule-ac3": {
          "type": "string",
          "default": "ac3",
          "enum": [
            "",
            "skip",
            "mpeg",
            "aac",
            "ac3"
          ],
          "description": "What to do with an AC-3 audio track: \"\" or \"skip\" = drop it, otherwise the target codec."
        },
        "enc-aud-volume-51": {
          "type": "number",
          "default": 1.6,
          "minimum": 0,
          "description": "Gain factor applied when downmixing 5.1 audio to stereo."
        },
        "enc-pmt-pid": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "maximum": 8190,
          "description": "0 = keep the source value; otherwise 32 to 8190."
        },
        "enc-opt": {
          "type": "string",
          "default": "",
          "description": "Extra encoder options as \"key1=value1:key2=value2\"."
        },
        "patpmt-interval": {
          "type": "integer",
          "default": 9000,
          "minimum": 1,
          "description": "Programme table repetition interval in 90 kHz ticks."
        },
        "framerate-resample": {
          "type": "integer",
          "default": 0,
          "enum": [
            0,
            1,
            2
          ],
          "description": "0 = keep the source rate, 1 = halve it, 2 = quarter it"
        }
      }
    },
    "input_udp": {
      "properties": {
        "address": {
          "type": "string",
          "default": "",
          "description": "Multicast group to join; ignored for unicast reception."
        },
        "mcast-rejoin-interval": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Seconds between periodic multicast re-joins; 0 = never re-join."
        },
        "port": {
          "type": "integer",
          "default": 0,
          "minimum": 1,
          "maximum": 65534
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Interface name or local IP address; empty = chosen automatically."
        },
        "ssm-address": {
          "type": "string",
          "default": "",
          "description": "Source address for source-specific multicast; empty = any source."
        },
        "socket-buffer-size": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Requested receive buffer size in bytes; 0 = keep the system default. The operating system may grant less."
        }
      }
    },
    "item_cs_server": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "password": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Shared secret passed to the billing server"
        },
        "url": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Base HTTP address of the billing server"
        },
        "timeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30,
          "default": 10,
          "description": "Request timeout in seconds"
        },
        "billing-sess-accounting": {
          "type": "boolean",
          "default": true,
          "description": "Send session start/interim/stop accounting notifications"
        },
        "login-prefix": {
          "type": "string",
          "default": "",
          "description": "Only logins starting with this text are sent to this server"
        },
        "login-suffix": {
          "type": "string",
          "default": "",
          "description": "Only logins ending with this text are sent to this server"
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "order": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Query order; lower is tried first"
        },
        "connector": {
          "type": "string",
          "enum": [
            "",
            "universal"
          ],
          "default": "universal",
          "description": "Empty is treated as universal; any other value disables the server"
        },
        "request-query": {
          "type": "string",
          "default": "",
          "description": "URL query template; empty uses the built-in template"
        },
        "request-body": {
          "type": "string",
          "default": "",
          "description": "Request body template; empty sends a GET, otherwise a POST"
        },
        "request-content-type": {
          "type": "string",
          "default": "",
          "description": "Empty detects the type from the body template"
        },
        "request-header": {
          "type": "string",
          "default": "",
          "description": "Extra request headers, one \"Name: value\" per line"
        },
        "response-format": {
          "type": "string",
          "enum": [
            "",
            "status",
            "json",
            "xml"
          ],
          "default": "status",
          "description": "How the answer is judged: status = by HTTP code (also the meaning of empty), json = by a field value, xml = by a root attribute"
        },
        "response-ok-path": {
          "type": "string",
          "default": "",
          "description": "Field path (json) or root attribute (xml) holding the verdict; empty uses allowed / code"
        },
        "response-ok-value": {
          "type": "string",
          "default": "",
          "description": "Value of that field meaning access granted; empty uses true / 200"
        },
        "response-reason-path": {
          "type": "string",
          "default": "",
          "description": "Field path holding the rejection reason; empty uses reason"
        }
      },
      "required": [
        "id",
        "name",
        "password",
        "url"
      ],
      "additionalProperties": false
    },
    "item_dvb_adapter": {
      "type": "object",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "mode": {
          "type": "integer",
          "enum": [
            0,
            1,
            2
          ],
          "default": 0,
          "description": "0 = stream, 1 = scanner, 2 = frontend monitor"
        },
        "type": {
          "type": "integer",
          "enum": [
            1,
            2,
            3,
            5,
            6,
            16,
            18
          ],
          "default": 0,
          "description": "Delivery system: 1 = DVB-C Annex A, 2 = DVB-C Annex B, 3 = DVB-T, 5 = DVB-S, 6 = DVB-S2, 16 = DVB-T2, 18 = DVB-C Annex C"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "pause": {
          "type": "boolean",
          "default": true
        },
        "adapter": {
          "type": "integer",
          "minimum": 0,
          "default": -1,
          "description": "Index of the DVB adapter device; -1 = not assigned"
        },
        "device": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Frontend index inside the adapter"
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "mpegts-trace": {
          "type": "boolean",
          "default": false
        },
        "enable-alert": {
          "type": "boolean",
          "default": true,
          "description": "false mutes every alert raised by this adapter"
        },
        "mpegts-filter-ca-clear": {
          "type": "boolean",
          "default": false,
          "description": "Strip conditional-access PIDs and descriptors from programmes confirmed unscrambled"
        },
        "note": {
          "type": "string",
          "default": ""
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "mode": {
                "const": 0
              }
            }
          },
          "then": {
            "properties": {
              "freq": {
                "type": "integer",
                "minimum": 1,
                "default": 0,
                "description": "Tuning frequency: MHz for satellite, kHz for terrestrial and cable"
              },
              "buffer-size": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65535,
                "default": 512,
                "description": "Kernel demux ring buffer, in blocks of 64 KB; 0 = driver default"
              },
              "epg-export": {
                "type": "boolean",
                "default": false
              },
              "spectral-inversion": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2
                ],
                "default": 2,
                "description": "0 = off, 1 = on, 2 = auto"
              },
              "modulation": {
                "type": "integer",
                "enum": [
                  -1,
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12,
                  13
                ],
                "default": -1,
                "description": "-1 = not set, 0 = QPSK, 1 = 16-QAM, 2 = 32-QAM, 3 = 64-QAM, 4 = 128-QAM, 5 = 256-QAM, 6 = auto, 7 = 8-VSB, 8 = 16-VSB, 9 = 8-PSK, 10 = 16-APSK, 11 = 32-APSK, 12 = DQPSK, 13 = 4-QAM-NR"
              },
              "cam-pnr": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Programme numbers the CI/CAM module is asked to descramble; empty = none"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "const": 1
              }
            },
            "required": [
              "mode"
            ]
          },
          "then": {
            "properties": {
              "buffer-size": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65535,
                "default": 512,
                "description": "Kernel demux ring buffer, in blocks of 64 KB; 0 = driver default"
              },
              "epg-export": {
                "type": "boolean",
                "default": false
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "const": 2
              }
            },
            "required": [
              "mode"
            ]
          },
          "then": {
            "properties": {
              "freq": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "Monitored frequency: MHz for satellite, kHz for terrestrial and cable; 0 = read back from the tuned frontend"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "const": 0
              },
              "type": {
                "enum": [
                  5,
                  6
                ]
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "symbol-rate": {
                "type": "integer",
                "minimum": 1,
                "default": 0,
                "description": "Symbol rate in ksym/s"
              },
              "fec": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12
                ],
                "default": 9,
                "description": "Inner code rate: 0 = none, 1 = 1/2, 2 = 2/3, 3 = 3/4, 4 = 4/5, 5 = 5/6, 6 = 6/7, 7 = 7/8, 8 = 8/9, 9 = auto, 10 = 3/5, 11 = 9/10, 12 = 2/5"
              },
              "dvb-stream-id": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "Multistream input stream identifier; 0 = not set"
              },
              "biss-pnr": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Descrambling targets: positive = service programme number, -(n+1) = inner T2-MI carrier with PLP id n"
              },
              "biss-key": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                },
                "description": "Hex key per target, same length as the target list: 12 digits = BISS-1, 16 digits = BISS-E"
              },
              "t2mi-mode": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2
                ],
                "default": 0,
                "description": "T2-MI decapsulation: 0 = disabled, 1 = manual, 2 = automatic"
              },
              "t2mi-pid": {
                "type": "integer",
                "minimum": 0,
                "maximum": 8191,
                "default": 0,
                "description": "Pre-created T2-MI carrier PID; 0 = discover from the tables only"
              },
              "t2mi-plp": {
                "type": "integer",
                "minimum": 0,
                "maximum": 255,
                "default": 0,
                "description": "Physical layer pipe extracted from every T2-MI carrier"
              },
              "t2mi-tsid": {
                "type": "integer",
                "minimum": -1,
                "maximum": 255,
                "default": -1,
                "description": "Reserved, currently ignored; -1 = any"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "const": 0
              },
              "type": {
                "enum": [
                  3,
                  16
                ]
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "bandwidth": {
                "type": "integer",
                "minimum": 6000,
                "maximum": 8000,
                "default": 8000,
                "description": "Channel bandwidth in kHz"
              },
              "dvb-stream-id": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "Multistream input stream identifier; 0 = not set"
              },
              "transmission-mode": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7,
                  8
                ],
                "default": 2,
                "description": "0 = 2K, 1 = 8K, 2 = auto, 3 = 4K, 4 = 1K, 5 = 16K, 6 = 32K, 7 = C1, 8 = C3780"
              },
              "guard-interval": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10
                ],
                "default": 4,
                "description": "0 = 1/32, 1 = 1/16, 2 = 1/8, 3 = 1/4, 4 = auto, 5 = 1/128, 6 = 19/128, 7 = 19/256, 8 = PN420, 9 = PN595, 10 = PN945"
              },
              "hierarchy-information": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4
                ],
                "default": 4,
                "description": "0 = none, 1 = alpha 1, 2 = alpha 2, 3 = alpha 4, 4 = auto"
              },
              "biss-pnr": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Descrambling targets: positive = service programme number, -(n+1) = inner T2-MI carrier with PLP id n"
              },
              "biss-key": {
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                },
                "description": "Hex key per target, same length as the target list: 12 digits = BISS-1, 16 digits = BISS-E"
              },
              "t2mi-mode": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2
                ],
                "default": 0,
                "description": "T2-MI decapsulation: 0 = disabled, 1 = manual, 2 = automatic"
              },
              "t2mi-pid": {
                "type": "integer",
                "minimum": 0,
                "maximum": 8191,
                "default": 0,
                "description": "Pre-created T2-MI carrier PID; 0 = discover from the tables only"
              },
              "t2mi-plp": {
                "type": "integer",
                "minimum": 0,
                "maximum": 255,
                "default": 0,
                "description": "Physical layer pipe extracted from every T2-MI carrier"
              },
              "t2mi-tsid": {
                "type": "integer",
                "minimum": -1,
                "maximum": 255,
                "default": -1,
                "description": "Reserved, currently ignored; -1 = any"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "const": 0
              },
              "type": {
                "enum": [
                  1,
                  2,
                  18
                ]
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "symbol-rate": {
                "type": "integer",
                "minimum": 1,
                "default": 0,
                "description": "Symbol rate in ksym/s"
              },
              "fec": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6,
                  7,
                  8,
                  9,
                  10,
                  11,
                  12
                ],
                "default": 9,
                "description": "Inner code rate: 0 = none, 1 = 1/2, 2 = 2/3, 3 = 3/4, 4 = 4/5, 5 = 5/6, 6 = 6/7, 7 = 7/8, 8 = 8/9, 9 = auto, 10 = 3/5, 11 = 9/10, 12 = 2/5"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "mode": {
                "enum": [
                  0,
                  1
                ]
              },
              "type": {
                "enum": [
                  5,
                  6
                ]
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "properties": {
              "lnb-freq1": {
                "type": "integer",
                "minimum": 1,
                "default": 0,
                "description": "Low-band local-oscillator frequency in MHz"
              },
              "lnb-freq2": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "High-band local-oscillator frequency in MHz; 0 = single-band LNB"
              },
              "lnb-freq-range": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "Band switch-over frequency in MHz; 0 = never switch to the high band"
              },
              "lnb-sharing": {
                "type": "boolean",
                "default": false,
                "description": "Leave polarisation voltage and the 22 kHz tone untouched because the LNB is shared with other receivers"
              },
              "lnb-polarization": {
                "type": "integer",
                "enum": [
                  0,
                  1
                ],
                "default": -1,
                "description": "0 = horizontal (left), 1 = vertical (right)"
              },
              "lnb-force-tone": {
                "type": "boolean",
                "default": false,
                "description": "Force the 22 kHz tone on regardless of the selected band"
              },
              "lnb-diseqc": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3,
                  4
                ],
                "default": 0,
                "description": "0 = off, 1-4 = DiSEqC 1.0 committed switch port"
              }
            }
          }
        }
      ],
      "unevaluatedProperties": false
    },
    "item_dvr_storage": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "dir-path",
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "dir-path": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "max-usage": {
          "type": "number",
          "minimum": 1,
          "maximum": 100,
          "default": 90,
          "description": "Fill limit of this storage, percent"
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "cleanup-interval-sec": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3600,
          "default": 10,
          "description": "Cadence of the retention and size cleanup passes"
        },
        "disk-pressure-grace-sec": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3600,
          "default": 60,
          "description": "How long the fill limit must be exceeded before size cleanup starts"
        },
        "disk-pressure-cut-sec": {
          "type": "integer",
          "minimum": 1,
          "maximum": 86400,
          "default": 300,
          "description": "Per-stream upper bound, in seconds of content, that one cleanup pass may delete"
        },
        "disk-emergency-bytes": {
          "type": "integer",
          "minimum": 0,
          "default": 2147483648,
          "description": "Free-space floor in bytes; below it the storage goes to error state and stops writing, recovering at twice this value"
        },
        "alarm-disk-full-hysteresis": {
          "type": "number",
          "minimum": 0,
          "maximum": 50,
          "default": 2.0,
          "description": "Percentage points below the fill limit at which the disk-full alarm clears"
        }
      }
    },
    "item_epg_server_channel_set": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "note": {
          "type": "string",
          "default": ""
        }
      },
      "required": [
        "id",
        "name"
      ],
      "additionalProperties": false
    },
    "item_epg_server_login": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "login": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "password": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "channel-set": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Identifier of the channel set this account may download; 0 = none."
        },
        "pause": {
          "type": "boolean",
          "default": false,
          "description": "true disables the account."
        },
        "limit-day": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Account expiry, Unix time in seconds; 0 = no limit."
        },
        "limit-ip": {
          "type": "string",
          "default": "",
          "description": "Single IP address the account is restricted to; empty = any."
        },
        "note": {
          "type": "string",
          "default": ""
        }
      },
      "required": [
        "id",
        "login",
        "password"
      ],
      "additionalProperties": false
    },
    "item_epg_source": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "source": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "File path or HTTP address of the XMLTV data"
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "enable": {
          "type": "boolean",
          "default": false
        },
        "update-interval": {
          "type": "integer",
          "minimum": 1,
          "default": 3600,
          "description": "Seconds between source downloads"
        },
        "login": {
          "type": "string",
          "default": "",
          "description": "HTTP authentication user for the source"
        },
        "password": {
          "type": "string",
          "default": ""
        },
        "cookies": {
          "type": "string",
          "default": "",
          "description": "Cookie header sent with the download request"
        },
        "content-encoding": {
          "type": "integer",
          "enum": [
            0,
            1
          ],
          "default": 0,
          "description": "0 = detect automatically, 1 = always treat the download as GZip"
        },
        "save-file": {
          "type": "boolean",
          "default": false,
          "description": "Keep a copy of the downloaded file on disk"
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "trace": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "id",
        "name",
        "source"
      ],
      "additionalProperties": false
    },
    "item_stream": {
      "type": "object",
      "title": "Stream",
      "required": [
        "stream-name"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        },
        "mpts": {
          "type": "boolean",
          "default": false,
          "description": "Multiplex stream (several programmes in one transport stream); cannot be changed after the stream has been created."
        },
        "stream-name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "display-name": {
          "type": "string",
          "default": ""
        },
        "order": {
          "type": "integer",
          "default": 0,
          "description": "Sort position in stream lists."
        },
        "pause": {
          "type": "boolean",
          "default": true
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "mpegts-trace": {
          "type": "boolean",
          "default": false
        },
        "mpegts-tr101290": {
          "type": "boolean",
          "default": false
        },
        "enable-alert": {
          "type": "boolean",
          "default": true,
          "description": "Master switch for every alert of this stream and of its inputs and outputs."
        },
        "alert-delay": {
          "type": "integer",
          "minimum": 0,
          "maximum": 86400,
          "default": 0,
          "description": "Seconds a fault must persist before a flap-prone alert is raised; 0 = raise immediately."
        },
        "stream-timeout": {
          "type": "integer",
          "minimum": 1000000,
          "default": 30000000,
          "description": "Microseconds without data before the stream is considered dead and a backup input is tried."
        },
        "check-interval": {
          "type": "integer",
          "minimum": 10000000,
          "default": 60000000,
          "description": "Microseconds between repeated validity checks of the transport stream."
        },
        "fallback-check": {
          "type": "boolean",
          "default": true,
          "description": "While running on a backup input, keep re-testing the primary one."
        },
        "enable-mosaic": {
          "type": "boolean",
          "default": true,
          "description": "Show the stream in the mosaic. The default is false for multiplex streams."
        },
        "scrambled-channel": {
          "type": "boolean",
          "default": false,
          "description": "An encrypted stream is not reported as faulty."
        },
        "epg-export": {
          "type": "boolean",
          "default": false
        },
        "bitrate-mode": {
          "type": "integer",
          "enum": [
            0,
            1,
            2,
            3
          ],
          "default": 0,
          "description": "0 = original, 1 = variable (drop null packets), 2 = constant with automatic stuffing rate, 3 = constant at the configured stuffing rate"
        },
        "mpegts-bitrate": {
          "type": "number",
          "minimum": 0,
          "default": 0,
          "description": "Constant bitrate in kbps, used when the bitrate mode is 3; 0 = choose it automatically."
        },
        "tag": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "input": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_stream_input"
          }
        },
        "output": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_stream_output"
          }
        }
      },
      "allOf": [
        {
          "if": {
            "anyOf": [
              {
                "required": [
                  "mpts"
                ],
                "properties": {
                  "mpts": {
                    "const": false
                  }
                }
              },
              {
                "not": {
                  "required": [
                    "mpts"
                  ]
                }
              }
            ]
          },
          "then": {
            "properties": {
              "stream-type": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2
                ],
                "default": 0,
                "description": "0 = default, 1 = audio only, 2 = video only"
              },
              "ott-http": {
                "type": "integer",
                "enum": [
                  0,
                  1
                ],
                "default": 0,
                "description": "Plain HTTP delivery: 0 = off, 1 = live"
              },
              "ott-http-trace": {
                "type": "boolean",
                "default": false
              },
              "ott-hls": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3
                ],
                "default": 0,
                "description": "0 = off, 1 = peering, 2 = OTT (HLS), 3 = OTT with low-latency HLS and DASH"
              },
              "ott-stream-name": {
                "type": "string",
                "maxLength": 32,
                "default": "",
                "description": "Name used in the HTTP and HLS delivery URL."
              },
              "dvr-storage": {
                "type": "integer",
                "minimum": 0,
                "default": 0,
                "description": "Identifier of the DVR storage to record into; 0 = no recording."
              },
              "dvr-storage-hours": {
                "type": "integer",
                "minimum": 1,
                "maximum": 2160,
                "default": 1,
                "description": "Recording retention in hours."
              },
              "dvr-storage-min-hour": {
                "type": "integer",
                "minimum": 1,
                "default": 1,
                "description": "Hours of the most recent recording protected from clean-up under disk pressure."
              },
              "ott-webvtt": {
                "type": "boolean",
                "default": true,
                "description": "Convert teletext subtitles to WebVTT."
              },
              "ott-webvtt-trace": {
                "type": "boolean",
                "default": false
              },
              "ott-hls-trace": {
                "type": "boolean",
                "default": false
              },
              "gop-aligned-segment": {
                "type": "boolean",
                "default": true,
                "description": "Start every segment on a key frame."
              },
              "chunk-min-interval": {
                "type": "integer",
                "minimum": 5000000,
                "maximum": 30000000,
                "default": 5000000,
                "description": "Minimum segment duration in microseconds."
              },
              "chunk-max-interval": {
                "type": "integer",
                "minimum": 8000000,
                "maximum": 30000000,
                "default": 12000000,
                "description": "Maximum segment duration in microseconds; must be greater than the minimum."
              },
              "enable-ts-chunk": {
                "type": "boolean",
                "default": true,
                "description": "In DASH mode, additionally produce legacy MPEG-TS segments for HLS."
              },
              "part-target-duration-ms": {
                "type": "integer",
                "minimum": 100,
                "maximum": 5000,
                "default": 500,
                "description": "Target duration of a low-latency part in milliseconds."
              },
              "drm-mode": {
                "type": "integer",
                "enum": [
                  0,
                  1,
                  2,
                  3
                ],
                "default": 0,
                "description": "0 = off, 1 = AES-128 for HLS, 2 = CENC for CMAF/DASH, 3 = CBCS for CMAF/DASH"
              },
              "drm-key": {
                "type": "string",
                "maxLength": 32,
                "default": "",
                "description": "Content key, 32 hexadecimal characters."
              },
              "drm-key-delivery": {
                "type": "integer",
                "enum": [
                  0,
                  1
                ],
                "default": 0,
                "description": "0 = key served by this server, 1 = key served by an external URL"
              },
              "drm-key-url": {
                "type": "string",
                "maxLength": 512,
                "default": "",
                "description": "Key URI advertised to players when external key delivery is selected."
              },
              "drm-key-id": {
                "type": "string",
                "maxLength": 32,
                "default": "",
                "description": "Default key identifier, 32 hexadecimal characters; empty = derived from the stream."
              },
              "drm-key-source": {
                "type": "integer",
                "enum": [
                  0,
                  1
                ],
                "default": 0,
                "description": "0 = one static key, 1 = keys derived per time window from the secret (rotation)"
              },
              "drm-secret": {
                "type": "string",
                "maxLength": 256,
                "default": "",
                "description": "Secret used to derive rotating keys; at least 16 characters."
              },
              "drm-expires-min": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10080,
                "default": 60,
                "description": "Length of one key rotation window in minutes."
              },
              "sdt-service-name": {
                "type": "string",
                "maxLength": 251,
                "default": ""
              },
              "sdt-provider-name": {
                "type": "string",
                "maxLength": 251,
                "default": ""
              },
              "sdt-lang": {
                "type": "string",
                "default": "",
                "description": "ISO 639 language code."
              },
              "mpegts-nid": {
                "type": "integer",
                "minimum": 1,
                "maximum": 65535,
                "default": 1,
                "description": "Network identifier written into the transport stream."
              },
              "mpegts-change-pnr": {
                "type": "boolean",
                "default": false,
                "description": "Replace the programme number."
              },
              "mpegts-new-pnr": {
                "type": "integer",
                "minimum": 1,
                "maximum": 65535,
                "default": 1,
                "description": "Programme number to use when replacement is enabled."
              },
              "mpegts-filter-unnecessary": {
                "type": "boolean",
                "default": false,
                "description": "Remove data that the programme does not need."
              },
              "mpegts-filter-sdt": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-cat": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-nit": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-tdt": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-epg": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-teletext": {
                "type": "boolean",
                "default": false
              },
              "mpegts-filter-subtitles": {
                "type": "boolean",
                "default": false
              },
              "enable-autopid": {
                "type": "boolean",
                "default": false,
                "description": "Renumber the whole programme into a window of 64 consecutive PIDs."
              },
              "autopid-base": {
                "type": "integer",
                "minimum": 32,
                "maximum": 8127,
                "default": 32,
                "description": "First PID of the automatic 64-PID window."
              },
              "analize-ptsgap": {
                "type": "boolean",
                "default": false,
                "description": "Measure the PTS/DTS to PCR gap of every elementary stream."
              },
              "deep-analysis": {
                "type": "boolean",
                "default": false,
                "description": "Continuous deep parsing: table and key-frame intervals, codec passport and splice points."
              },
              "mpegts-fix-patmpt": {
                "type": "boolean",
                "default": false,
                "description": "Correct the PAT and PMT repetition interval."
              },
              "sync-drift-compensation": {
                "type": "boolean",
                "default": true,
                "description": "Absorb clock drift gradually instead of a single hard resynchronisation."
              },
              "sync-drift-soft-window-ms": {
                "type": "integer",
                "minimum": 1,
                "maximum": 60000,
                "default": 500,
                "description": "Milliseconds of deviation tolerated before drift compensation starts."
              },
              "analize-tstd-video": {
                "type": "boolean",
                "default": false,
                "description": "Simulate the standard video decoder buffer and report overflows and underflows."
              },
              "epg-src": {
                "type": "integer",
                "minimum": -1,
                "default": -1,
                "description": "Identifier of the EPG source; -1 = none."
              },
              "epg-src-channel": {
                "type": "string",
                "default": "",
                "description": "Channel identifier inside the EPG source."
              }
            }
          }
        }
      ],
      "unevaluatedProperties": false
    },
    "item_stream_adaptive": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "stream-name": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "ott-stream-name": {
          "type": "string",
          "maxLength": 32,
          "default": "",
          "description": "Alias used in delivery URLs; empty uses the name"
        },
        "stream-id-list": {
          "type": "array",
          "description": "Ids of the streams forming the adaptive bundle, in the same order as the bit rates",
          "items": {
            "type": "integer",
            "minimum": 1
          }
        },
        "stream-bitrate-list": {
          "type": "array",
          "description": "Advertised bit rate in kbps for each stream of the bundle; 0 = measure automatically",
          "items": {
            "type": "integer",
            "minimum": 0,
            "default": 0
          }
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "note": {
          "type": "string",
          "default": ""
        }
      },
      "required": [
        "id",
        "stream-name"
      ],
      "additionalProperties": false
    },
    "item_stream_input": {
      "type": "object",
      "required": [
        "id",
        "type"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1,
          "description": "Unique within this array. Must be supplied when the file is edited by hand."
        },
        "type": {
          "type": "string",
          "enum": [
            "udp",
            "rtp",
            "prompeg",
            "rtsp",
            "ps1",
            "srt",
            "rist",
            "tcp",
            "hls",
            "rtmp",
            "file",
            "std",
            "pipe",
            "demuxer",
            "dvb",
            "muxer",
            "transcoder",
            "test-stream"
          ],
          "description": "Selects which further keys are valid. Single-programme streams accept udp, rtp, prompeg, rtsp, ps1, srt, rist, tcp, hls, rtmp, file, std, pipe, demuxer, transcoder and test-stream; multi-programme streams accept udp, rtp, prompeg, ps1, srt, rist, tcp, file, std, pipe, dvb and muxer."
        },
        "order": {
          "type": "integer",
          "default": 0,
          "description": "Lowest value is the primary source, the rest are fall-backs."
        },
        "pause": {
          "type": "boolean",
          "default": true
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "peer-note": {
          "type": "string",
          "default": "",
          "description": "Free-form label shown when this resource is announced in the cluster resource library."
        },
        "peer-private": {
          "type": "boolean",
          "default": false,
          "description": "When true this input is not announced in the cluster resource library."
        },
        "sync-jitter-size-auto": {
          "type": "boolean",
          "default": true,
          "description": "Size the jitter buffer automatically. Single-programme streams only."
        },
        "sync-jitter-size-ms": {
          "type": "integer",
          "default": 500,
          "minimum": 10,
          "description": "Milliseconds. Used only when automatic jitter sizing is off. Single-programme streams only."
        },
        "sync-disc-window-ms": {
          "type": "integer",
          "default": 1000,
          "minimum": 100,
          "description": "Milliseconds. Window within which a clock-reference discontinuity is detected; a forward gap beyond it counts as a hard resync."
        },
        "mpegts-splice-point-notify-at": {
          "type": "integer",
          "default": 8,
          "minimum": 0,
          "maximum": 127,
          "description": "Frames-to-splice threshold at or below which a splice-point notification is raised. Effective only while deep analysis is on. Single-programme streams only."
        },
        "mpegts-pid-accept": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "White-list of packet identifiers to keep; takes precedence over the reject list. Single-programme streams only."
        },
        "mpegts-pid-reject": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "Black-list of packet identifiers to drop. Single-programme streams only."
        },
        "mpegts-pid-old": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "Source identifiers to renumber; same length as the target array. Single-programme streams only."
        },
        "mpegts-pid-new": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "Target identifiers of the renumbering; same length as the source array. Single-programme streams only."
        },
        "mpegts-lang-set-pid": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8191
          },
          "description": "Audio track identifiers whose language is overridden; same length as the language array. Single-programme streams only."
        },
        "mpegts-lang-set": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Three-letter language codes; same length as the track identifier array. Single-programme streams only."
        },
        "biss-pnr": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Multi-programme streams only. Programme number that each descrambling key applies to; same length as the key array."
        },
        "biss-key": {
          "default": "",
          "description": "Descrambling key applied before the stream is demuxed and analysed; empty disables it. A single-programme stream takes one key string, a multi-programme stream an array of keys parallel to the programme number array. 12 hexadecimal digits select the basic mode, 16 the extended mode; separators are ignored and an invalid key disables that entry.",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            }
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "udp"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_udp"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "rtp"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_rtp"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "prompeg"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_prompeg"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "rtsp"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_rtsp"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "ps1"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_ps1"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "srt"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_srt"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "rist"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_rist"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "tcp"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_tcp"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "hls"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_hls"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "rtmp"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_rtmp"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "file"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_file"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "std"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_std"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "pipe"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_pipe"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "demuxer"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_demuxer"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "dvb"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_dvb"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "muxer"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_muxer"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "transcoder"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_transcoder"
          }
        },
        {
          "if": {
            "required": [
              "type"
            ],
            "properties": {
              "type": {
                "const": "test-stream"
              }
            }
          },
          "then": {
            "$ref": "#/$defs/input_test_stream"
          }
        }
      ],
      "unevaluatedProperties": false
    },
    "item_stream_output": {
      "type": "object",
      "description": "One output of a stream. The keys available depend on \"type\".",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1,
          "description": "Unique within the output list of this stream."
        },
        "type": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "enum": [
            "udp",
            "rtp",
            "prompeg",
            "ps1",
            "srt",
            "rist",
            "file",
            "std",
            "pipe",
            "muxer",
            "rtmp",
            "transcoder"
          ]
        },
        "order": {
          "type": "integer",
          "default": 0,
          "description": "Display position in the list only; does not affect delivery."
        },
        "pause": {
          "type": "boolean",
          "default": true
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "peer-note": {
          "type": "string",
          "default": "",
          "description": "Free-form label shown when this resource is published in the cluster library."
        },
        "peer-private": {
          "type": "boolean",
          "default": false,
          "description": "true = this output is not announced in the cluster library."
        }
      },
      "required": [
        "id",
        "type"
      ],
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "udp"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_udp"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "rtp"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_rtp"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "prompeg"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_prompeg"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "ps1"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_ps1"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "srt"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_srt"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "rist"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_rist"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "file"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_file"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "std"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_std"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "pipe"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_pipe"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "muxer"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_muxer"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "rtmp"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_rtmp"
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "transcoder"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "$ref": "#/$defs/output_transcoder"
          }
        }
      ],
      "unevaluatedProperties": false
    },
    "item_user": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "login": {
          "type": "string",
          "minLength": 1,
          "default": "anonymous",
          "description": "Subscriber login; holds an IP address or range when is-ip is set"
        },
        "name": {
          "type": "string",
          "default": "",
          "description": "Display name; empty falls back to the login"
        },
        "password": {
          "type": "string",
          "default": ""
        },
        "is-prefix": {
          "type": "boolean",
          "default": false,
          "description": "Match the login as a prefix instead of exactly"
        },
        "is-ip": {
          "type": "boolean",
          "default": false,
          "description": "Treat the login as an IP address or range"
        },
        "note": {
          "type": "string",
          "default": ""
        },
        "pause": {
          "type": "boolean",
          "default": false,
          "description": "Disables the account"
        },
        "limit-day": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Account expiry as a Unix timestamp in seconds; 0 = never expires"
        },
        "max-conn-ps1": {
          "type": "integer",
          "minimum": 0,
          "default": 1,
          "description": "Simultaneous connections allowed over this protocol; 0 = protocol denied"
        },
        "max-conn-srt": {
          "type": "integer",
          "minimum": 0,
          "default": 1,
          "description": "Simultaneous connections allowed over this protocol; 0 = protocol denied"
        },
        "max-conn-http-hls": {
          "type": "integer",
          "minimum": 0,
          "default": 1,
          "description": "Simultaneous connections allowed over this protocol; 0 = protocol denied"
        },
        "accept-stream": {
          "type": "array",
          "description": "White-list: positive values are stream ids, negative values are adaptive-stream ids; an empty list places no restriction",
          "items": {
            "type": "integer"
          }
        }
      },
      "required": [
        "id"
      ],
      "additionalProperties": false
    },
    "item_web_server_login": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "login": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "password": {
          "type": "string",
          "minLength": 1,
          "default": ""
        },
        "role": {
          "type": "integer",
          "enum": [
            0,
            1,
            2
          ],
          "default": 0,
          "description": "0 = administrator, 1 = restricted administrator, 2 = viewer"
        },
        "auto-login": {
          "type": "boolean",
          "default": false,
          "description": "Lets this account keep a persistent browser session that is valid on every node of the domain."
        }
      },
      "required": [
        "id",
        "login",
        "password"
      ],
      "additionalProperties": false
    },
    "node_acme": {
      "type": "object",
      "properties": {
        "acme-enable": {
          "type": "boolean",
          "default": false,
          "description": "Obtain and renew the server certificate automatically."
        },
        "acme-directory-url": {
          "type": "string",
          "minLength": 1,
          "default": "https://acme-v02.api.letsencrypt.org/directory",
          "description": "Directory address of the certificate authority."
        },
        "acme-email": {
          "type": "string",
          "default": "",
          "description": "Contact address registered with the certificate authority; empty registers no contact."
        },
        "acme-http01-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535,
          "default": 80,
          "description": "Local port answering the ownership challenge; the authority always connects to port 80, so any other value needs a port forward."
        },
        "acme-renew-days": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3650,
          "default": 30,
          "description": "Renew this many days before the certificate expires."
        },
        "acme-eab-kid": {
          "type": "string",
          "default": "",
          "description": "External account binding key identifier; leave empty unless the authority requires one."
        },
        "acme-eab-hmac-key": {
          "type": "string",
          "default": "",
          "description": "External account binding key; leave empty unless the authority requires one."
        }
      },
      "additionalProperties": false
    },
    "node_alerter": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "enable": {
          "type": "boolean",
          "default": true
        },
        "stream-no-data-timeout-sec": {
          "type": "integer",
          "minimum": 0,
          "default": 15,
          "description": "0 = disabled"
        },
        "stream-min-bitrate-kbps": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "0 = disabled"
        },
        "stream-cc-warning": {
          "type": "integer",
          "minimum": 0,
          "default": 1,
          "description": "Continuity-counter errors per alert window that raise a warning; 0 = disabled"
        },
        "stream-cc-error": {
          "type": "integer",
          "minimum": 0,
          "default": 10,
          "description": "Continuity-counter errors per alert window that escalate to error; 0 = disabled"
        },
        "cpu-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 85,
          "description": "Whole-host CPU load; 0 = disabled"
        },
        "cpu-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 95,
          "description": "Whole-host CPU load; 0 = disabled"
        },
        "memory-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 85,
          "description": "Whole-host memory use; 0 = disabled"
        },
        "memory-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 95,
          "description": "Whole-host memory use; 0 = disabled"
        },
        "pss-cpu-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 55,
          "description": "0 = disabled"
        },
        "pss-cpu-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 75,
          "description": "0 = disabled"
        },
        "pss-memory-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 55,
          "description": "0 = disabled"
        },
        "pss-memory-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 75,
          "description": "0 = disabled"
        },
        "tc-cpu-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 55,
          "description": "Combined load of all transcoder processes; 0 = disabled"
        },
        "tc-cpu-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 75,
          "description": "Combined load of all transcoder processes; 0 = disabled"
        },
        "tc-mem-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 55,
          "description": "Combined memory use of all transcoder processes; 0 = disabled"
        },
        "tc-mem-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 75,
          "description": "Combined memory use of all transcoder processes; 0 = disabled"
        },
        "net-load-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 80,
          "description": "Interface bandwidth in use; 0 = disabled"
        },
        "net-load-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 95,
          "description": "Interface bandwidth in use; 0 = disabled"
        },
        "gpu-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 90,
          "description": "0 = disabled"
        },
        "gpu-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 98,
          "description": "0 = disabled"
        },
        "disk-usage-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 93,
          "description": "Fill level of a recording storage; 0 = disabled"
        },
        "disk-usage-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 97,
          "description": "Fill level of a recording storage; 0 = disabled"
        },
        "dvr-write-error-count": {
          "type": "integer",
          "minimum": 0,
          "default": 3,
          "description": "Consecutive failed recording writes before alerting; 0 = disabled"
        },
        "dvr-stall-factor": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100000,
          "default": 3,
          "description": "Recording is considered stalled after this multiple of the target segment duration; 0 = disabled"
        },
        "dvr-degraded-enable": {
          "type": "boolean",
          "default": true
        },
        "dvr-degraded-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 2,
          "description": "Share of gaps in the recent recording; 0 = disabled"
        },
        "dvr-degraded-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 10,
          "description": "Share of gaps in the recent recording; 0 = disabled"
        },
        "dvr-rw-time-enable": {
          "type": "boolean",
          "default": true
        },
        "dvr-rw-time-warning-ms": {
          "type": "integer",
          "minimum": 0,
          "default": 1000,
          "description": "Windowed maximum disk read/write time of a recording chunk; 0 = disabled"
        },
        "dvr-rw-time-error-ms": {
          "type": "integer",
          "minimum": 0,
          "default": 3000,
          "description": "Windowed maximum disk read/write time of a recording chunk; 0 = disabled"
        },
        "replicate-alerts": {
          "type": "boolean",
          "default": true,
          "description": "Share active alerts with the other nodes of the domain"
        },
        "system-alerts-domain": {
          "type": "boolean",
          "default": false,
          "description": "Also share node resource alerts domain-wide instead of keeping them local to this node"
        },
        "thread-usage-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 80,
          "description": "Processing-thread busy time; 0 = disabled"
        },
        "dvb-signal-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 40,
          "description": "Alerts when the tuner signal level falls below this value; 0 = disabled"
        },
        "dvb-signal-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 20,
          "description": "Alerts when the tuner signal level falls below this value; 0 = disabled"
        },
        "dvb-snr-warning-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 30,
          "description": "Alerts when the tuner signal-to-noise ratio falls below this value; 0 = disabled"
        },
        "dvb-snr-error-pct": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "default": 15,
          "description": "Alerts when the tuner signal-to-noise ratio falls below this value; 0 = disabled"
        },
        "dvb-ber-warning": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Bit errors counted per polling interval, raw driver scale; 0 = disabled"
        },
        "dvb-ber-error": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Bit errors counted per polling interval, raw driver scale; 0 = disabled"
        },
        "dvb-ucb-warning": {
          "type": "integer",
          "minimum": 0,
          "default": 10,
          "description": "Uncorrected blocks counted per polling interval; 0 = disabled"
        },
        "dvb-ucb-error": {
          "type": "integer",
          "minimum": 0,
          "default": 100,
          "description": "Uncorrected blocks counted per polling interval; 0 = disabled"
        },
        "process-enable": {
          "type": "boolean",
          "default": false
        },
        "process-command": {
          "type": "string",
          "default": ""
        },
        "process-min-severity": {
          "type": "integer",
          "enum": [
            0,
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8
          ],
          "default": 4,
          "description": "Lowest severity delivered: 0 = everything, 1 = trace, 2 = debug, 3 = info, 4 = warning, 5 = error, 6 = critical, 7 = admin action, 8 = nothing"
        },
        "process-timeout-ms": {
          "type": "integer",
          "minimum": 100,
          "maximum": 600000,
          "default": 5000
        },
        "telegram-enable": {
          "type": "boolean",
          "default": false
        },
        "telegram-bot-token": {
          "type": "string",
          "default": ""
        },
        "telegram-chat-id": {
          "type": "string",
          "default": ""
        },
        "telegram-min-severity": {
          "type": "integer",
          "enum": [
            0,
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8
          ],
          "default": 4,
          "description": "Lowest severity delivered: 0 = everything, 1 = trace, 2 = debug, 3 = info, 4 = warning, 5 = error, 6 = critical, 7 = admin action, 8 = nothing"
        },
        "email-enable": {
          "type": "boolean",
          "default": false
        },
        "email-smtp-host": {
          "type": "string",
          "default": ""
        },
        "email-smtp-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535,
          "default": 587
        },
        "email-tls-mode": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "starttls",
            "tls",
            "ssl",
            "smtps",
            "none",
            "plain"
          ],
          "default": "starttls",
          "description": "starttls = upgrade a plain session (usually port 587); tls (synonyms ssl, smtps) = implicit TLS (usually port 465); none (synonym plain) = unencrypted"
        },
        "email-tls-verify": {
          "type": "boolean",
          "default": true
        },
        "email-user": {
          "type": "string",
          "default": ""
        },
        "email-password": {
          "type": "string",
          "default": ""
        },
        "email-from": {
          "type": "string",
          "default": ""
        },
        "email-to": {
          "type": "string",
          "default": "",
          "description": "Comma-separated recipient list"
        },
        "email-min-severity": {
          "type": "integer",
          "enum": [
            0,
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8
          ],
          "default": 4,
          "description": "Lowest severity delivered: 0 = everything, 1 = trace, 2 = debug, 3 = info, 4 = warning, 5 = error, 6 = critical, 7 = admin action, 8 = nothing"
        }
      }
    },
    "node_cluster": {
      "type": "object",
      "description": "Static list of mesh peers; the three cluster-node-* arrays are parallel and must all have the same length.",
      "properties": {
        "cluster-node-address": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Peer address as host:port (the plain admin port); an empty entry marks an inbound-only peer that is never dialled."
          }
        },
        "cluster-node-name": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "description": "Node name of the peer, exactly as configured on that peer."
          }
        },
        "cluster-node-secret": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "description": "Shared secret signing the traffic with this peer; 16 to 128 characters."
          }
        },
        "cluster-self-secret": {
          "type": "string",
          "default": "",
          "description": "This node's own signing secret, 16 to 128 characters; empty disables mesh signing."
        },
        "cluster-contact-workers": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64,
          "default": 8,
          "description": "Number of peers contacted in parallel."
        },
        "cluster-contact-timeout-ms": {
          "type": "integer",
          "minimum": 200,
          "maximum": 30000,
          "default": 2000,
          "description": "Timeout of one peer contact attempt, in milliseconds."
        }
      },
      "additionalProperties": false
    },
    "node_cs": {
      "type": "object",
      "properties": {
        "billing-interval": {
          "type": "integer",
          "minimum": 10,
          "default": 40,
          "description": "Seconds between periodic billing re-authorization rounds"
        },
        "server": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_cs_server"
          }
        }
      },
      "additionalProperties": false
    },
    "node_dvr_storage_list": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "dvr-storage": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_dvr_storage"
          }
        }
      }
    },
    "node_epg": {
      "type": "object",
      "properties": {
        "enable": {
          "type": "boolean",
          "default": true
        },
        "keep-day": {
          "type": "integer",
          "minimum": 0,
          "default": 1,
          "description": "Days of past programme data retained"
        },
        "db-auto-clean-channel": {
          "type": "boolean",
          "default": false,
          "description": "Drop stored channels that are no longer present in a source"
        },
        "xmltv-source-url": {
          "type": "string",
          "default": "",
          "description": "Address advertised in generated XMLTV output"
        },
        "xmltv-source-name": {
          "type": "string",
          "default": "",
          "description": "Source name advertised in generated XMLTV output"
        },
        "db-trace": {
          "type": "boolean",
          "default": false
        },
        "epg-source": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_epg_source"
          }
        }
      },
      "additionalProperties": false
    },
    "node_epg_server": {
      "type": "object",
      "description": "EPG (XMLTV) download server.",
      "properties": {
        "bind-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43973
        },
        "host-name": {
          "type": "string",
          "default": "",
          "description": "When set, only requests carrying this host name are served; empty accepts any."
        },
        "ssl-enable": {
          "type": "boolean",
          "default": false
        },
        "ssl-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43983
        },
        "default-ca-location": {
          "type": "boolean",
          "default": true,
          "description": "true = system certificate store, false = the certificate folder of the installation."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "enable": {
          "type": "boolean",
          "default": false
        },
        "channel-set": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_epg_server_channel_set"
          }
        },
        "login": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_epg_server_login"
          }
        }
      },
      "additionalProperties": false
    },
    "node_http_server": {
      "type": "object",
      "description": "Content delivery web server (OTT and raw streaming).",
      "properties": {
        "bind-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43972
        },
        "host-name": {
          "type": "string",
          "default": "",
          "description": "When set, only requests carrying this host name are served; empty accepts any."
        },
        "ssl-enable": {
          "type": "boolean",
          "default": false
        },
        "ssl-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43982
        },
        "default-ca-location": {
          "type": "boolean",
          "default": true,
          "description": "true = system certificate store, false = the certificate folder of the installation."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "http3-enable": {
          "type": "boolean",
          "default": false,
          "description": "Has no effect while ssl-enable is false: HTTP/3 exists only over TLS."
        },
        "http3-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43984,
          "description": "UDP port of the HTTP/3 listener."
        },
        "http3-zero-rtt-enable": {
          "type": "boolean",
          "default": false,
          "description": "Allows 0-RTT early data on the HTTP/3 listener."
        }
      },
      "additionalProperties": false
    },
    "node_mosaic": {
      "type": "object",
      "properties": {
        "enable": {
          "type": "boolean",
          "default": true
        }
      },
      "additionalProperties": false
    },
    "node_server": {
      "type": "object",
      "properties": {
        "server-name": {
          "type": "string",
          "default": "",
          "description": "Human-readable name of this server; empty means the machine host name is used."
        },
        "node-name": {
          "type": "string",
          "maxLength": 16,
          "default": "",
          "description": "Unique node identity inside the mesh; 2 to 16 ASCII letters, digits, '_', '-', '.'; empty disables the mesh."
        },
        "node-note": {
          "type": "string",
          "maxLength": 128,
          "default": "",
          "description": "Free-form comment about this node, shared with the other nodes of the domain."
        },
        "node-role": {
          "type": "string",
          "maxLength": 32,
          "default": "",
          "description": "Free-form fleet role label (core, edge, ...), shared with the other nodes of the domain."
        },
        "node-region": {
          "type": "string",
          "maxLength": 32,
          "default": "",
          "description": "Free-form fleet region label, shared with the other nodes of the domain."
        },
        "node-domain": {
          "type": "string",
          "maxLength": 16,
          "default": "",
          "description": "Domain this node belongs to; same character set as the node name; empty disables the mesh."
        },
        "public-http-port": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535,
          "default": 0,
          "description": "Externally reachable HTTP port advertised to the other nodes when behind NAT; 0 = advertise the actual listening port."
        },
        "public-https-port": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535,
          "default": 0,
          "description": "Externally reachable HTTPS port advertised to the other nodes when behind NAT; 0 = advertise the actual listening port."
        },
        "cluster-extra-domains": {
          "type": "array",
          "description": "Further domains this node joins as a super-node; changing the set resets the dynamic mesh state.",
          "items": {
            "type": "string",
            "minLength": 1,
            "description": "Domain name, up to 16 ASCII letters, digits, '_', '-', '.'."
          }
        },
        "log-level": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "none",
            "fatal",
            "critical",
            "error",
            "warning",
            "notice",
            "information",
            "debug",
            "trace"
          ],
          "default": "notice",
          "description": "Verbosity of the main log, from none (nothing logged) to trace (everything)."
        },
        "log-clean-days": {
          "type": "integer",
          "minimum": 1,
          "default": 15
        },
        "log-level-srt": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "error",
            "warning",
            "notice",
            "information",
            "trace"
          ],
          "default": "error",
          "description": "Verbosity of the SRT protocol log."
        },
        "log-level-rist": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "error",
            "warning",
            "notice",
            "information",
            "trace"
          ],
          "default": "error",
          "description": "Verbosity of the RIST protocol log."
        },
        "log-level-ffmpeg": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "error",
            "warning",
            "notice",
            "trace"
          ],
          "default": "error",
          "description": "Verbosity of the media-library log."
        },
        "dbstat-trace": {
          "type": "boolean",
          "default": false,
          "description": "Log every operation of the statistics database."
        },
        "dbstat-hours": {
          "type": "integer",
          "minimum": 1,
          "default": 24,
          "description": "Depth of the kept statistics history, in hours."
        },
        "log-db-max-size-mb": {
          "type": "integer",
          "minimum": 16,
          "default": 2048,
          "description": "Size cap of the log database, in megabytes."
        }
      },
      "additionalProperties": false
    },
    "node_user_default": {
      "type": "object",
      "description": "Reserved node; carries no settings.",
      "properties": {},
      "additionalProperties": false
    },
    "node_web_server": {
      "type": "object",
      "description": "Administration and API web server.",
      "properties": {
        "bind-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43971
        },
        "host-name": {
          "type": "string",
          "default": "",
          "description": "When set, only requests carrying this host name are served; empty accepts any."
        },
        "ssl-enable": {
          "type": "boolean",
          "default": false
        },
        "ssl-port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 43981
        },
        "default-ca-location": {
          "type": "boolean",
          "default": true,
          "description": "true = system certificate store, false = the certificate folder of the installation."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "cors-origin": {
          "type": "string",
          "default": "",
          "description": "Comma-separated extra browser origins allowed to read responses, each as scheme://host:port; \"*\" allows any origin, \"none\" allows none."
        },
        "login": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_web_server_login"
          }
        }
      },
      "additionalProperties": false
    },
    "output_file": {
      "type": "object",
      "description": "Additional keys of a file / device output.",
      "properties": {
        "file-path": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Absolute path of the file or device to write."
        },
        "device": {
          "type": "boolean",
          "default": false,
          "description": "true = the path is an existing device, not a file to create."
        },
        "packets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 16,
          "default": 16,
          "description": "MPEG-TS packets per write."
        }
      },
      "required": [
        "file-path"
      ]
    },
    "output_muxer": {
      "type": "object",
      "description": "Additional keys of an output feeding a multiplex.",
      "properties": {
        "stream-id": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535,
          "default": 0,
          "description": "Identifier of the target multiplex stream."
        },
        "sdt-service-name": {
          "type": "string",
          "maxLength": 251,
          "default": "",
          "description": "Empty = the stream name is used."
        },
        "pnr": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535,
          "default": 0,
          "description": "Program number; 0 = the target multiplex stream identifier is used."
        },
        "lcn": {
          "type": "integer",
          "minimum": 0,
          "maximum": 999,
          "default": 0,
          "description": "Logical channel number; 0 = the program number is used."
        },
        "program-order": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65535,
          "default": 0,
          "description": "Position of the program in the multiplex tables, ascending; 0 = unordered, placed after all ordered programs."
        },
        "service-type": {
          "type": "integer",
          "minimum": 0,
          "maximum": 255,
          "default": 0,
          "description": "0 = detected automatically; 1-255 = explicit service type (e.g. 2 digital radio, 22 SD H.264, 25 HD H.264, 31 HEVC)."
        },
        "pmt-pid": {
          "type": "integer",
          "minimum": 0,
          "maximum": 8190,
          "default": 0,
          "description": "0 = assigned automatically. Values 1-31 collide with the reserved table range and are rejected."
        },
        "mpegts-pid-old": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "Source PIDs to remap; must have the same length as the replacement array."
        },
        "mpegts-pid-new": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8190
          },
          "description": "Replacement PIDs; must have the same length as the source array, and must not be 1-31."
        }
      }
    },
    "output_pipe": {
      "type": "object",
      "description": "Additional keys of a named-pipe (FIFO) output.",
      "properties": {
        "file-name": {
          "type": "string",
          "default": "",
          "description": "Absolute path of an existing FIFO; empty = one is created automatically."
        }
      }
    },
    "output_prompeg": {
      "type": "object",
      "description": "Additional keys of a Pro-MPEG (SMPTE 2022-1 FEC) output; everything an RTP output accepts is accepted here too.",
      "allOf": [
        {
          "$ref": "#/$defs/output_rtp"
        }
      ],
      "properties": {
        "prompeg-cols": {
          "type": "integer",
          "minimum": 4,
          "maximum": 64,
          "default": 8,
          "description": "Columns of the FEC matrix; bounds the repairable loss burst."
        },
        "prompeg-rows": {
          "type": "integer",
          "minimum": 4,
          "maximum": 64,
          "default": 4,
          "description": "Rows of the FEC matrix."
        },
        "prompeg-multiplexing": {
          "type": "boolean",
          "default": false,
          "description": "Carries the three FEC channels on one address. Not standard compliant."
        },
        "prompeg-header-xor": {
          "type": "integer",
          "minimum": 0,
          "maximum": 255,
          "default": 0,
          "description": "Header obfuscation key, must match the receiver; 0 = disabled. Not standard compliant."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Encryption passphrase, 10-64 characters; empty = no encryption. Not standard compliant."
        }
      }
    },
    "output_ps1": {
      "type": "object",
      "description": "Additional keys of a PS1 output.",
      "properties": {
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 0,
          "description": "Listening port."
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Listening interface name or IP address; empty = all."
        },
        "latency-ms": {
          "type": "integer",
          "minimum": 3000,
          "default": 6000,
          "description": "Buffer size in milliseconds."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Encryption passphrase, 10-64 characters; empty = no encryption."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "check-lost": {
          "type": "number",
          "minimum": 0,
          "maximum": 99,
          "default": 0,
          "description": "Diagnostic aid: percent of outgoing packets deliberately dropped; 0 = disabled."
        }
      }
    },
    "output_rist": {
      "type": "object",
      "description": "Additional keys of a RIST output. The four address arrays are parallel: entry N of each describes one peer.",
      "properties": {
        "rist-profile": {
          "type": "integer",
          "enum": [
            0,
            1
          ],
          "default": 1,
          "description": "0 = simple, 1 = main."
        },
        "rist-addr-address": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "rist-addr-port": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          }
        },
        "rist-addr-intf": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Interface name or IP address per peer; used for multicast, ignored for unicast."
        },
        "rist-addr-weight": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0,
            "default": 0
          },
          "description": "Load-balancing weight per peer; 0 = duplicate to every peer."
        },
        "rist-session-timeout": {
          "type": "integer",
          "minimum": 100,
          "default": 2000,
          "description": "Milliseconds."
        },
        "rist-recovery-rtt-min": {
          "type": "integer",
          "minimum": 10,
          "default": 50,
          "description": "Milliseconds."
        },
        "rist-recovery-rtt-max": {
          "type": "integer",
          "minimum": 10,
          "default": 500,
          "description": "Milliseconds."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Encryption passphrase, up to 127 bytes; empty = no encryption. Both peers must match."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "auth-type": {
          "type": "integer",
          "enum": [
            0,
            1
          ],
          "default": 0,
          "description": "0 = none, 1 = embedded."
        },
        "packets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 7,
          "default": 7,
          "description": "MPEG-TS packets per datagram."
        }
      }
    },
    "output_rtmp": {
      "type": "object",
      "description": "Additional keys of an RTMP / RTMPS publishing output.",
      "properties": {
        "url": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Publishing URL; the scheme must be rtmp or rtmps."
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Local interface name or IP address for the outgoing connection; empty = automatic."
        },
        "client-timeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 120,
          "default": 10,
          "description": "Seconds."
        },
        "allow-hevc": {
          "type": "boolean",
          "default": true,
          "description": "Allow HEVC video; false = publish H.264 only."
        },
        "tls-verify": {
          "type": "boolean",
          "default": false,
          "description": "Verify the server certificate when publishing over TLS."
        },
        "trace": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "url"
      ]
    },
    "output_rtp": {
      "type": "object",
      "description": "Additional keys of an RTP output: identical to the UDP output, no keys of its own.",
      "allOf": [
        {
          "$ref": "#/$defs/output_udp"
        }
      ]
    },
    "output_srt": {
      "type": "object",
      "description": "Additional keys of an SRT output.",
      "properties": {
        "listen-mode": {
          "type": "boolean",
          "default": true,
          "description": "true = wait for incoming connections, false = dial the configured address."
        },
        "address": {
          "type": "string",
          "default": "",
          "description": "Destination address; used only when not listening."
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 0,
          "description": "Listening port, or destination port when dialling."
        },
        "bind-if": {
          "type": "string",
          "default": "",
          "description": "Listening interface name or IP address; empty = all."
        },
        "srt-stream-id": {
          "type": "string",
          "default": "",
          "description": "Sent when dialling; ignored while listening."
        },
        "peer-auth": {
          "type": "boolean",
          "default": false,
          "description": "Derive the stream id from the cluster domain secret; dialling mode only."
        },
        "srt-client-latency-ms": {
          "type": "integer",
          "minimum": 120,
          "default": 1000,
          "description": "Requested protocol latency in milliseconds."
        },
        "srt-client-reorder": {
          "type": "integer",
          "default": 0,
          "description": "Reordering tolerance in packets; 0 = disabled."
        },
        "srt-client-overhead-pc": {
          "type": "integer",
          "minimum": 5,
          "maximum": 100,
          "default": 25,
          "description": "Bandwidth reserved for retransmission, percent."
        },
        "srt-client-maxbw-Bs": {
          "type": "integer",
          "minimum": -1,
          "default": 0,
          "description": "Bandwidth limit in bytes per second; 0 = automatic."
        },
        "srt-client-timeout-ms": {
          "type": "integer",
          "minimum": 0,
          "default": 3000,
          "description": "Connect timeout in milliseconds; ignored while listening."
        },
        "passphrase": {
          "type": "string",
          "default": "",
          "description": "Encryption passphrase, 10-79 bytes; empty = no encryption. Both peers must match."
        },
        "aes-type": {
          "type": "integer",
          "enum": [
            0,
            1,
            2
          ],
          "default": 0,
          "description": "0 = AES-128, 1 = AES-192, 2 = AES-256."
        },
        "disable-tsbpd": {
          "type": "boolean",
          "default": false,
          "description": "Turns off timestamp-based packet delivery (live mode)."
        },
        "packets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 7,
          "default": 7,
          "description": "MPEG-TS packets per datagram."
        },
        "trace": {
          "type": "boolean",
          "default": false
        },
        "enable-billing": {
          "type": "boolean",
          "default": false,
          "description": "Authorize the call on the billing server before dialling; dialling mode only."
        }
      }
    },
    "output_std": {
      "type": "object",
      "description": "Additional keys of an output that pipes the stream into a console application.",
      "properties": {
        "std-cmd": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Absolute path of the executable."
        },
        "std-args": {
          "type": "string",
          "default": "",
          "description": "Command-line arguments, split with shell quoting rules."
        },
        "std-environment-name": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Environment variable names; must have the same length as the value array."
        },
        "std-environment-value": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "description": "Environment variable values; must have the same length as the name array."
        },
        "packets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 16,
          "default": 16,
          "description": "MPEG-TS packets per write."
        }
      },
      "required": [
        "std-cmd"
      ]
    },
    "output_transcoder": {
      "type": "object",
      "description": "Additional keys of a transcoder output (the decoding side).",
      "properties": {
        "tc-type": {
          "type": "integer",
          "enum": [
            -1,
            0,
            1,
            2
          ],
          "default": 0,
          "description": "-1 = video pass-through, 0 = software (CPU), 1 = NVIDIA (GPU), 2 = Intel VPL (GPU)."
        },
        "device-id": {
          "type": "integer",
          "minimum": 0,
          "default": 0,
          "description": "Obsolete."
        },
        "device-id-str": {
          "type": "string",
          "default": "",
          "description": "GPU device selector; empty = first device. Ignored for software transcoding."
        },
        "timeout": {
          "type": "integer",
          "minimum": 1,
          "default": 10,
          "description": "Decoder / encoder timeout in seconds."
        },
        "fix-par": {
          "type": "string",
          "default": "",
          "description": "Pixel aspect ratio override as an \"N/D\" fraction; empty = taken from the source."
        },
        "fix-framerate": {
          "type": "string",
          "default": "",
          "description": "Frame rate override as an \"N/D\" fraction; empty = taken from the source."
        },
        "convert-bt709": {
          "type": "boolean",
          "default": false,
          "description": "Force conversion of SD colour spaces to BT.709."
        }
      }
    },
    "output_udp": {
      "type": "object",
      "description": "Additional keys of a UDP output.",
      "properties": {
        "address": {
          "type": "string",
          "minLength": 1,
          "default": "",
          "description": "Multicast group, or unicast IP address / host name."
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65534,
          "default": 0
        },
        "mcast-if": {
          "type": "string",
          "default": "",
          "description": "Interface name or IP address used for multicast; empty = automatic."
        },
        "ip-ttl": {
          "type": "integer",
          "minimum": 1,
          "maximum": 255,
          "default": 4,
          "description": "Multicast time-to-live."
        },
        "packets": {
          "type": "integer",
          "minimum": 1,
          "maximum": 7,
          "default": 7,
          "description": "MPEG-TS packets per datagram."
        },
        "check-lost": {
          "type": "number",
          "minimum": 0,
          "maximum": 99,
          "default": 0,
          "description": "Diagnostic aid: percent of outgoing packets deliberately dropped; 0 = disabled."
        }
      },
      "required": [
        "address"
      ]
    }
  }
}
