{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://doc2.pstreamer.tv/schema/2.0.1.258/pss.compat.schema.json",
  "title": "Perfect Streamer configuration file (pss.json) - permissive profile",
  "description": "Permissive companion to pss.schema.json. Types, ranges, enumerations and required members are still checked, but members this version does not declare are allowed through. Use it as the first pass when carrying a configuration from a different version, then re-check with the strict schema to see which members that version no longer recognises.",
  "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"
      }
    }
  },
  "$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"
      ]
    },
    "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"
              }
            }
          }
        }
      ]
    },
    "item_dvr_storage": {
      "type": "object",
      "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"
      ]
    },
    "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"
      ]
    },
    "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"
      ]
    },
    "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."
              }
            }
          }
        }
      ]
    },
    "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"
      ]
    },
    "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"
          }
        }
      ]
    },
    "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"
          }
        }
      ]
    },
    "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"
      ]
    },
    "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"
      ]
    },
    "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."
        }
      }
    },
    "node_alerter": {
      "type": "object",
      "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."
        }
      }
    },
    "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"
          }
        }
      }
    },
    "node_dvr_storage_list": {
      "type": "object",
      "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"
          }
        }
      }
    },
    "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"
          }
        }
      }
    },
    "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."
        }
      }
    },
    "node_mosaic": {
      "type": "object",
      "properties": {
        "enable": {
          "type": "boolean",
          "default": true
        }
      }
    },
    "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."
        }
      }
    },
    "node_user_default": {
      "type": "object",
      "description": "Reserved node; carries no settings.",
      "properties": {}
    },
    "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"
          }
        }
      }
    },
    "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"
      ]
    }
  }
}
