File manager - Edit - /opt/flussonic/lib/web-1/priv/schema-v3-public.json
Back
{ "openapi": "3.1.0", "info": { "contact": { "email": "support@flussonic.com", "name": "Support team", "url": "https://flussonic.com/" }, "description": "This document is a comprehensive API specification for the Flussonic Media Server.\n\nThe Flussonic Media Server API lets you manage the server configuration: retrieving the data about the streams, DVRs, templates, and others, \ncreating/updating, and removing them.\nTo know more about our API's design principles, see [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/).\n\nPermanent [download link](https://flussonic.com/doc/api/reference.json) to JSON schema file.\n\nThis API Reference provides you with all the methods, fields, values, and endpoints currently accessible in Flussonic.\n\nBefore you proceed, read the following information:\n\n* `server_config` represents the server configuration file. Our built-in config parser validates the configuration file structure \naccording to this specification.\n* Some API methods may send extra fields in responses, so your application must be ready to drop them;\n* Do not rely on undocumented fields in the responses as we may modify them at any moment.\n* In further updates of this document, some fields may become deprecated. Such fields will be scheduled for deletion with \n`x-delete-at` property with year and month, after which it will no longer exist.\n* To disable a feature, provide the corresponding property with the `null` value. Learn more about the upsert method in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-upsert).\n", "title": "Flussonic Media Server API", "version": "1.2.3" }, "components": { "schemas": { "program_id": { "type": "integer", "minimum": 1, "maximum": 65535, "x-notice": "mpegts program number" }, "ts_pid": { "maximum": 8191, "minimum": 0, "type": "integer" }, "iso8601": { "type": "integer", "x-notice": "2016-07-08T09:04:46Z" }, "psi_version": { "type": "integer", "minimum": 0, "maximum": 31 }, "loglevel": { "type": "string", "description": "The level of logging according to event importance. Several values separated by comma.", "example": "debug", "oneOf": [ { "title": "None", "const": "none", "description": "Logging disabled.", "x-api-deny": [ "watcher-admin" ] }, { "title": "Debug", "const": "debug", "description": "Messages of all types are logged." }, { "title": "Info", "const": "info", "description": "Log info messages." }, { "title": "Notice", "const": "notice", "description": "Log notices.", "x-api-deny": [ "watcher-admin" ] }, { "title": "Warning", "const": "warning", "description": "Log warnings." }, { "title": "Error", "const": "error", "description": "Log errors." }, { "title": "Alert", "const": "alert", "description": "Log alerts.", "x-api-deny": [ "watcher-admin" ] }, { "title": "Critical", "const": "critical", "description": "Log critical messages." } ] }, "auth_token": { "type": "string", "format": "auth_token", "default": "token", "example": "token", "description": "Configure key name of query string key-value pair for token authentication\n", "x-format-description": "auth_token" }, "collection_response": { "type": "object", "properties": { "estimated_count": { "description": "Estimated total number of records for the query (regardless of the cursors).\n", "type": "integer", "example": 5 }, "next": { "description": "Next cursor: a properly encoded equivalent of offset allowing to read the next bunch of items.\nLearn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n", "example": "JTI0cG9zaXRpb25fZ3Q9MA==", "type": "string" }, "prev": { "description": "Previous cursor: a properly encoded equivalent of offset allowing to read the previous bunch of items.\nLearn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n", "example": "JTI0cG9zaXRpb25fbHQ9MSYlMjRyZXZlcnNlZD10cnVl", "type": "string" }, "timing": { "description": "An object with a list of different timings measured during this API call.", "type": "object" } } }, "error_response": { "type": "object", "properties": { "errors": { "description": "List of structured errors", "type": "array", "items": { "$ref": "#/components/schemas/error" } } } }, "error": { "type": "object", "properties": { "id": { "type": "string", "description": "a unique identifier for this particular occurrence of the problem\n" }, "status": { "type": "string", "description": "the HTTP status code applicable to this problem, expressed as a string value\n" }, "code": { "type": "string", "description": "an application-specific error code, expressed as a string value\n" }, "title": { "type": "string", "description": "a short, human-readable summary of the problem that SHOULD NOT change from\noccurrence to occurrence of the problem, except for purposes of localization\n" }, "source": { "description": "an object containing references to the source of the error\n", "type": "object", "properties": { "pointer": { "type": "string", "description": "a JSON Pointer [RFC6901] to the associated entity in the request document\n[e.g. `\"/data\"` for a primary data object, or `\"/data/attributes/title\"` for a specific attribute].\n" }, "parameter": { "type": "string", "description": "a string indicating which URI query parameter caused the error." } } }, "meta": { "type": "object", "description": "a meta object containing non-standard meta-information about the error.\n", "additionalProperties": { "type": "string" } } } }, "thumbnails_spec": { "type": "object", "properties": { "url": { "description": "*Flussonic* takes a thumbnail from the specified URL on each keyframe.\nMay reduce CPU usage on IP cameras.\n", "type": "string", "example": "http://10.115.23.45/isapi/thumbnail.jpg" }, "enabled": { "description": "Whether to generate thumbnails from the video stream.", "oneOf": [ { "$ref": "#/components/schemas/thumbnails_enabled_spec" } ], "default": true }, "sizes": { "description": "What sizes will be used for thumbnails generation.", "type": "array", "items": { "$ref": "#/components/schemas/thumbnails_size_spec" }, "default": [] } } }, "thumbnails_enabled_spec": { "oneOf": [ { "type": "boolean", "enum": [ true, false ], "description": "Configures thumbnails behaviour.\n- true : \n\n In case of Stream: \n Thumbnails are created and stored in DVR during the recording. If thumbnail is requested then it will be returned from DVR.\n\n In case of VOD:\n Thumbnails are created and stored in VOD location at thumbnails folder during the VOD opening if they are not created yet.\n If VOD location is `readonly` then it will be used only for thumbnails searching. Nothing will be created and stored. \n\n If thumbnail is requested then it will be returned from thumbnails folder in VOD location.\n\n- false : thumbnails are not stored at all. If thumbnail is requested then 403 'Forbidden' error will be returned.\n" }, { "type": "string", "enum": [ "ondemand" ], "description": "- ondemand : thumbnails are not stored at all. If thumbnail is requested then it will be generated from corresponding video frame.\n" } ] }, "thumbnails_size_spec": { "type": "object", "properties": { "width": { "type": "integer", "description": "The thumbnail width." }, "height": { "type": "integer", "description": "The thumbnail height." } } }, "ad_placement": { "type": "string", "oneOf": [ { "title": "Preroll", "const": "preroll", "description": "Path to the pre-roll video file (in VOD) to be shown before the main video." }, { "title": "Midroll", "const": "midroll", "description": "Path to the mid-roll video file (in VOD) to be shown during the video according to the ad markers." } ], "description": "The advertising placement type." }, "session_key": { "anyOf": [ { "oneOf": [ { "title": "IP", "const": "ip", "description": "IP address" }, { "title": "Name", "const": "name", "description": "Stream name" }, { "title": "Proto", "const": "proto", "description": "Protocol" }, { "title": "Token", "const": "token", "description": "Token" } ], "type": "string" }, { "allOf": [ { "$ref": "#/components/schemas/session_key_query" } ] } ] }, "session_status": { "oneOf": [ { "title": "Establishing", "const": "establishing" }, { "title": "Running", "const": "running" }, { "title": "Stalling", "const": "stalling" }, { "title": "Finished", "const": "finished" } ], "type": "string" }, "protocol": { "type": "string", "oneOf": [ { "title": "copy", "const": "copy" }, { "title": "fake", "const": "fake" }, { "title": "RTP", "const": "rtp" }, { "title": "RTMP", "const": "rtmp" }, { "title": "RTMPS", "const": "rtmps" }, { "title": "RTMPE", "const": "rtmpe" }, { "title": "RTSP", "const": "rtsp" }, { "title": "RTSP-UDP", "const": "rtsp-udp" }, { "title": "RTSP2", "const": "rtsp2" }, { "title": "RTSPS", "const": "rtsps" }, { "title": "EST", "const": "est" }, { "title": "SRT", "const": "srt" }, { "title": "MSE-LD", "const": "mseld" }, { "title": "SHOUTcast", "const": "shoutcast" }, { "title": "SHOUTcasts", "const": "shoutcasts" }, { "title": "WebRTC", "const": "webrtc" }, { "title": "HLS", "const": "hls" }, { "title": "HLSS", "const": "hlss" }, { "title": "HLS2", "const": "hls2" }, { "title": "HLSS2", "const": "hlss2" }, { "title": "LL-HLS", "const": "llhls" }, { "title": "CMAF", "const": "cmaf" }, { "title": "DASH", "const": "dash" }, { "title": "MSS", "const": "mss" }, { "title": "M4S", "const": "m4s" }, { "title": "M4SS", "const": "m4ss" }, { "title": "M4F", "const": "m4f" }, { "title": "M4FS", "const": "m4fs" }, { "title": "HTTP MPEG-TS", "const": "tshttp" }, { "title": "HTTPS MPEG-TS", "const": "tshttps" }, { "title": "TCP MPEG-TS", "const": "tstcp" }, { "title": "SSL MPEG-TS", "const": "tsssl" }, { "title": "FLV", "const": "flv" }, { "title": "annexB", "const": "annexb" }, { "title": "UDP", "const": "udp" }, { "title": "UDP1", "const": "udp1" }, { "title": "UDP2", "const": "udp2" }, { "title": "UDP3", "const": "udp3" }, { "title": "UDP MPTS", "const": "mpts-udp" }, { "title": "HTTP MPTS", "const": "mpts-http" }, { "title": "HTTPS MPTS", "const": "mpts-https" }, { "title": "DVB MPTS", "const": "mpts-dvb" }, { "title": "DVB", "const": "dvb" }, { "title": "Decklink", "const": "decklink" }, { "title": "DekTec", "const": "dektec" }, { "title": "DekTec ASI", "const": "dektec-asi" }, { "title": "v4l", "const": "v4l" }, { "title": "v4l2", "const": "v4l2" }, { "title": "Playlist", "const": "playlist" }, { "title": "Mixer", "const": "mixer" }, { "title": "Mosaic", "const": "mosaic" }, { "title": "Mosaic2", "const": "mosaic2" }, { "title": "Timeshift", "const": "timeshift" }, { "title": "File", "const": "file" }, { "title": "Download", "const": "download" }, { "title": "MBR", "const": "mbr" }, { "title": "MP4", "const": "mp4" }, { "title": "Logo", "const": "logo" }, { "title": "JPEG", "const": "jpeg" }, { "title": "MJPEG", "const": "mjpeg" }, { "title": "H.323", "const": "h323" }, { "title": "Ad injector", "const": "ad_injector" }, { "title": "ffmpeg", "const": "ffmpeg" }, { "title": "Transponder", "const": "transponder" }, { "title": "API", "const": "api" }, { "title": "JSON manifest", "const": "json_manifest" }, { "title": "Player", "const": "player" }, { "title": "NDI", "const": "ndi" }, { "title": "FRIP", "const": "frip" }, { "title": "ST2110", "const": "st2110" } ] }, "security_protocol": { "type": "string", "oneOf": [ { "title": "TLSv1", "const": "tlsv1" }, { "title": "TLSv1.1", "const": "tlsv1.1" }, { "title": "TLSv1.2", "const": "tlsv1.2" }, { "title": "TLSv1.3", "const": "tlsv1.3" } ] }, "segments_container": { "type": "string", "oneOf": [ { "title": "CMAF", "const": "cmaf" }, { "title": "fMP4", "const": "fmp4" }, { "title": "MPEG-TS", "const": "mpegts" } ] }, "session_generic": { "type": "object", "description": "Ancestor for all session-like entities. Something like a generic report for a flow.\nCan be suitable for an input, push or play\n", "properties": { "id": { "type": "string", "format": "uuid", "description": "Unique identifier (or UUID) of the session.", "example": "61942414-8c15-4809-8bb6-adf1ae846027", "x-format-description": "uuid" }, "ip": { "type": "string", "description": "IP address of the connected peer.", "example": "172.16.25.73" }, "proto": { "allOf": [ { "$ref": "#/components/schemas/protocol" } ], "description": "Protocol used for the data transmission in the session.", "example": "dash" }, "opened_at": { "type": "number", "format": "utc_ms", "description": "The time when this session was created.", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "started_at": { "type": "number", "format": "utc_ms", "description": "The time when the frames transmission started in the session.", "example": 1637095014000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "updated_at": { "type": "number", "format": "utc_ms", "description": "The time when the session was last updated.", "example": 1637098611000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "closed_at": { "type": "number", "format": "utc_ms", "description": "The time when the session was closed.", "example": 1637098821000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "segments_container": { "allOf": [ { "$ref": "#/components/schemas/segments_container" } ], "description": "Media container used for this protocol.\nFor instance, HLS can go with MPEG-TS or fMP4 segments and DASH with big fMP4 or small CMAF segments.\n" }, "secure": { "type": "boolean", "description": "This flag indicates that TLS (SSL) was used to serve this session.\nIt may be either input (ingest, publish) or output (push, play) session, this flag will be\nfilled for any of them.\n" }, "security_protocol": { "allOf": [ { "$ref": "#/components/schemas/security_protocol" } ], "description": "TLS protocol version used to protect the connection", "example": "tlsv1.2" }, "manifest_type": { "allOf": [ { "$ref": "#/components/schemas/manifest_type" } ], "description": "Type of requested manifest. Applicable for HLS, DASH and MSS.", "example": "rewind" }, "named_by": { "allOf": [ { "$ref": "#/components/schemas/named_by" } ], "example": "config", "description": "Where the media was configured", "deprecated": true, "x-delete-at": 25.02 }, "media_info": { "allOf": [ { "$ref": "#/components/schemas/media_info" } ], "description": "Technical description of the input content.\n" }, "ts_delay": { "type": "number", "format": "ticks", "example": 1284, "description": "The time period during which no frames were received from the stream's input.\n", "openmetrics_metric": "ts_delay", "x-format-description": "ticks" }, "ts_delay_per_tracks": { "type": "array", "items": { "type": "number", "format": "ticks", "x-format-description": "ticks" }, "example": [ 1284 ], "description": "The time period during which no frames were received per each track according to `media_info`\n", "openmetrics_metric": "ts_delay" } } }, "session_details": { "type": "object", "description": "This fields can deanonymise user and thus can be sent to telemetry only if allowed.\n", "properties": { "name": { "type": "string", "format": "media_name", "description": "File used in the streaming session.", "example": "hockey1", "x-format-description": "media_name" }, "token": { "type": "string", "format": "session_token", "description": "Token provided by the client.", "example": "zGAFxLkoWluO1pG7_nJmQAbCnM5", "x-format-description": "session_token" }, "country": { "type": "string", "format": "iso3166", "description": "Peer's IP geolocation (country).", "example": "us", "x-format-description": "iso3166" }, "user_id": { "type": "string", "description": "User ID provided by the Middleware authorization backend.", "example": "5435" }, "user_name": { "type": "string", "format": "media_name", "description": "User-provided original stream or VOD name before the rewrite of a media [aliaser](https://flussonic.com/doc/hide-publisher-stream-name-from-viewers/).", "x-format-description": "media_name" }, "referer": { "type": "string", "format": "uri", "description": "Referer HTTP header or its analog for other protocols.", "example": "http://my-tv-portal.local/hockey1", "x-format-description": "uri" }, "query_string": { "type": "string", "description": "Full query string for the initial request of the session." }, "current_time": { "type": "number", "format": "milliseconds", "description": "The current time value of the playback session.", "x-format-description": "milliseconds" }, "user_agent": { "type": "string", "description": "Client's user agent for selected protocol.", "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36" }, "allowed_dvr_from": { "type": "integer", "format": "utc", "description": "This field indicates that session has allowed_dvr_ranges delivered from authorization backend and shows maximum depth of allowed content.\n", "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 } } }, "session_playback": { "type": "object", "description": "Playback specific fields\n", "properties": { "hls_separate_audio": { "type": "boolean", "description": "The flag shows if the HLS separate_audio mode is enabled for the session." }, "filter_tracks": { "type": "boolean", "description": "The flag shows if the track filtering is applied for the session." }, "dvr": { "type": "boolean", "description": "This flag indicates that this session was using DVR.\n" }, "advertising": { "type": "boolean", "description": "This flag indicates that advertising was shown in this session.\n" }, "max_sessions": { "type": "integer", "description": "The maximum number of sessions allowed for the given `user_id` by the middleware authorization backend." }, "soft_limitation": { "type": "boolean", "default": false, "description": "The flag shows if the soft limitation mode is enabled for the sessions with the given `user_id`." } } }, "session_counters": { "type": "object", "properties": { "bytes": { "type": "integer", "format": "bytes", "default": 0, "description": "Number of bytes sent in the session.", "openmetrics_metric": "bytes", "x-format-description": "bytes" }, "disk_bytes": { "type": "integer", "format": "bytes", "description": "Number of bytes read from disk in the session.\n", "x-format-description": "bytes" }, "disk_orig_bytes": { "type": "integer", "format": "bytes", "description": "The total number of bytes the media occupies on disk, all track including.\n", "x-format-description": "bytes" } } }, "session": { "allOf": [ { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/session_details" }, { "$ref": "#/components/schemas/session_counters" }, { "$ref": "#/components/schemas/session_player" }, { "$ref": "#/components/schemas/session_playback" } ] }, "session_player": { "type": "object", "properties": {} }, "manifest_type": { "type": "string", "oneOf": [ { "title": "index", "description": "Simple live stream or file playlist", "const": "index" }, { "title": "archive", "description": "DVR playlist", "const": "archive" }, { "title": "event", "description": "Event playlist", "const": "event" }, { "title": "rewind", "description": "Playlist with a wide sliding window.", "const": "rewind" }, { "title": "timeshift_abs", "description": "DVR playlist using absolute timeshift", "const": "timeshiftAbs" }, { "title": "timeshift_rel", "description": "DVR playlist using relative timeshift", "const": "timeshiftRel" } ] }, "playback_headers": { "type": "object", "properties": { "playback": { "type": "string", "description": "Playback type for which the HTTP headers apply.", "oneOf": [ { "title": "Live", "const": "live" }, { "title": "DVR", "const": "dvr" } ], "example": "live" }, "protocols": { "description": "Configuration to allow/forbid headers for various playback protocols.", "allOf": [ { "$ref": "#/components/schemas/play_protocols_spec" } ] }, "headers": { "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 64 }, "type": "object", "maxItems": 10, "x-key-type": "string", "description": "HTTP headers in name-value format for manifest requests.", "example": { "Cache-Control": "max-age=3600" } }, "segment_headers": { "additionalProperties": { "type": "string", "minLength": 1, "maxLength": 64 }, "type": "object", "maxItems": 10, "x-key-type": "string", "description": "HTTP headers in name-value format for segment requests.", "example": { "Cache-Control": "max-age=3600" } } } }, "frame_video_codec": { "type": "string", "oneOf": [ { "title": "H.264", "const": "h264" }, { "title": "HEVC (H.265)", "const": "hevc" }, { "title": "MP2V", "const": "mp2v" }, { "title": "VP9", "const": "vp9", "deprecated": true, "x-delete-at": 23.09 }, { "title": "MJPEG", "const": "mjpeg" }, { "title": "Screen", "const": "screen" }, { "title": "JPEG", "const": "jpeg" }, { "title": "AV1", "const": "av1" }, { "title": "JPEG 2000", "const": "j2k" } ] }, "frame_audio_codec": { "type": "string", "oneOf": [ { "title": "AAC", "const": "aac", "x-api-allow": [ "watcher-client", "watcher-admin" ] }, { "title": "MP3", "const": "mp3" }, { "title": "MP2A", "const": "mp2a" }, { "title": "Opus", "const": "opus" }, { "title": "AC3", "const": "ac3" }, { "title": "EAC3", "const": "eac3" }, { "title": "PCMA", "const": "pcma" }, { "title": "PCMU", "const": "pcmu" } ] }, "frame_text_codec": { "type": "string", "oneOf": [ { "title": "TTXT", "const": "ttxt" }, { "title": "Text", "const": "text" }, { "title": "WVTT", "const": "wvtt" }, { "title": "TTML", "const": "ttml" }, { "title": "Subtitle", "const": "subtitle" }, { "title": "ID3T", "const": "id3t" }, { "title": "ONVIF", "const": "onvif" }, { "title": "TX3G", "const": "tx3g" } ] }, "frame_raw_codec": { "type": "string", "oneOf": [ { "title": "YUV", "const": "yuv" }, { "title": "UYVY422", "const": "uyvy422" }, { "title": "YUYV422", "const": "yuyv422" }, { "title": "YUV422p10", "const": "yuv422p10" }, { "title": "ARGB", "const": "argb" }, { "title": "RGB48", "const": "rgb48" }, { "title": "V210", "const": "v210" }, { "title": "PCM", "const": "pcm" } ] }, "frame_audio_raw_codec": { "type": "string", "oneOf": [ { "const": "pcm" } ] }, "frame_app_codec": { "oneOf": [ { "title": "MPEG-TS", "const": "mpegts" }, { "title": "Object", "const": "object" }, { "title": "EIT", "const": "eit" }, { "title": "SCTE-27", "const": "scte27" }, { "title": "SCTE-35", "const": "scte35" }, { "title": "KLV", "const": "klv" }, { "title": "Empty", "const": "empty" } ], "type": "string" }, "frame_codec": { "anyOf": [ { "$ref": "#/components/schemas/frame_video_codec" }, { "$ref": "#/components/schemas/frame_audio_codec" }, { "$ref": "#/components/schemas/frame_raw_codec" }, { "$ref": "#/components/schemas/frame_text_codec" }, { "$ref": "#/components/schemas/frame_app_codec" } ] }, "frame_content": { "type": "string", "oneOf": [ { "title": "Audio", "const": "audio" }, { "title": "Video", "const": "video" }, { "title": "Text", "const": "text" }, { "title": "Metadata", "const": "metadata" }, { "title": "Application", "const": "application" } ] }, "frame_video_pix_fmt": { "type": "string", "oneOf": [ { "title": "YUV420P", "const": "yuv420p" }, { "title": "YUVJ420P", "const": "yuvj420p" }, { "title": "YUV422P", "const": "yuv422p" }, { "title": "YUV444P", "const": "yuv444p" }, { "title": "YUV420P10", "const": "yuv420p10" }, { "title": "YUV422P10", "const": "yuv422p10" }, { "title": "YUV444P10", "const": "yuv444p10" }, { "title": "YUV420P12", "const": "yuv420p12" }, { "title": "YUV422P12", "const": "yuv422p12" }, { "title": "YUV444P12", "const": "yuv444p12" }, { "title": "Gray8", "const": "gray8" }, { "title": "Gray10", "const": "gray10" }, { "title": "Gray12", "const": "gray12" }, { "title": "NV12", "const": "nv12" }, { "title": "P016", "const": "p016" }, { "title": "V210", "const": "v210" }, { "title": "UYVY422", "const": "uyvy422" }, { "title": "YUYV422", "const": "yuyv422" }, { "title": "RGB48", "const": "rgb48" }, { "title": "ARGB", "const": "argb" } ] }, "track_info": { "oneOf": [ { "$ref": "#/components/schemas/track_info_video" }, { "$ref": "#/components/schemas/track_info_audio" }, { "$ref": "#/components/schemas/track_info_text" }, { "$ref": "#/components/schemas/track_info_metadata" }, { "$ref": "#/components/schemas/track_info_application" } ], "discriminator": { "propertyName": "content", "mapping": { "video": "#/components/schemas/track_info_video", "audio": "#/components/schemas/track_info_audio", "text": "#/components/schemas/track_info_text", "metadata": "#/components/schemas/track_info_metadata", "application": "#/components/schemas/track_info_application" } }, "x-record-definition": "#/components/schemas/track_info_full" }, "track_info_base": { "type": "object", "properties": { "track_id": { "description": "Track identifier assigned by Flussonic.", "anyOf": [ { "type": "integer" }, { "type": "string" } ], "example": "v1" }, "frame_duration": { "description": "For video track, it is the time between the beginning of a frame and the beginning of the next frame.\n\nThis parameter is important for some protocols. Normally, frame duration is a difference between timestamps of two neighbouring frames.\nHowever, sometimes (when the connection is broken) video breakups are possible.\nAs result, the delta between two consequent frame timestamps will not be equal to the frame duration.\nThis situation is considered as a frame gap and is handled differently across different protocols.\n", "type": "number", "format": "ticks", "x-format-description": "ticks" }, "avg_fps": { "description": "Actual average FPS - the number of frames diplayed per second (calculated for the last 200 frames).\nThe higher FPS is, the smoother the video playback is. \nUsually, standard values of FPS for films and video are used in different countries (for example, in Russia and Europe it is 25 FPS).\n", "type": "number", "x-notice": "calculated fps for statistic" }, "bandwidth": { "description": "Bandwidth necessary to transfer this track.\nThis is slightly grater than bitrate because transport (e.g. MPEG TS) adds some overhead\n", "type": "integer", "format": "speed", "example": 2600, "x-format-description": "speed" } } }, "track_info_base_configurable": { "type": "object", "required": [ "content" ], "properties": { "content": { "description": "Content of the track (audio, video, or text).", "allOf": [ { "$ref": "#/components/schemas/frame_content" } ], "x-api-allow": [ "smartcam", "iris-hal" ] }, "title": { "description": "Human-readable localized title of the track.", "type": "string", "x-notice": "Human-readable localized title for HDS/HLS", "example": "Video1" }, "bitrate": { "description": "Bitrate of the track in kbit/s.\nWhen using sdtv/hdtv/uhdtv transcoder target, for video tracks\nthis field sets the desired transport bandwidth instead of raw video bitrate.\n", "type": "integer", "format": "speed", "example": 2543, "x-api-allow": [ "smartcam", "iris-hal" ], "x-format-description": "speed" }, "pid": { "description": "This parameter sets PIDs values for outgoing MPEG-TS streams.\nPID identifies separate data stream inside the multiplexed MPEG-TS stream.\nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\nTracks are numbered starting from one. The code a1=123 sets a PID value for the first audio track.\n\nIt is possible to set the base index for the tracks of a certain type using the 0 (zero) index.\nFor example, t0=100 sets PID=101 for the first track, 102 for the second, and so on.\nNumbers can be given in decimal form (by default) or hexadecimal with 16# prefix.\n", "allOf": [ { "$ref": "#/components/schemas/ts_pid" } ] } } }, "track_info_video": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } }, { "$ref": "#/components/schemas/track_info_video_specific" }, { "$ref": "#/components/schemas/track_info_video_configurable" } ] }, "track_info_video_specific": { "type": "object", "properties": { "last_gop": { "description": "Last GOP size (expressed in number of frames).\nThis parameter is used to monitor the quality of encoding: normally, average GOP size should be equal to the last GOP size.\nIf this value is floating, this means that your transcoder is working in a flexible GOP size mode and some players may have problems.\nThis is not acceptable by most ABR usecases and it will not pass DVB validation protocol.\n", "type": "integer", "example": 28 }, "avg_gop": { "type": "integer", "description": "Average GOP size (expressed in number of frames) of the last 1000-2000 frames.\nThis parameter is used to monitor the quality of encoding: normally, average GOP size should be equal to the last GOP size.\nIf this value is floating, this means that your transcoder is working in flexible GOP size mode and some players may have problems.\nThis is not acceptable by most ABR usecases and it will not pass DVB validation protocol.\n", "example": 25 }, "length_size": { "enum": [ 2, 4 ], "default": 4, "type": "integer", "x-notice": "H264 private option", "description": "The size of the length field for H264 bitstream without start codes." }, "is_progressive": { "description": "Indicates if progressive scanning method is used for all frames of the track\n", "type": "boolean", "default": true }, "closed_captions": { "description": "Parameters of closed captions.", "items": { "allOf": [ { "$ref": "#/components/schemas/closed_captions" } ] }, "type": "array", "default": [] } } }, "track_info_video_configurable": { "type": "object", "properties": { "width": { "description": "The picture width in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\n", "type": "integer", "format": "pixels", "x-api-allow": [ "smartcam" ], "x-format-description": "pixels" }, "height": { "description": "The picture height in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\n", "type": "integer", "format": "pixels", "x-api-allow": [ "smartcam" ], "x-format-description": "pixels" }, "fps": { "description": "Frame rate (frames per second) - the speed at which a sequence of images is displayed on a screen.\nHigher frame rates capture more images per second, which makes for smoother video.\nThe standard frame rate for color television in the Phase Alternating Line (PAL) format is 25 fps.\nThe standard frame rate for color television in the National Television System Committee (NTSC) format is 29,97 fps\n(a little bit lower than the original frame rate of black and white NTSC television, equal to 30 fps.)\nIf interlaced TV is used, two fields of each frame (with odd-numbered lines and with even-numbered lines) are displayed consequently,\nbut the frame rate is actually not doubled (50 half-frames are still equal to 25 original frames). \n", "type": "number", "x-api-allow": [ "smartcam" ] }, "pix_fmt": { "allOf": [ { "$ref": "#/components/schemas/frame_video_pix_fmt" } ], "default": "yuv420p", "description": "The color model of the video." }, "num_refs_frames": { "type": "integer", "maximum": 32, "minimum": 0, "description": "The number of I-frames to be used for encoding." }, "sar_width": { "description": "The first number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\nSAR is used for creating non-anamorphic video from anamorphic video.\n", "default": 1, "type": "integer", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar" } }, "sar_height": { "description": "The second number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\nSAR is used for creating non-anamorphic video from anamorphic video.\n", "default": 1, "type": "integer", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar" } }, "pixel_width": { "description": "The picture width in pixels of the original video before transcoding.", "type": "integer", "format": "pixels", "x-format-description": "pixels" }, "pixel_height": { "description": "The picture width in pixels of the original video before transcoding.", "type": "integer", "format": "pixels", "x-format-description": "pixels" }, "level": { "type": "string", "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n", "x-api-allow": [ "smartcam" ] }, "profile": { "description": "A specific codec-dependent profile of the output video.\nThe profile allows to assume if the track can be played on a particular device.\n", "type": "string", "x-api-allow": [ "smartcam" ] }, "bframes": { "description": "Average number of B-frames in a GOP. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n", "type": "integer", "x-notice": "calculated number of bframes for statistic", "example": 3 }, "gop_size": { "description": "The number of frames in a group of pictures (GOP). \nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\nA bigger GOP can be good for video compression but it can result in big zap-time (the duration of time between changing a channel and displaying a new channel.)\n", "type": "integer", "x-api-allow": [ "smartcam" ] } } }, "track_info_audio": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } }, { "$ref": "#/components/schemas/track_info_audio_specific" } ] }, "track_info_audio_specific": { "type": "object", "properties": { "channels": { "description": "The number of audio channels.", "type": "integer", "example": 2, "x-api-allow": [ "smartcam" ] }, "sample_rate": { "description": "Sample rate, in hertz -\nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\n", "type": "integer", "example": 8000, "x-api-allow": [ "smartcam" ] }, "language": { "description": "Language value of the track, if applicable.", "type": "string", "example": "eng" } } }, "ti_audio_aac_spec": { "type": "object", "title": "AAC codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 48000, "oneOf": [ { "const": 96000 }, { "const": 88200 }, { "const": 64000 }, { "const": 48000 }, { "const": 44100 }, { "const": 32000 }, { "const": 24000 }, { "const": 22050 }, { "const": 16000 }, { "const": 12000 }, { "const": 11025 }, { "const": 8000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 2, "oneOf": [ { "const": 1 }, { "const": 2 }, { "const": 3 }, { "const": 4 }, { "const": 5 }, { "const": 6 }, { "const": 7 } ] } } }, "ti_audio_ac3_spec": { "type": "object", "title": "AC3/EAC3 codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 48000, "oneOf": [ { "const": 48000 }, { "const": 44100 }, { "const": 32000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 2, "oneOf": [ { "const": 1 }, { "const": 2 }, { "const": 3 }, { "const": 4 }, { "const": 5 }, { "const": 6 } ] } } }, "ti_audio_mp2a_spec": { "type": "object", "title": "MP2 audio codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 48000, "oneOf": [ { "const": 48000 }, { "const": 44100 }, { "const": 32000 }, { "const": 24000 }, { "const": 22050 }, { "const": 16000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 2, "oneOf": [ { "const": 1 }, { "const": 2 } ] } } }, "ti_audio_mp3_spec": { "type": "object", "title": "MP3 codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 8000, "oneOf": [ { "const": 48000 }, { "const": 44100 }, { "const": 32000 }, { "const": 24000 }, { "const": 22050 }, { "const": 16000 }, { "const": 12000 }, { "const": 11025 }, { "const": 8000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 2, "oneOf": [ { "const": 1 }, { "const": 2 } ] } } }, "ti_audio_opus_spec": { "type": "object", "title": "OPUS codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 48000, "oneOf": [ { "const": 48000 }, { "const": 24000 }, { "const": 16000 }, { "const": 12000 }, { "const": 8000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 2, "oneOf": [ { "const": 1 }, { "const": 2 }, { "const": 3 }, { "const": 4 }, { "const": 5 }, { "const": 6 } ] } } }, "ti_audio_pcma_spec": { "type": "object", "title": "PCM A-law/PCM mu-law codec", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\nThe allowed values are: \n`0` - to copy input sample rate, a number (input audio is resampled with equalization)\n", "type": "integer", "example": 8000, "oneOf": [ { "const": 8000 }, { "const": 0 } ] }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 1, "oneOf": [ { "const": 1 } ] } } }, "ti_audio_pcm_spec": { "type": "object", "title": "RAW PCM", "properties": { "sample_rate": { "description": "Sample rate, in hertz - \nthe number of samples per second taken from a continuous signal to make a discrete or digital signal.\n", "type": "integer", "example": 8000 }, "channels": { "description": "The number of audio channels in an output stream.", "type": "integer", "example": 1 } } }, "ti_audio_aac": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_aac_spec" } ] }, "ti_audio_ac3": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_ac3_spec" } ] }, "ti_audio_mp2a": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_mp2a_spec" } ] }, "ti_audio_mp3": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_mp3_spec" } ] }, "ti_audio_opus": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_opus_spec" } ] }, "ti_audio_pcma": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_pcma_spec" } ] }, "ti_audio_pcm": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "$ref": "#/components/schemas/transcoder_track_info_audio_spec" }, { "$ref": "#/components/schemas/ti_audio_pcm_spec" } ] }, "track_info_text": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } }, { "$ref": "#/components/schemas/track_info_text_specific" } ] }, "track_info_text_specific": { "type": "object", "properties": { "language": { "description": "Language value of the track, if applicable.", "type": "string", "example": "eng" } } }, "track_info_application": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } }, { "$ref": "#/components/schemas/track_info_application_specific" } ] }, "track_info_application_specific": { "type": "object", "properties": { "language": { "description": "Language value of the track, if applicable.", "type": "string", "example": "eng" } } }, "track_info_metadata": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } } ] }, "track_info_full": { "allOf": [ { "$ref": "#/components/schemas/track_info_base" }, { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] } } }, { "$ref": "#/components/schemas/track_info_audio_specific" }, { "$ref": "#/components/schemas/track_info_video_specific" }, { "$ref": "#/components/schemas/track_info_video_configurable" } ] }, "closed_captions": { "type": "object", "properties": { "language": { "description": "Language of closed captions.", "type": "string", "example": "eng" }, "name": { "description": "Under what name the audio track will be displayed on the player.", "type": "string", "example": "English" } } }, "media_info": { "allOf": [ { "$ref": "#/components/schemas/media_info_specific" }, { "$ref": "#/components/schemas/media_info_common" } ] }, "media_info_specific": { "type": "object", "properties": { "flow_type": { "description": "Whether it is a file with a finite start and end time or a live stream.", "oneOf": [ { "const": "file" }, { "const": "stream" }, { "const": "dvr_file" }, { "const": "dvr_stream" } ], "type": "string", "example": "stream" }, "tracks": { "description": "Information about available tracks (video, audio, or text).", "items": { "allOf": [ { "$ref": "#/components/schemas/track_info" } ] }, "type": "array", "default": [], "x-api-allow": [ "smartcam" ] }, "duration": { "type": "number", "format": "ticks", "description": "Duration of the media, if applicable.", "x-format-description": "ticks" } } }, "media_info_common": { "type": "object", "properties": { "provider": { "description": "The media provider of this content.", "type": "string", "example": "Netflix" }, "title": { "description": "Human-readable title of the media.", "type": "string", "example": "Bunny" }, "stream_id": { "type": "integer", "example": 253, "description": "The identifier of the transport stream for MPEG TS streams." }, "program_id": { "type": "integer", "example": 110, "description": "The program ID for MPEG TS streams." } } }, "transcoder_track_info": { "oneOf": [ { "$ref": "#/components/schemas/transcoder_track_info_audio" }, { "$ref": "#/components/schemas/transcoder_track_info_video" } ], "discriminator": { "propertyName": "content", "mapping": { "video": "#/components/schemas/transcoder_track_info_video", "audio": "#/components/schemas/transcoder_track_info_audio" } } }, "transcoder_track_info_audio": { "oneOf": [ { "$ref": "#/components/schemas/ti_audio_aac" }, { "$ref": "#/components/schemas/ti_audio_opus" }, { "$ref": "#/components/schemas/ti_audio_mp2a" }, { "$ref": "#/components/schemas/ti_audio_mp3" }, { "$ref": "#/components/schemas/ti_audio_ac3" }, { "$ref": "#/components/schemas/ti_audio_pcma" }, { "$ref": "#/components/schemas/ti_audio_pcm" } ], "discriminator": { "propertyName": "codec", "mapping": { "aac": "#/components/schemas/ti_audio_aac", "opus": "#/components/schemas/ti_audio_opus", "mp2a": "#/components/schemas/ti_audio_mp2a", "mp3": "#/components/schemas/ti_audio_mp3", "ac3": "#/components/schemas/ti_audio_ac3", "eac3": "#/components/schemas/ti_audio_ac3", "pcmu": "#/components/schemas/ti_audio_pcma", "pcma": "#/components/schemas/ti_audio_pcma", "pcm": "#/components/schemas/ti_audio_pcm" } }, "x-record-definition": "#/components/schemas/ti_audio_aac" }, "transcoder_track_info_video": { "allOf": [ { "$ref": "#/components/schemas/track_info_base_configurable" }, { "type": "object", "properties": { "codec": { "description": "Codec of the track. Different codecs do **not** get the same track.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "h264", "x-api-allow": [ "smartcam", "iris-hal" ] }, "preset": { "description": "A set of values that determine a certain encoding speed, which influences a compression ratio.\nA slower preset will provide better compression (compression is quality per file size).\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_preset" }, "default": "veryfast", "allOf": [ { "$ref": "#/components/schemas/tc_preset" } ], "example": "medium" }, "profile": { "description": "Limits the output to a specific H.264 profile.", "x-api-allow": [ "iris-hal", "smartcam" ], "allOf": [ { "$ref": "#/components/schemas/tc_profile" } ] }, "level": { "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n", "x-api-allow": [ "iris-hal", "smartcam" ], "anyOf": [ { "allOf": [ { "$ref": "#/components/schemas/h264_level" } ] }, { "allOf": [ { "$ref": "#/components/schemas/hevc_level" } ] }, { "allOf": [ { "$ref": "#/components/schemas/mp2v_level" } ] } ] }, "size": { "description": "Target size of the image and the strategy to achieve it.", "x-api-allow": [ "smartcam" ], "allOf": [ { "$ref": "#/components/schemas/tc_size" } ] }, "sar": { "description": "Target aspect ratio.", "allOf": [ { "$ref": "#/components/schemas/tc_sar" } ] }, "logo": { "description": "The configuration of a logo \"burned\" into the video track.\nThe transcoder adds the logo before the video is resized as specified in the `size` option. \nThis means that the logo can be visibly stretched if the size was changed significantly.\n", "allOf": [ { "$ref": "#/components/schemas/tc_logo" } ] }, "alogo": { "description": "The configuration of a logo added to the video track after the video was resized as specified in the `size` option.\n\nThis prevents the logo picture from stretching that might occur when the `logo` option is used.\nYou will need to prepare and specify a separate file with a logo for each size of the resulting video track.\n", "allOf": [ { "$ref": "#/components/schemas/tc_logo" } ] }, "fps": { "description": "Frame rate (frames per second) - the speed at which a sequence of images is displayed on a screen.\n\nHigher frame rates capture more images per second, which makes for smoother video.\nThe standard frame rate for color television in the Phase Alternating Line (PAL) format is 25 fps.\nThe standard frame rate for color television in the National Television System Committee (NTSC) format is 29,97 fps\n(a little bit lower than the original frame rate of black and white NTSC television, equal to 30 fps.)\nIf interlaced TV is used, two fields of each frame (with odd-numbered lines and with even-numbered lines) are displayed consequently,\nbut the frame rate is actually not doubled (50 half-frames are still equal to 25 original frames).\n", "x-api-allow": [ "smartcam", "iris-hal" ], "allOf": [ { "$ref": "#/components/schemas/tc_fps" } ] }, "bframes": { "description": "Number of B-frames between I and P-frames. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n\nWhen set to 0, this option disables b-frames. This may be necessary, for example, when broadcasting to RTSP.\n", "enum": [ 0, 1, 2, 3, 4 ], "type": "integer", "example": 3 }, "refs": { "description": "The number of reference frames in a GOP.\nReference frames are frames of a compressed video that are used to define other frames (P-frames and B-frames).\n", "maximum": 6, "minimum": 1, "type": "integer" }, "gop": { "description": "Sets the number of frames in a GOP.\nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\n", "x-api-allow": [ "smartcam" ], "type": "integer", "example": 150 }, "qp_range": { "description": "The ranges of the quantization parameter for different types of frames in a GOP.\n\nQuantization is an algorithm used for video compression. It is based on fragmentation of video frames.\nIncreasing this parameter allows to improve the compression but may lower the picture quality.\nUsually, these ranges are defined automatically by the transcoder, but for some types of transcoders it makes sense to set them manually.\n", "allOf": [ { "$ref": "#/components/schemas/tc_qp_range" } ] }, "threads": { "description": "Number of threads used by the encoder when transcoding with CPU (it is not used for other types of transcoder).\nThis parameter allows to increase performance by adding new threads. By default, it is autodetected.\n", "type": "integer" }, "open_gop": { "description": "Whether open GOP is used. Open GOP contains P-frames that refer to the frames before the keyframe.\nIt allows to decrease bitrate to 5-7%, but can result in breaking the picture.\n\nDo not enable this option if the track will be played over segment-based protocols (HLS, DASH, etc.) because \nabsence of keyframes or IDR frames in the same segment with P-frames may prevent playback. \n[Read more about tracks, GOP and segments](https://flussonic.com/doc/live-stream-internals/).\n", "default": false, "type": "boolean" }, "interlace": { "description": "This parameter is used to get an interlaced stream from a progressive one.\nThe allowed values are `true` (interlaced video), `false` (progressive video), or one of the methods for producing interlaced video supported for the selected type of transcoder.\n", "allOf": [ { "$ref": "#/components/schemas/interlace_settings" } ] }, "rc_method": { "description": "A method for creating output video with constant bitrate suitable for broadcasting to television networks.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-rc_method" }, "allOf": [ { "$ref": "#/components/schemas/rc_method" } ] }, "temporal_tradeoff": { "description": "Drop some frames in dynamic scenes when the transcoder does not have time to code all frames.\nThe allowed values are:\n\n* `15` - drop 1 from 5\n* `13` - drop 1 from 3\n* `12` - drop 1 from 2\n* `23` - drop 2 from 3\n* `0` - do not drop frames\n", "type": "integer" }, "vbv_bufsize": { "description": "Virtual buffer size, it bits. The default value is `gop / fps * bitrate`.\n", "type": "integer" }, "resize_mode": { "description": "The mode to be used for resizing video tracks. It is one of the computing platforms for Flussonic Coder:\n\n* vic - Video Image Converter, specific for Jetson Nvidia\n* cuda - CUDA (or Compute Unified Device Architecture)\n", "allOf": [ { "$ref": "#/components/schemas/transcoder_resize_mode" } ] }, "burn": { "description": "Configuration of burn-in text, timestamp, or subtitles to video frames.", "x-api-allow": [ "smartcam", "iris-hal" ], "allOf": [ { "$ref": "#/components/schemas/tc_burn" } ] }, "extra": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Some additional options." }, "counters": { "description": "Transcoder per encoder counters", "allOf": [ { "$ref": "#/components/schemas/tc_encoder_counters" } ] } } } ] }, "transcoder_track_info_audio_spec": { "type": "object", "properties": { "codec": { "description": "Audio codec (the AAC codec is used by default).", "anyOf": [ { "$ref": "#/components/schemas/frame_audio_codec" } ], "type": "string", "example": "opus", "default": "aac", "x-api-allow": [ "smartcam", "iris-hal" ] }, "language": { "description": "Language value of the track, if applicable.", "type": "string", "example": "eng" }, "input_track": { "description": "Input audio track to be transcoded.\n", "anyOf": [ { "type": "integer" } ], "example": 1 }, "volume": { "description": "Output audio volume. The value can be specified in decibels (dB) or it can be an integer/float (3, 0.5, etc.).\n\nIf it is just an integer or a float, the output audio volume is calculated by this formula:\n\n`output_volume = volume * input_volume`\n\nIf specified in decibels (dB), the output audio volume is calculated as follows:\n\n`output_volume = input_volume +/- volume`\n\ndepending whether it is a positive (+9dB) or a negative value (-6dB).\n\nBy default it equals to 1 (the input audio volume).\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/change-stream-volume/" }, "type": "string", "pattern": "^([0-9]+(\\.[0-9]+)?|(\\+|\\-)[0-9]+(\\.[0-9]+)?dB)$", "example": "-6dB" }, "split_channels": { "description": "This option allows to split each audio track with multiple channels into several mono tracks.\n", "type": "boolean", "default": false }, "counters": { "description": "Transcoder per encoder counters", "allOf": [ { "$ref": "#/components/schemas/tc_encoder_counters" } ] } } }, "tc_encoder_counters": { "type": "object", "properties": { "dup_frames_added": { "type": "integer", "description": "Duplicate frames generated by transcoder when input FPS falls below target" }, "overlimit_frames_removed": { "type": "integer", "description": "Frames discarded by transcoder to maintain target FPS" } } }, "webrtc_prefer_video_codec": { "type": "string", "enum": [ "h264", "av1" ] }, "webrtc_transport": { "type": "string", "oneOf": [ { "title": "UDP", "const": "udp" }, { "title": "TCP", "const": "tcp" } ] }, "output_audio": { "type": "string", "oneOf": [ { "title": "Keep", "const": "keep", "description": "Keep the original audio codec." }, { "title": "AAC", "const": "aac", "description": "Keep AAC if available or transcode to AAC; delete other tracks if any." }, { "title": "Add_AAC", "const": "add_aac", "description": "Add AAC if it was not available already while keeping the original track." } ] }, "h264_level": { "enum": [ "1", "1b", "1.1", "1.2", "1.3", "2", "2.1", "2.2", "3", "3.0", "3.1", "3.2", "4", "4.0", "4.1", "4.2", "5", "5.1", "5.2", "6", "6.1", "6.2" ], "type": "string" }, "hevc_level": { "enum": [ "1", "2", "2.1", "3", "3.1", "4", "4.1", "5", "5.1", "5.2", "6", "6.1", "6.2" ], "type": "string" }, "mp2v_level": { "oneOf": [ { "title": "Low", "const": "low" }, { "title": "Main", "const": "main" }, { "title": "High", "const": "high" }, { "title": "High 1440", "const": "high1440" } ], "type": "string" }, "transcoder_device": { "oneOf": [ { "title": "CPU", "const": "cpu" }, { "title": "Intel Quick Sync Video", "const": "qsv" }, { "title": "Nvidia NVENC (encoder only)", "const": "nvenc" }, { "title": "Flussonic Coder", "const": "coder" } ], "type": "string" }, "transcoder_device_stats": { "type": "object", "properties": { "type": { "allOf": [ { "$ref": "#/components/schemas/transcoder_device" } ], "description": "The type of the device used for transcoding.", "example": "cpu" }, "id": { "allOf": [ { "$ref": "#/components/schemas/tc_deviceid" } ], "description": "The ID of the device used for transcoding.\n\nIn PUT requests, you can use `auto` for Flussonic to set the ID itself. \nIn the response to GET requests, the `id` will always be a number.\n" }, "name": { "type": "string", "description": "The name of the transcoder device." }, "can_logo": { "type": "boolean", "description": "Shows if the device can put a logo on the image." }, "can_interlace": { "type": "boolean", "description": "Shows if the device can make an interlaced stream from a progressive one." }, "can_internal": { "type": "boolean", "description": "Shows if the transcoder with this device can run in the same process as Flussonic Media Server." }, "memTotal": { "type": "integer", "description": "Total RAM on the device." }, "memFree": { "type": "integer", "description": "Free RAM." }, "memUsed": { "type": "integer", "description": "Utilized RAM." }, "reconfig_support": { "allOf": [ { "$ref": "#/components/schemas/tc_reconfig_support" } ], "description": "The ability of the device to be reconfigured online, i.e. without complete restart of the transcoder.\n\n`full` means that both decoder and encoder can be reconfigured online.\n`encoder` means that only encoder can be reconfigured online.\n`decoder` means that only decoder can be reconfigured online.\n`false` means that online reconfiguration is not supported.\n" }, "gpu_temp": { "type": "integer", "description": "GPU temperature, C." }, "gpu_enc": { "type": "integer", "description": "GPU encoder load percentage." }, "gpu_dec": { "type": "integer", "description": "GPU decoder load percentage." }, "gpu_sm": { "type": "integer", "description": "GPU shared memory amount." } } }, "transcoder_resize_mode": { "oneOf": [ { "title": "VIC", "const": "vic" }, { "title": "CUDA", "const": "cuda" } ], "type": "string" }, "tc_bitrate": { "anyOf": [ { "oneOf": [ { "title": "Copy the input track as-is without any processing.", "const": "copy", "type": "string" } ] }, { "type": "integer" } ] }, "tc_reconfig_support": { "anyOf": [ { "type": "string", "oneOf": [ { "title": "Full", "const": "full" }, { "title": "Decoder", "const": "decoder" }, { "title": "Encoder", "const": "encoder" } ] }, { "type": "boolean", "oneOf": [ { "title": "False", "const": false } ] } ] }, "tc_deviceid": { "anyOf": [ { "oneOf": [ { "title": "Auto", "const": "auto", "type": "string" } ] }, { "type": "integer" } ] }, "tc_fps": { "anyOf": [ { "oneOf": [ { "title": "Any", "const": "any", "type": "string" }, { "title": "Auto", "const": "auto", "type": "string" } ] }, { "type": "integer" } ] }, "tc_preset": { "oneOf": [ { "title": "Slow", "const": "slow" }, { "title": "Medium", "const": "medium" }, { "title": "Fast", "const": "fast" }, { "title": "Very fast", "const": "veryfast" }, { "title": "Ultra fast", "const": "ultrafast" } ], "type": "string" }, "tc_profile": { "oneOf": [ { "title": "Simple", "const": "simple" }, { "title": "Baseline", "const": "baseline" }, { "title": "Main", "const": "main" }, { "title": "Main 10", "const": "main10" }, { "title": "High", "const": "high" }, { "title": "High 10", "const": "high10" }, { "title": "High 422", "const": "high422" }, { "title": "High 444", "const": "high444" } ], "type": "string" }, "rc_method": { "oneOf": [ { "title": "VBR", "const": "vbr", "description": "The encoder will not encode a stream to be DVB compliant.\nHowever, VBR (Variable Bit Rate) produces better compression compared to CBR at about the same quality.\n" }, { "title": "CBR", "const": "cbr", "description": "The encoder will produce a DVB compliant stream.\nThe bitrate of the output stream will be stable to fit the fixed-bandwidth channel. \nIn other words, we guarantee that the bitrate has a certain upper bound in a sliding window.\n" }, { "title": "CBR2pass", "const": "cbr2pass", "description": "The encoder will encode the video once in CBR, \nthen it will encode it second time in CBR but using the information from the previous pass to improve quality.\n" } ], "type": "string" }, "tc_label_box": { "type": "object", "properties": { "borderw": { "description": "The width, in pixel, of the border to be drawn around the text, timestamp, or subtitles.", "type": "integer", "example": 10 }, "color": { "description": "Box color.", "anyOf": [ { "type": "string", "examples": { "default": { "value": "black" }, "mylive/bunny": { "value": "white" } } }, { "type": "string", "format": "hexcolor", "example": "#d62d20", "x-format-description": "hexcolor" } ] }, "alpha": { "description": "Box opacity (use values from 0.1 to 1.0, 0.0 - completely transparent, 1.0 - completely opaque).", "maximum": 1, "minimum": 0, "type": "number", "example": 0 } } }, "tc_label_font": { "type": "object", "properties": { "file": { "description": "The subpath to the `.ttf` font file in the `font` subdirectory of the `/etc/flussonic/` directory. \nThis means you can place the font file like `/etc/flussonic/font/SomeFont.ttf`.\n\nIf the font file specified is missing in `/etc/flussonic/font/`, the default `FiraCode-Regular.ttf` font will be used, which is included in Flussonic.\n\nYou can also specify the full path to a font file. Make sure you put the font file in the directory you specified. \n", "type": "string", "example": "/usr/share/fonts/truetype/freefont/FONT_NAME.ttf" }, "size": { "description": "The font size in pixel.", "type": "integer", "example": 24 }, "color": { "description": "Font color.", "anyOf": [ { "type": "string", "examples": { "default": { "value": "black" }, "mylive/bunny": { "value": "white" } } }, { "type": "string", "format": "hexcolor", "example": "#d62d20", "x-format-description": "hexcolor" } ] }, "alpha": { "description": "Font opacity (use values from 0.1 to 1.0, 0.0 - completely transparent, 1.0 - completely opaque).", "maximum": 1, "minimum": 0, "type": "number", "example": 1 } } }, "tc_label": { "type": "object", "properties": { "text": { "description": "Text, time, or subtitles to burn-in to video frames.\n\n* For text - it is the text\n* For subtitles - it is the subtitles track, e.g., `t1`.\n* For time - it is the time in one of the formats:\n** `%T` - the time in 24-hour notation (`%H:%M:%S`).\n** `%F` - equivalent to `%Y-%m-%d` (the ISO 8601 date format).\n", "type": "string" }, "x": { "description": "The offset of the text, timestamp, or subtitles position, in pixel, to the right or left to the center of the screen.", "type": "integer" }, "y": { "description": "The offset of the text, timestamp, or subtitles position, in pixel, up or down to the center of the screen.", "type": "integer" }, "position": { "description": "Position to burn text.", "oneOf": [ { "title": "Top left", "const": "tl" }, { "title": "Bottom left", "const": "bl" }, { "title": "Top right", "const": "tr" }, { "title": "Bottom right", "const": "br" }, { "title": "Center", "const": "c" }, { "title": "Center top", "const": "ct" }, { "title": "Center bottom", "const": "cb" } ], "type": "string" }, "font": { "description": "Font to be used for text, timestamp, or subtitles burn-in to video frames.", "allOf": [ { "$ref": "#/components/schemas/tc_label_font" } ] }, "box": { "description": "Parameters of the box around the text, timestamp, or subtitles.", "allOf": [ { "$ref": "#/components/schemas/tc_label_box" } ] } } }, "tc_burn": { "type": "object", "properties": { "text": { "description": "Configuration of burn-in text to video frames. \n", "allOf": [ { "$ref": "#/components/schemas/tc_label" } ] }, "time": { "description": "Configuration of burn-in timestamp to video frames. \n", "allOf": [ { "$ref": "#/components/schemas/tc_label" } ] }, "sub": { "description": "Configuration of burn-in subtitles to video frames. \n", "allOf": [ { "$ref": "#/components/schemas/tc_label" } ] } } }, "tc_global": { "type": "object", "properties": { "target": { "description": "What use is the stream intended for.\nSpecifying this option applies useful defaults in conformance with standards\n", "type": "string", "oneOf": [ { "title": "UHD television", "const": "uhdtv", "description": "The resulting stream is ready to be transmitted over Ultra HD television networks\ni.e. H.264 4K (2160p) with higher bitrate, BT.2020 colors\nand AAC audio\n" }, { "title": "HD television", "const": "hdtv", "description": "The resulting stream is ready to be transmitted over HD television networks,\ni.e. H.264 1080p with BT.709 colors\nand AAC audio\n" }, { "title": "SD television (PAL)", "const": "sdtv_pal", "description": "The resulting stream is ready to be transmitted over older European (PAL) television networks,\ni.e. H.264 576i video with lower bitrate, BT.470 colors, 16:11 SAR\nand AAC audio\n" }, { "title": "SD television (NTSC)", "const": "sdtv_ntsc", "description": "The resulting stream is ready to be transmitted over older American (NTSC) television networks,\ni.e. H.264 480i video with lower bitrate, SMPTE 170M colors, 40:33 SAR\nand AC-3 audio\n" } ] }, "hw": { "description": "Transcoder hardware device type to be used for transcoding a stream.", "allOf": [ { "$ref": "#/components/schemas/transcoder_device" } ] }, "deviceid": { "description": "Identifier of hardware device to be used for transcoding a stream.", "allOf": [ { "$ref": "#/components/schemas/tc_deviceid" } ] }, "external": { "description": "If this parameter is se to `true` (by default), the transcoder runs in a separate process from Flussonic.\n\nIf it is set to `false`, the transcoder will run in the same process as Flussonic. \nThis mode speeds up encoding, especially when encoding audio or when using an Nvidia device. \nHowever, a transcoder error may cause Flussonic to crash.\n", "type": "boolean" }, "gop": { "description": "GOP (group of pictures) size (in frames) to be applied for any video track in the stream.\nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\nMay be overridden for a track. \n", "type": "integer", "example": 150 }, "burn": { "description": "Configuration of text, timestamp or subtitles burn-in to video frames. \n", "allOf": [ { "$ref": "#/components/schemas/tc_burn" } ] } } }, "tc_crop": { "type": "object", "properties": { "left": { "description": "The `x` coordinate of the upper-left corner of the output video withing the input video.", "type": "integer" }, "top": { "description": "The `y` coordinate of the upper-left corner of the output video withing the input video.", "type": "integer" }, "width": { "description": "The width of the output video.", "type": "integer" }, "height": { "description": "The height of the output video.", "type": "integer" } }, "required": [ "left", "top", "width", "height" ] }, "deinterlace_settings": { "anyOf": [ { "oneOf": [ { "title": "Enabled", "const": true, "description": "Deinterlacing enabled." }, { "title": "Disabled", "const": false, "description": "Deinterlacing disabled." } ], "type": "boolean" }, { "oneOf": [ { "title": "Adaptive", "const": "adaptive", "description": "Use adaptive deinterlacing method." }, { "title": "CUDA yadif", "const": "yadif", "description": "Use CUDA yadif deinterlacing method." } ], "type": "string" } ] }, "tc_decoder": { "type": "object", "properties": { "pix_fmt": { "description": "The required pixel format according to a color model.", "allOf": [ { "$ref": "#/components/schemas/frame_video_pix_fmt" } ] }, "deinterlace": { "description": "Activate deinterlacing, i.e., converting an interlaced image to a progressive image. \nIt is necessary for comfortable viewing of legacy TV video on PC/mobile devices.\n", "allOf": [ { "$ref": "#/components/schemas/deinterlace_settings" } ], "example": true }, "deinterlace_rate": { "description": "This parameter is used when encoding with Nvidia NVENC.\nYou can remove duplicate frames that were produced after deinterlacing, preventing increased bitrate, by one of two methods.\n", "oneOf": [ { "title": "Frame", "const": "frame", "description": "From field sequence `1a 1b 2a 2b 3a 3b` we get frame sequence `1a1b 2a2b 3a3b`. \nThe FPS stays the same.\n" }, { "title": "Field", "const": "field", "description": "Fields `1a 1b 2a 2b 3a 3b` transform into `1a1b 1b2a 2a2b 2b3a` frames. \nThe FPS increases two times after transcoding.\n" } ], "type": "string", "example": "frame" }, "crop": { "description": "Video cropping options.", "allOf": [ { "$ref": "#/components/schemas/tc_crop" } ] }, "drop_frame_interval": { "description": "This parameter is applicable for NVIDIA Jetson transcoder only.\nThis is the number of frames after wich the decoder skips a frame and, thus, allows to save the resources. For example:\n\n* 1 - sip each frame\n* 2 - skip each second frame\n* 3 - skip each third frame, etc.\n\nThis option can be useful for streams with high FPS (e.g., 60) as it allows to increase the bandwidth.\n", "maximum": 1000, "minimum": 1, "type": "integer", "example": 3 }, "no_dpb": { "description": "Switch off the decoded picture buffer. Works for the streams with 1 reference frame.\nThe default value is `false`.\n", "type": "boolean", "example": false }, "streaming_frame": { "description": "Allow receiving incomplete frames from the input buffer.\nIf it is set to `true`, the decoder can start decoding before the complete frame is received.\n", "type": "boolean", "example": false } } }, "tc_audio_opts": { "oneOf": [ { "$ref": "#/components/schemas/tc_audio_aac" }, { "$ref": "#/components/schemas/tc_audio_opus" }, { "$ref": "#/components/schemas/tc_audio_mp2a" }, { "$ref": "#/components/schemas/tc_audio_mp3" }, { "$ref": "#/components/schemas/tc_audio_ac3" }, { "$ref": "#/components/schemas/tc_audio_pcma" }, { "$ref": "#/components/schemas/tc_audio_pcm" } ], "discriminator": { "propertyName": "codec", "mapping": { "aac": "#/components/schemas/tc_audio_aac", "opus": "#/components/schemas/tc_audio_opus", "mp2a": "#/components/schemas/tc_audio_mp2a", "mp3": "#/components/schemas/tc_audio_mp3", "ac3": "#/components/schemas/tc_audio_ac3", "eac3": "#/components/schemas/tc_audio_ac3", "pcmu": "#/components/schemas/tc_audio_pcma", "pcma": "#/components/schemas/tc_audio_pcma", "pcm": "#/components/schemas/tc_audio_pcm" } }, "x-record-definition": "#/components/schemas/tc_audio_all" }, "tc_audio_all": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_aac" } ] }, "tc_audio_base": { "type": "object", "properties": { "codec": { "description": "Audio codec (the AAC codec is used by default).", "anyOf": [ { "$ref": "#/components/schemas/frame_audio_codec" }, { "$ref": "#/components/schemas/frame_audio_raw_codec" } ], "type": "string", "example": "opus", "default": "aac" }, "bitrate": { "description": "Audio bitrate. The allowed values are:\n\n* `copy` - the bitrate or the original stream is copied to the outgoing stream.\n* a full number of bits (e.g., 64000) or a short form of the number with `k` (e.g., 64k).\n", "allOf": [ { "$ref": "#/components/schemas/tc_bitrate" } ], "example": 64000 }, "avol": { "description": "Output audio volume. The value can be specified in decibels (dB) or it can be an integer/float (3, 0.5, etc.).\n\nIf it is just an integer or a float, the output audio volume is calculated by this formula:\n\n`output_volume = avol * input_volume`\n\nIf specified in decibels (dB), the output audio volume is calculated as follows:\n\n`output_volume = input_volume +/- avol`\n\ndepending whether it is a positive (+9dB) or a negative value (-6dB).\n\nBy default it equals to 1 (the input audio volume).\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/change-stream-volume/" }, "type": "string", "pattern": "^([0-9]+(\\.[0-9]+)?|(\\+|\\-)[0-9]+(\\.[0-9]+)?dB)$", "example": "-6dB" }, "split_channels": { "description": "This option allows to split each audio track with multiple channels into several mono tracks.\n", "type": "boolean", "default": false } } }, "tc_audio_aac": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_aac_spec" } ] }, "tc_audio_opus": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_opus_spec" } ] }, "tc_audio_ac3": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_ac3_spec" } ] }, "tc_audio_pcma": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_pcma_spec" } ] }, "tc_audio_pcm": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_pcm_spec" } ] }, "tc_audio_mp3": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_mp3_spec" } ] }, "tc_audio_mp2a": { "allOf": [ { "$ref": "#/components/schemas/tc_audio_base" }, { "$ref": "#/components/schemas/ti_audio_mp2a_spec" } ] }, "tc_size": { "type": "object", "properties": { "width": { "description": "The picture width in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\nA value of -1 means that the heigth will be used to calculate the actual width with maintaining the aspect ratio.\nOnly one of width or height may have value -1.\nZero value (0) is not allowed.\n", "type": "integer", "minimum": -1 }, "height": { "description": "The picture height in pixels on the display where it will be played by a player.\nIf you need to insert a web-player into a web page, use this value for choosing the player size.\nA value of -1 means that the width will be used to calculate the actual height with maintaining the aspect ratio.\nOnly one of width or height may have value -1.\nZero value (0) is not allowed.\n", "type": "integer", "minimum": -1 }, "strategy": { "description": "The algorithm of the picture resizing: crop, scale, or fit.\n", "default": "fit", "oneOf": [ { "title": "Crop", "const": "crop" }, { "title": "Scale", "const": "scale" }, { "title": "Fit", "const": "fit" } ], "type": "string", "example": "crop" }, "background": { "description": "The color of the area in the player that is not occupied by the video after resizing. \nIt is used only with the 'fit' strategy.\n", "anyOf": [ { "oneOf": [ { "title": "Blur", "const": "blur" } ], "type": "string" }, { "type": "string", "format": "hexcolor", "x-format-description": "hexcolor" } ] } } }, "tc_sar": { "type": "object", "properties": { "x": { "description": "The first number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar" }, "type": "integer" }, "y": { "description": "The second number in SAR. SAR is the ratio of the width of the display video representation to the width of the pixel representation.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar" }, "type": "integer" } } }, "tc_logo": { "type": "object", "properties": { "path": { "description": "Path to the logo image.", "type": "string", "pattern": "^.+\\.png$", "example": "@chan.png" }, "x": { "description": "The offset of the logo position, in pixel, to the right or left to the center of the screen.", "type": "integer", "example": 10 }, "y": { "description": "The offset of the logo position, in pixel, up or down to the center of the screen.", "type": "integer", "example": 10 }, "position": { "description": "Position to place the logo.\n", "oneOf": [ { "title": "Top left", "const": "tl" }, { "title": "Top right", "const": "tr" }, { "title": "Bottom left", "const": "bl" }, { "title": "Bottom right", "const": "br" }, { "title": "Center", "const": "c" } ], "type": "string", "example": "tl" } } }, "tc_qp_range": { "type": "object", "properties": { "qpmini": { "description": "Minimal quantization parameter for I-frames.", "maximum": 100, "minimum": 0, "type": "integer" }, "qpmaxi": { "description": "Maximal quantization parameter for I-frames.", "maximum": 100, "minimum": 0, "type": "integer" }, "qpminp": { "description": "Minimal quantization parameter for P-frames.", "maximum": 100, "minimum": 0, "type": "integer" }, "qpmaxp": { "description": "Maximal quantization parameter for P-frames.", "maximum": 100, "minimum": 0, "type": "integer" }, "qpminb": { "description": "Minimal quantization parameter for B-frames.", "maximum": 100, "minimum": 0, "type": "integer" }, "qpmaxb": { "description": "Maximal quantization parameter for B-frames.", "maximum": 100, "minimum": 0, "type": "integer" } } }, "interlace_settings": { "anyOf": [ { "oneOf": [ { "title": "Top field first", "const": "tff", "description": "Top field first. This method is used with hw=qsv, nvenc." }, { "title": "Bottom field first", "const": "bff", "description": "Bottom field first. This method is used with hw=qsv, nvenc." }, { "title": "Top field first separated", "const": "tff_separated", "description": "Top field first, separated fields. This method is used with hw=qsv." }, { "title": "Bottom field first separated", "const": "bff_separated", "description": "Bottom field first, separated fields. This method is used with hw=qsv." }, { "title": "MBAFF", "const": "mbaff", "description": "Interlaced libx264 MBAFF method. This method is used only with hw=cpu." } ], "type": "string" }, { "type": "boolean", "description": "Enables encoding into interlaced video by using the default method for the encoder specified\n(`mbaff` is the default method for `hw=cpu`, `tff` is the default method for `hw=qsv`, `hw=nvenc`)\n" } ] }, "tc_video_opts": { "type": "object", "required": [ "track" ], "properties": { "track": { "description": "Number of a video track.", "type": "integer", "example": 1 }, "bitrate": { "description": "The bitrate of a video track.", "allOf": [ { "$ref": "#/components/schemas/tc_bitrate" } ], "example": 1000000 }, "codec": { "description": "The video codec.", "default": "h264", "oneOf": [ { "title": "H.264", "const": "h264" }, { "title": "HEVC", "const": "hevc" }, { "title": "AV1", "const": "av1" }, { "title": "MP2V", "const": "mp2v" } ], "type": "string" }, "preset": { "description": "A set of values that determine a certain encoding speed, which influences a compression ratio. \nA slower preset will provide better compression (compression is quality per file size).\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_preset" }, "default": "veryfast", "allOf": [ { "$ref": "#/components/schemas/tc_preset" } ], "example": "medium" }, "profile": { "description": "Limits the output to a specific H.264 profile.", "allOf": [ { "$ref": "#/components/schemas/tc_profile" } ] }, "level": { "description": "A set of constraints that indicate a degree of required decoder performance.\nThis parameter is used for compatibility with old devices.\n", "anyOf": [ { "allOf": [ { "$ref": "#/components/schemas/h264_level" } ] }, { "allOf": [ { "$ref": "#/components/schemas/hevc_level" } ] }, { "allOf": [ { "$ref": "#/components/schemas/mp2v_level" } ] } ] }, "size": { "description": "Target size of the image and the strategy to achieve it.", "allOf": [ { "$ref": "#/components/schemas/tc_size" } ] }, "sar": { "description": "Target aspect ratio.", "allOf": [ { "$ref": "#/components/schemas/tc_sar" } ] }, "logo": { "description": "The configuration of a logo \"burned\" into the video track.\nThe transcoder adds the logo before the video is resized as specified in the `size` option. \nThis means that the logo can be visibly stretched if the size was changed significantly.\n", "allOf": [ { "$ref": "#/components/schemas/tc_logo" } ] }, "alogo": { "description": "The configuration of a logo added to the video track after the video was resized as specified in the `size` option.\n\nThis prevents the logo picture from stretching that might occur when the `logo` option is used. \nYou will need to prepare and specify a separate file with a logo for each size of the resulting video track.\n", "allOf": [ { "$ref": "#/components/schemas/tc_logo" } ] }, "fps": { "description": "Frame rate (frames per second) - the speed at which a sequence of images is displayed on a screen.\n\nHigher frame rates capture more images per second, which makes for smoother video.\nThe standard frame rate for color television in the Phase Alternating Line (PAL) format is 25 fps.\nThe standard frame rate for color television in the National Television System Committee (NTSC) format is 29,97 fps\n(a little bit lower than the original frame rate of black and white NTSC television, equal to 30 fps.)\nIf interlaced TV is used, two fields of each frame (with odd-numbered lines and with even-numbered lines) are displayed consequently,\nbut the frame rate is actually not doubled (50 half-frames are still equal to 25 original frames).\n", "allOf": [ { "$ref": "#/components/schemas/tc_fps" } ] }, "bframes": { "description": "Number of B-frames in a GOP. B-frames contain links to keyframes and P-frames before and after themselves.\nB-frames help to compress the video. However, some players impose limitations on this number: usually no more than 2 B-frames are used.\nThis value also defines the GOP structure - the repeated pattern of frames after the keyframe: P, BP, BBP, BBBP, or BBBBP.\n\nWhen set to 0, this option disables b-frames. This may be necessary, for example, when broadcasting to RTSP.\n", "enum": [ 0, 1, 2, 3, 4 ], "type": "integer", "example": 3 }, "refs": { "description": "The number of reference frames in a GOP.\nReference frames are frames of a compressed video that are used to define other frames (P-frames and B-frames).\n", "maximum": 6, "minimum": 1, "type": "integer" }, "gop": { "description": "Sets the number of frames in a GOP. \nThe encoder will create all GOPs of an exactly identical size - as specified in this option.\n", "type": "integer", "example": 150 }, "qp_range": { "description": "The ranges of the quantization parameter for different types of frames in a GOP.\n\nQuantization is an algorithm used for video compression. It is based on fragmentation of video frames.\nIncreasing this parameter allows to improve the compression but may lower the picture quality.\nUsually, these ranges are defined automatically by the transcoder, but for some types of transcoders it makes sense to set them manually.\n", "allOf": [ { "$ref": "#/components/schemas/tc_qp_range" } ] }, "threads": { "description": "Number of threads used by the encoder when transcoding with CPU (it is not used for other types of transcoder).\nThis parameter allows to increase performance by adding new threads. By default, it is autodetected.\n", "type": "integer" }, "open_gop": { "description": "Whether open GOP is used. Open GOP contains P-frames that refer to the frames before the keyframe.\nIt allows to decrease bitrate to 5-7%, but can result in breaking the picture.\n", "default": false, "type": "boolean" }, "interlace": { "description": "This parameter is used to get an interlaced stream from a progressive one.\nThe allowed values are `true` (interlaced video), `false` (progressive video), or one of the methods for producing interlaced video supported for the selected type of transcoder.\n", "allOf": [ { "$ref": "#/components/schemas/interlace_settings" } ] }, "rc_method": { "description": "A method for creating output video with constant bitrate suitable for broadcasting to television networks.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-rc_method" }, "allOf": [ { "$ref": "#/components/schemas/rc_method" } ] }, "temporal_tradeoff": { "description": "Drop some frames in dynamic scenes when the transcoder does not have time to code all frames.\nThe allowed values are: \n\n* `15` - drop 1 from 5\n* `13` - drop 1 from 3\n* `12` - drop 1 from 2\n* `23` - drop 2 from 3\n* `0` - do not drop frames\n", "type": "integer" }, "vbv_bufsize": { "description": "Virtual buffer size, it bits. The default value is `gop / fps * bitrate`.\n", "type": "integer" }, "resize_mode": { "description": "The mode to be used for resizing video tracks. It is one of the computing platforms for Flussonic Coder:\n\n* vic - Video Image Converter, specific for Jetson Nvidia\n* cuda - CUDA (or Compute Unified Device Architecture)\n", "allOf": [ { "$ref": "#/components/schemas/transcoder_resize_mode" } ] }, "burn": { "description": "Configuration of burn-in text, timestamp, or subtitles to video frames.", "allOf": [ { "$ref": "#/components/schemas/tc_burn" } ] }, "extra": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Some additional options." } } }, "transcoder_opts": { "type": "object", "properties": { "global": { "description": "Transcoder settings to be used for transcoding. \n", "allOf": [ { "$ref": "#/components/schemas/tc_global" } ], "x-default": { "$ref": "#/components/schemas/tc_global" } }, "decoder": { "description": "Decoder settings to be used for transcoding. \n", "allOf": [ { "$ref": "#/components/schemas/tc_decoder" } ], "x-default": { "$ref": "#/components/schemas/tc_decoder" } }, "audio": { "description": "List of audio tracks the stream audio track will be transcoded into.\n", "allOf": [ { "$ref": "#/components/schemas/tc_audio_opts" } ], "x-default": { "$ref": "#/components/schemas/tc_audio_opts" }, "deprecated": true, "x-delete-at": 23.09 }, "video": { "description": "List of video tracks the stream video track will be transcoded into. \n", "items": { "allOf": [ { "$ref": "#/components/schemas/tc_video_opts" } ] }, "type": "array", "default": [], "deprecated": true, "x-delete-at": 24.08 }, "tracks": { "description": "Info on the tracks. In the case of iris-hal, the first video track must be\nhigh-resolution track, second one (if present) must be lower-resolution\n", "items": { "allOf": [ { "$ref": "#/components/schemas/transcoder_track_info" } ] }, "type": "array", "default": [], "x-api-allow": [ "smartcam", "iris-hal" ] } } }, "dvr_schedule_range": { "items": { "type": "integer" }, "type": "array" }, "dvr_range": { "type": "object", "properties": { "from": { "description": "The beginning of the recorded DVR range. Use opened_at instead.\nMention that opened_at has milliseconds\n", "type": "integer", "format": "utc", "example": 1525186456, "deprecated": true, "x-delete-at": 24.11, "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 }, "duration": { "description": "The duration of the recorded DVR range.\nUse closed_at instead of this field. \n", "type": "integer", "format": "seconds", "example": 28800, "deprecated": true, "x-delete-at": 24.11, "x-format-description": "seconds" }, "opened_at": { "type": "integer", "format": "utc_ms", "description": "The time when this range was started. Naming is standard for whole flussonic ecosystem.\n\nIs a replacement for field `from`\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "closed_at": { "type": "integer", "format": "utc_ms", "description": "The the of the last recorded data.\n\nPlease notice that closed_at could be changed. There are two reasons.\n- Cleaner process reduced data. Read [more](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_get/response%7Cdvr%7Cepisodes_url).\n- Recording is still working. Near real-time value means that DVR is active at the moment.\n\nThis is a replacement for `duration` field\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 } } }, "dvr_base_config": { "type": "object", "properties": { "storage_limit": { "description": "Maximum disk consumption in bytes. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nThis option affects both continuous recording and locked episodes (see `episodes_url`).\n\nIf `episodes_url` does not respond, the archive clean-up by `storage_limit` is not performed\nto avoid deleting the recordings that should not be deleted.\n", "type": "integer", "format": "bytes", "example": 400000000000, "x-format-description": "bytes" }, "disk_usage_limit": { "description": "Maximum disk consumption in percents. When this limit is reached, \nthe oldest segment of the recording will be overridden by later data.\n\nIt important to understand that this is not a \"per-stream\" option, this option means\nthat cleaning of this stream will be triggered if overall disk usage reaches this number.\n\nIf you have all streams with configuration 98% and one stream with 95%, it will be permanently\nempty.\n", "type": "integer", "format": "percent", "example": 98, "x-format-description": "percent" }, "expiration": { "description": "Archive depth - a period (in seconds) back from the current moment during which the \ncontigious part of archive is stored. \nAs time goes, the parts of the recording which are older than the archive depth are deleted.\n\nIf you have option `episodes_expiration` enabled, then some parts of DVR that are \nlocked by episode signalling mechanism may be kept more than this `expiration` depth.\n\nIf `episodes_url` does not respond, the archive clean-up by `expiration` is not performed;\nonly the archive with expired episodes (`episodes_expiration`) is cleaned up until the `episodes_url` restores.\n", "type": "integer", "format": "seconds", "examples": { "default": { "value": 604800 } }, "x-api-allow": [ "central-layouter" ], "x-format-description": "seconds" }, "episodes_expiration": { "description": "Additional archive depth in seconds for episodes. If set, episodes and their corresponding DVR record\nwill be saved for `expiration + episodes_expiration` seconds.\n\nThe archive clean-up within `[expiration, expiration+episodes_expiration]` seconds of the\nrecording performed depending on [external_episodes_list](https://flussonic.com/doc/api/config-external/#tag/dvr/operation/external_episodes_list)\nresponse of `episodes_url`.\n\nAnything older than `expiration+episodes_expiration` seconds will\nbe cleaned even if `episodes_url` does not respond.\n", "type": "integer", "format": "seconds", "examples": { "default": { "value": 6048000 } }, "x-format-description": "seconds" }, "episodes_url": { "description": "External URL that will be triggered for fetching episodes list.\nTake a look at config_external API for method `external_episodes_list`.\n\nIf the `episodes_url` not set or responds with any HTTP code other than `200` or `501` or does not respond within a timeout,\nthe archive clean-up is only performed by `episodes_expiration` time while `expiration` and `storage_limit` are ignored until the `episodes_url` restores.\n\n\nIf `episodes_url` is a blank string, then current config_external API endpoint will be used to request episodes.\nIt is most common usage of this field.\n", "type": "string", "examples": { "default": { "value": "http://central-host.local/config-external/episodes" }, "simple": { "value": "" } } }, "dvr_replicate": { "description": "Whether DVR replication is used. Replication means that a DVR archive is stored on two (or more) Flussonic servers.\nIt can be used for reliability or for broadcasting with a time shift. Learn more in [Flussonic documentation](https://flussonic.com/doc/scale-dvr-playback-with-new-server/).\n", "type": "boolean", "example": true }, "replication_port": { "description": "Replication port. \nBy default, replication is enabled on the port specified when configuring the M4F source. \nYou can specify a separate port for replication.\n", "allOf": [ { "$ref": "#/components/schemas/network_port" } ], "example": 8002 }, "schedule": { "description": "One or several time intervals for recording by schedule.\nThe beginning and the end of each interval are set in \"hhmm\" format (without leading zeros ) according to UTC standard. \nFor example, `2330` is for 23:30, `800` - for 08:00. The interval can go over midnight, e.g. 22:00-1:30. In this case it is set as follows: `[2200,130]`.\n\nScheduled recording can be useful for the channels with part-time broadcasting. \nIt allows to save disk space significantly.\n", "items": { "allOf": [ { "$ref": "#/components/schemas/dvr_schedule_range" } ] }, "type": "array", "example": [ [ 800, 1600 ], [ 2200, 130 ] ] }, "dvr_offline": { "description": "If this option is enabled, Flussonic detects DVR at the start of the stream,\nbut does not start recording immediately and waits for external API request.\n", "type": "boolean" }, "copy": { "description": "The URL of another storage to copy the blobs (hours of the archive) into. \nCopying is done when a blob is complete (i.e., once an hour), and therefore helps significantly reduce the number of network requests to a cloud storage.\n", "type": "string", "format": "dvr_url", "example": "s3://token@minio.mycompany.com/dvr-bucket", "x-format-description": "dvr_url" }, "keep_locks": { "description": "Whether the locked DVR recordings will be kept when disk usage limit is reached (in bytes or percents).\n\nThis option will be now always enabled, consider managing your free space.\n\nSwitch to `episodes_url` mechanism instead.\n", "type": "boolean", "example": false, "deprecated": true, "x-delete-at": 23.11 } } }, "dvr_storage_config": { "type": "object", "properties": { "name": { "description": "DVR configuration name.", "type": "string", "format": "dvr_name", "openmetrics_label": "dvr_name", "x-primary-key": true, "readOnly": true, "x-api-allow": [ "central-layouter" ], "x-format-description": "dvr_name" }, "root": { "description": "A path where the DVR archive is stored.", "type": "string", "format": "dvr_url", "x-api-allow": [ "central-layouter" ], "x-format-description": "dvr_url" }, "raid": { "description": "This value is present if RAID (redundant array of independent disks) is enabled. Learn more in [Flussonic RAID for DVR](https://flussonic.com/doc/extend-video-storage-on-fly/). \n", "allOf": [ { "$ref": "#/components/schemas/dvr_raid_level" } ] }, "check_mount": { "description": "If this parameter is set to 'true' (by default), \nFlussonic will check if the disks were mounted properly before writing to them.\n", "type": "boolean" }, "active": { "description": "The number of disks to write the archive.", "type": "integer" }, "index": { "description": "A directory on an SSD disk where the data will be cached.", "type": "string", "format": "disk_path", "x-format-description": "disk_path" }, "disks": { "description": "RAID disks mounted on the server.", "type": "array", "items": { "$ref": "#/components/schemas/raid_disk_config" } }, "stats": { "description": "The runtime statistics about DVR.\n", "allOf": [ { "$ref": "#/components/schemas/dvr_storage_stats" }, { "$ref": "#/components/schemas/dvr_capacity_stats" } ], "readOnly": true, "x-api-allow": [ "central-layouter" ] } }, "required": [ "name", "root" ] }, "dvr_raid_level": { "type": "integer", "oneOf": [ { "title": 0, "const": 0, "description": "RAID level 0" } ] }, "dvr_storage_stats": { "type": "object", "properties": { "errors": { "description": "The runtime DVR errors.\n", "allOf": [ { "$ref": "#/components/schemas/dvr_storage_errors" } ] } } }, "dvr_storage_errors": { "type": "object", "properties": { "read_errors": { "description": "Total number of errors while reading the archive.", "type": "integer" }, "write_errors": { "description": "Total number of errors while writing to the archive.", "type": "integer" }, "delete_errors": { "description": "Total number of errors while deleting from the archive.", "type": "integer" }, "collapsed_write_count": { "description": "Total number of collapsed segments while writing to the archive. Collapsed segments are pack of segments written together occur due to lack of storage performance.", "type": "integer" }, "drop_write_count": { "description": "Total number of dropped segments while writing to the archive.", "type": "integer" } } }, "dvr_config": { "allOf": [ { "$ref": "#/components/schemas/dvr_storage_config" }, { "$ref": "#/components/schemas/dvr_base_config" } ] }, "dvr_capacity_stats": { "type": "object", "description": "This list of stats can be used to monitor health of invidiual disk in storage.\n\nThere are several layers of indexes in internal database, here you can validate\nintegrity of data.\n", "properties": { "blobs_count_db": { "description": "The number of blobs on the disk according to centralized Raid DB that is\nused to allocate blobs across whole storage.\n", "type": "integer", "openmetrics_metric": "storage_blobs_count_db", "x-metric-type": "gauge" }, "blobs_count": { "description": "The number of blobs on the disk that are enlisted in individual stream indexes.\nIt must be equal to blobs_count_db and can be different in case of software\nor hardware errors.\n", "type": "integer", "openmetrics_metric": "storage_blobs_count", "x-metric-type": "gauge" }, "size": { "description": "Disk capacity in bytes.\n", "type": "integer", "format": "bytes", "openmetrics_metric": "storage_size", "x-metric-type": "gauge", "x-api-allow": [ "central-layouter" ], "x-format-description": "bytes" }, "used": { "description": "Used disk space in bytes according to linux metrics. It must be equal (almost equal) to\n`used_index`. If it differs more than in 1%, then it means that there are lot of unknown files.\n\nIf this disk is used exclusively for Raid, then it may mean that some blobs are lost from\ndatabase and repairing is required.\n", "type": "integer", "format": "bytes", "openmetrics_metric": "storage_used", "x-metric-type": "gauge", "x-api-allow": [ "central-layouter" ], "x-format-description": "bytes" }, "used_index": { "description": "Used disk space in bytes according to internal database index.\n", "type": "integer", "format": "bytes", "openmetrics_metric": "storage_used_index", "x-metric-type": "gauge", "x-format-description": "bytes" }, "usage": { "description": "Disk utilization percentage.", "type": "integer", "format": "percent", "openmetrics_metric": "storage_usage", "x-metric-type": "gauge", "x-api-allow": [ "central-layouter" ], "x-format-description": "percent" } } }, "raid_disk_config": { "type": "object", "properties": { "path": { "description": "The path to a mounted disk. \n", "example": "volume1", "type": "string", "format": "disk_path", "openmetrics_label": "disk", "x-primary-key": true, "readOnly": true, "x-format-description": "disk_path" }, "mode": { "description": "The mode of using the disk.\n", "example": "keep", "allOf": [ { "$ref": "#/components/schemas/raid_disk_mode" } ] }, "stats": { "description": "The runtime statistics about RAID. The statistics shows the state of disks.\nLearn more in [Flussonic RAID for DVR](https://flussonic.com/doc/extend-video-storage-on-fly/#dvr-flussonic-raid-stats)\n", "allOf": [ { "$ref": "#/components/schemas/raid_disk_stats" }, { "$ref": "#/components/schemas/dvr_capacity_stats" } ], "readOnly": true } }, "required": [ "path" ] }, "raid_disk_mode": { "type": "string", "oneOf": [ { "title": "Normal", "const": "normal", "description": "Flussonic reads the data from and writes it to the hard drive, removing the data according to the DVR settings.\nThe default mode.\n" }, { "title": "Migrate", "const": "migrate", "description": "Flussonic migrates the data from the current hard drive to other hard drives in the array on the fly, cleaning up the current hard drive.\nYou can check that Flussonic finished migrating the data, when there aren't any calls to this hard drive.\nIn the meantime, Flussonic continues archive recording, so it isn't interrupted. You don't need to restart Flussonic after you remove the disk.\nUse this option if you need to extract the hard drive and don't want to lose the data.\n" }, { "title": "Readonly", "const": "readonly", "description": "Flussonic reads the data from the hard drive, restricting any writing to it. Use this option in the following cases: \nFlussonic reads the data from the hard drive until the data on it expires. Then Flussonic deletes the data.\n* If the hard drive is worn out and you can't write the data to the hard drive, delete files, update the index, or copy the data to another hard drive.\n* If the hard drive stores the records written in the `keep` mode and you want to store the data permanently.\n" }, { "title": "Rescue", "const": "rescue", "description": "Flussonic copies all the data from the old hard drive that's going to fail and stops writing the data to this hard drive.\nFlussonic doesn't delete the data from the hard drive, unlike in `migrate` mode, so you can still access the archive.\nUse this option in an emergency.\n" }, { "title": "Abandon", "const": "abandon", "description": "Flussonic stops writing new data on this hard drive. When the data becomes obsolete, Flussonic deletes it, updating the index. \nUse this option when you want to replace a hard drive, for example, with a larger one.\n" }, { "title": "Keep", "const": "keep", "description": "Flussonic writes the data to the hard drive, but doesn't delete it.\nUse this option if you need to store the entire archive permanently.\n" } ] }, "raid_disk_errors": { "type": "object", "properties": { "eacces": { "description": "Total number of permission denied errors\n", "example": 1, "type": "integer" }, "eagain": { "description": "Total number of temporarily unavailable errors\n", "example": 1, "type": "integer" }, "ebusy": { "description": "Total number of file busy errors\n", "example": 1, "type": "integer" }, "edquot": { "description": "Total number of disk quota exceeded errors\n", "example": 1, "type": "integer" }, "emfile": { "description": "Total number of too many open files errors\n", "example": 1, "type": "integer" }, "enoent": { "description": "Total number of no such file or directory errors\n", "example": 1, "type": "integer" }, "enodev": { "description": "Total number of no such device errors\n", "example": 1, "type": "integer" }, "enospc": { "description": "Total number of no space left on device errors\n", "example": 1, "type": "integer" }, "erofs": { "description": "Total number of read-only file system errors\n", "example": 1, "type": "integer" }, "connection_timeout": { "description": "Total number of connection timeout errors\n", "example": 1, "type": "integer" }, "ssl_error": { "description": "Total number of SSL errors\n", "example": 1, "type": "integer" }, "nxdomain": { "description": "Total number of non-existing domain errors\n", "example": 1, "type": "integer" }, "econnrefused": { "description": "Total number of connection refused errors\n", "example": 1, "type": "integer" }, "other": { "description": "Total number of other errors\n", "example": 1, "type": "integer" } } }, "raid_disk_stats": { "type": "object", "properties": { "mounted": { "description": "Whether the disk is mounted correctly.", "type": "boolean" }, "mode": { "description": "The mode of using the disk.\n", "example": "keep", "allOf": [ { "$ref": "#/components/schemas/raid_disk_mode" } ] }, "io_usage": { "description": "Disk I/O utilization percentage from `/proc/devstat`.", "type": "integer", "format": "percent", "openmetrics_metric": "raid_disk_io_usage", "x-metric-type": "gauge", "x-format-description": "percent" }, "migration_speed": { "description": "The speed of copying the last blob, in bytes per second.", "type": "integer", "format": "speed", "x-format-description": "speed" }, "migration_eta": { "description": "The estimated migration end time, in UTC seconds.", "type": "integer", "format": "utc", "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 }, "migration_updated": { "description": "The time when the values of `migration_speed` and `migration_eta` were last updated.", "type": "integer", "format": "utc", "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 }, "errors": { "description": "Errors of using the disk.\n", "allOf": [ { "$ref": "#/components/schemas/raid_disk_errors" } ] } } }, "dvr_write_counters": { "type": "object", "properties": { "segments_written": { "type": "integer", "description": "How many segments have been written since stream start\n", "openmetrics_metric": "segments_written" }, "segments_skipped": { "type": "integer", "description": "How many segments were not written due to delay of storage.\n\nThey could be written, if storage was faster, but they were deleted from memory.\n" }, "segments_failed": { "type": "integer", "description": "How many segments got some error from the storage during write\n" }, "segments_written_collapsed": { "type": "integer", "description": "Total amount of segments that were written in batch with another one.\n\nFor 2 segments written in a single batch, here will be recorded 1.\n\nMonitor this to see how your storage is delaying\n" }, "segments_written_fast": { "type": "integer", "description": "How many segments were written faster than 1/2 of segment duration\n" }, "segments_written_slow": { "type": "integer", "description": "How many segments were written slower than 1/2 of segment duration, but faster than 90%\nof segment duration\n" }, "segments_written_delayed": { "type": "integer", "description": "How many segments were written slower than 90% of segment duration, which means\nthat DVR cannot write this stream\n" }, "segments_discontinuity": { "type": "integer", "description": "How many segments have timestamps gap or different media info between them while source is being written to the archive. This counter does not change during replication.\n" } } }, "dvr_read_source_counters": { "type": "object", "properties": { "ram": { "description": "Number of times when requested segment was readed from RAM.", "type": "integer", "example": 100 }, "cache": { "description": "Number of times when requested segment was readed from cache.", "type": "integer", "example": 100 }, "local": { "description": "Number of times when requested segment was readed from local DVR.", "type": "integer", "example": 10 }, "remote": { "description": "Number of times when requested segment was readed from remote DVR.", "type": "integer", "example": 10 } } }, "dvr_read_popularity_counters": { "allOf": [ { "$ref": "#/components/schemas/dvr_read_source_counters" }, { "type": "object", "properties": { "enoent": { "description": "Number of times when requested segment was not found.", "type": "integer", "example": 0 } } } ] }, "dvr_read_popularity_stats": { "type": "object", "properties": { "today": { "description": "Read counters for the current day segments.", "allOf": [ { "$ref": "#/components/schemas/dvr_read_popularity_counters" } ] }, "yesterday": { "description": "Read counters for yesterday's segments.", "allOf": [ { "$ref": "#/components/schemas/dvr_read_popularity_counters" } ] }, "week": { "description": "Read counters for one week old segments.", "allOf": [ { "$ref": "#/components/schemas/dvr_read_popularity_counters" } ] }, "other": { "description": "Read counters for segments older than week.", "allOf": [ { "$ref": "#/components/schemas/dvr_read_popularity_counters" } ] } } }, "dvr_read_performance_stats": { "type": "object", "properties": { "segments_read_fast": { "allOf": [ { "$ref": "#/components/schemas/dvr_read_source_counters" } ], "description": "How many segment read operations were performed faster than 1/2 of segment duration, grouped by source\n" }, "segments_read_slow": { "allOf": [ { "$ref": "#/components/schemas/dvr_read_source_counters" } ], "description": "How many segment read operations were performed slower than 1/2 of segment duration, but faster than 90%\nof segment duration, grouped by source\n" }, "segments_read_delayed": { "allOf": [ { "$ref": "#/components/schemas/dvr_read_source_counters" } ], "description": "How many segment read operations were performed slower than 90% of segment duration, which means \nplayback may stall and move jerkily, grouped by source\n" }, "segments_read_enoent": { "type": "integer", "description": "How many segment read operations have been performed on segments that are not present on the DVR\n" }, "segments_read_failed": { "type": "integer", "description": "How many segment read operations were performed with errors\n" } } }, "dvr_export_job": { "description": "DVR export job", "type": "object", "properties": { "id": { "description": "Job ID", "type": "string", "format": "uuid", "example": "3c448252-2516-4950-a1f6-fa2c7e8f4cb1", "x-format-description": "uuid" }, "name": { "description": "Source stream name", "type": "string", "example": "demo" }, "from": { "description": "Beginning of the range to export", "type": "integer", "format": "utc_ms", "example": 1730205876000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "duration": { "description": "Duration of the range to export", "type": "integer", "format": "milliseconds", "example": 4200000, "x-format-description": "milliseconds" }, "path": { "description": "Destination file path", "examples": { "local": { "value": "/home/example/file.mp4" }, "s3": { "value": "s3://example.com/bucket/path/to/file.mp4" } }, "type": "string" }, "packing": { "description": "How to pack a recording data in the exported file", "oneOf": [ { "type": "string", "const": "fragmented", "description": "Make a fragmented MP4.\nThis allows a download to start with a minimal delay.\nThe resulting file may be not playable by some old players.\n" }, { "type": "string", "const": "compat", "description": "Construct a traditional MP4 file.\nThis may require a significant time to start (especially with large `duration`)\nbut the resulting file is compatible with all players.\n" } ], "default": "fragmented", "example": "compat" }, "timelapse": { "description": "Request a timelapse instead of normal speed", "oneOf": [ { "type": "string", "const": true }, { "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" } ] }, "timelapse_kbps": { "description": "Custom bitrate for timelapse", "type": "integer", "example": 3000 }, "started_at": { "description": "When this job was started", "type": "number", "format": "utc_ms", "example": 1730479930721, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "finished_at": { "description": "When this job finished (successfully or not)", "type": "number", "format": "utc_ms", "example": 1730479931103, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "status": { "description": "Status of this job", "oneOf": [ { "type": "string", "const": "running", "description": "The job is currently running" }, { "type": "string", "const": "succeeded", "description": "The job has finished successfully" }, { "type": "string", "const": "failed", "description": "The job has encountered an error" }, { "type": "string", "const": "canceled", "description": "The job has been canceled by user" } ] }, "error": { "description": "when status='failed' this field contains a reason for failure", "type": "string", "example": "no_dvr" } }, "required": [ "name", "from", "duration", "path" ] }, "dvr_export_job_list": { "type": "object", "properties": { "jobs": { "description": "List of known DVR jobs", "type": "array", "items": { "$ref": "#/components/schemas/dvr_export_job" } } } }, "dvr_consistency_errors": { "description": "Errors found during DVR consistency checks", "type": "object", "properties": { "name": { "description": "stream name", "type": "string", "example": "demo" }, "errors": { "description": "List of errors found during checks", "type": "array", "items": { "type": "object", "properties": { "failed_check": { "description": "Name of the check that raised this error", "type": "string", "example": "blob_coherence" }, "details": { "description": "Arbitrary details that can help to understand the problem", "type": "object", "additionalProperties": { "type": "string" } } } } } } }, "cache_spec": { "type": "object", "properties": { "path": { "description": "The path where the files from the cloud or HTTP are cached to speed up broadcasting.", "type": "string", "format": "disk_path", "example": "/storage/cache", "x-format-description": "disk_path" }, "reference": { "description": "The name of the cache.", "type": "string", "format": "cache_name", "example": "cache1", "x-format-description": "cache_name" }, "misses": { "description": "The number of requests necessary for a file to be cached.", "type": "integer", "example": 3 }, "storage_limit": { "description": "Maximum disk consumption in bytes. \nWhen this limit is reached, the oldest files will be overridden by later files.\n", "type": "integer", "format": "bytes", "example": 400000, "x-format-description": "bytes" }, "expiration": { "description": "A period (in seconds) back from the current moment during which the files are stored.\nAs time goes, the files which are older than this period are being overridden by the later files.\n", "type": "integer", "format": "seconds", "example": 3600, "x-format-description": "seconds" } } }, "vbi_line": { "anyOf": [ { "maximum": 23, "minimum": 6, "type": "integer" }, { "maximum": 335, "minimum": 318, "type": "integer" } ] }, "ttxt_descriptors": { "properties": { "page": { "description": "Page number of the teletext received from an SDI card.\nIt is defined according to ETS 300 706 teletext specification.\n\nThe information about the pages is received from the stream provider.\n", "type": "integer", "x-primary-key": true, "example": 100 }, "lang": { "description": "The language code of the teletext.", "anyOf": [ { "$ref": "#/components/schemas/language_value" } ] }, "type": { "description": "Teletext page type defined according to the Specification for Service Information (SI) in DVB systems, 6.2.32 Teletext descriptor in EN 300 468 Digital Video Broadcasting (DVB).", "enum": [ "initial", "subtitle", "impaired" ], "type": "string", "example": "initial" } }, "required": [ "page", "lang", "type" ], "type": "object" }, "vbi_service": { "enum": [ "ttxt" ], "type": "string" }, "srt_config": { "allOf": [ { "type": "object", "properties": { "port": { "description": "Listening port or a `host:port` pair for the SRT configuration.\nMust be unique on the whole server.\n", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "example": 9050 }, "timeout": { "description": "Data transmission timeout in seconds. \nIf set to `false` then data transmission time is unlimited. This is a defalut behavior.\n", "anyOf": [ { "type": "integer", "format": "seconds", "x-format-description": "seconds" }, { "enum": [ false ], "type": "boolean" } ], "x-notice": "SRTO_RCVTIMEO SRTO_SNDTIMEO (ms, -1 no limit)", "example": 10 } } }, { "$ref": "#/components/schemas/srt_config_base" } ] }, "srt_config_base": { "type": "object", "properties": { "minversion": { "description": "The minimum SRT version that is required from the peer for SRT publication.\n", "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$", "example": "1.1.0" }, "version": { "description": "Required SRT version.\n", "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$", "example": "1.3.0" }, "enforcedencryption": { "description": "Whether both connection parties must have the same password set (including empty, in other words, with no encryption). \nIf the passwords do not match or only one side is unencrypted, the connection is rejected. \nThe default value is `true`.\n", "type": "boolean", "example": true }, "passphrase": { "description": "The password for the encrypted transmission. \nIts length should be not less than 10 and not more than 79 characters.\n\nUnlike [password](https://flussonic.com/doc/api/reference/#tag/stream/operation/stream_save%7Cbody%7Cpassword),\nthe passphrase is not transmitted openly but is used to encrypt the key that is transmitted by the Caller\nand decoded by Listener.\n", "type": "string", "minLength": 10, "maxLength": 79, "example": "9876543210", "x-notice": "SRTO_PASSPHRASE (\"\")" }, "linger": { "description": "The time, in seconds, that the socket waits for the unsent data before closing. \nThe default value is 180.\n", "type": "integer", "format": "seconds", "x-notice": "SRTO_LINGER on, (180s) (off - 0s)", "example": 15, "x-format-description": "seconds" }, "latency": { "description": "The latency value for both directions of the socket.\nBy default initial value latency is 0 when transmitting and 120ms when receiving video.\nActual value established after connection handshake.\nIncreased value helps tolerate network losses and delays.\n", "type": "integer", "format": "milliseconds", "x-notice": "SRTO_LATENCY", "example": 150, "x-format-description": "milliseconds" }, "streamid": { "description": "A string of maximum 512 characters set on the socket before the connection. \n\nThis string is a part of a callback that is sent by the caller and regisered by the listener. \nBased on this information the listener can accept or reject the connection, select the desired data stream, or set an appropriate passphrase for the connection.\n\nIts format is `#!::` optionally followed by the parameters:\n* `r=` - stream name\n* `m=` - mode expected for the connection: `publish` (if the caller wants to send the stream data) or `request` (if the caller wants to receive the stream).\n* `password=` - a password for the authorization in a publish session (not recommended, better use `passphrase` option instead)\n\nDuring SRT sessions the following parameters are automaticly added to streamid:\n* `s=` - the identifier of a session\n* `a=` - Flussonic version\n\nNOTE: you can specify a string in the format you need; to disable this extension, you need specify empty string.\n", "type": "string", "maxLength": 512, "example": "#!::r=my-stream,m=publish" } } }, "mpegts_lang_track": { "anyOf": [ { "enum": [ "default" ], "type": "string" }, { "type": "string" } ] }, "stream_dvr_specific_spec": { "type": "object", "properties": { "reference": { "description": "Stream can refer to the globally declared DVR. This option referres to a single DVR entry.", "type": "string", "format": "dvr_name", "example": "localdvr0", "x-format-description": "dvr_name" }, "remotes": { "description": "The address of the source from which Media server will read the archive. This address will not be used for capturing live video, it is strictly for data exchange on the availability of the archive and the transmission of segments.", "type": "array", "items": { "type": "string", "format": "dvr_url", "pattern": "^(m4f|m4fs|m4s|m4ss|hls)://.*$", "examples": { "default": { "value": "m4f://clusterkey@secondserver/otherstream" } }, "x-format-description": "dvr_url" } }, "root": { "description": "If no `reference` specified, then `root` must be specified. Video recording will be made to `root/name` directory.\nThis option works only in media server and should be used only as a quickstart mechanism. Should be avoided in large installations, because it mixes infrastructure and content setup and lacks configurability.", "type": "string", "format": "dvr_url", "examples": { "default": { "value": "/storage" } }, "x-format-description": "dvr_url" } } }, "stream_dvr_spec": { "allOf": [ { "$ref": "#/components/schemas/stream_dvr_specific_spec" }, { "$ref": "#/components/schemas/dvr_base_config" } ] }, "transponder_pid": { "type": "object", "properties": { "pid": { "description": "A PID to assign to a matched track or system table.\nPID identifies the payload (media or service) in the resulting MPTS stream.\n\nMultiplexer will include only the tracks with specified PIDs.\n\nIt is possible to set PID values for video, audio and other media tracks, as well as for PMT and SDT.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/multiplex-several-streams-into-mpts-for-contribution/#choosing-output-tracks" }, "allOf": [ { "$ref": "#/components/schemas/ts_pid" } ], "x-primary-key": true, "openmetrics_label": "pid" }, "content": { "description": "Content of the track.", "enum": [ "system", "video", "audio", "application", "metadata" ], "type": "string", "example": "audio" }, "codec": { "description": "Codec for this pid. Use this if just content+track is not enough.", "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "example": "scte35" }, "track": { "description": "Index of a track with specified content and maybe codec.\nE.g. when you specify content=audio and track=2 the second audio track will be selected.\nIf you specify content=audio, codec=aac and track=1, the first AAC track will be selected\neven if it is a third audio track and fifth track in stream media_info\n", "type": "integer", "example": 1 }, "bitrate": { "description": "Bitrate of the track.", "type": "integer", "format": "speed", "example": 2543, "x-format-description": "speed" }, "stream_type": { "description": "Custom program element type in PMT\nCombined with bypass (content=metadata, track=0) this option makes\nproprietary PSI streams appear in PMT program info with given stream_type field\n\nThis is an optional parameter for advanced users. By default, the media Server\nis automatically sets the stream_type according to the track codec.\n", "type": "integer", "minimum": 1, "maximum": 255, "example": 12 }, "es_info": { "description": "Raw elementary stream descriptors to describe proprietary stream in PMT program info\nPlese refer to ISO/IEC 13818-1 section 2.6 for syntax\n\nThis is an optional parameter for advanced users. By default, the media Server\nis automatically sets the stream_type according to the track codec.\n", "type": "string", "format": "hexbinary", "example": "52010D", "x-format-description": "hexbinary" }, "stats": { "description": "Detailed runtime information about the multiplexer pid.", "allOf": [ { "$ref": "#/components/schemas/transponder_pid_stats" } ], "readOnly": true } }, "required": [ "pid", "content", "track" ] }, "transponder_pid_stats": { "type": "object", "properties": { "payload": { "description": "The payload bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "pid_payload", "x-metric-type": "counter", "x-format-description": "bytes" }, "fillers": { "description": "The filler bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "pid_fillers", "x-metric-type": "counter", "x-format-description": "bytes" }, "stuffing": { "description": "The stuff packets count.", "type": "integer", "openmetrics_metric": "pid_stuffing", "x-metric-type": "counter" }, "trimmed_bytes": { "description": "The trimmed bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "pid_trimmed_bytes", "x-metric-type": "counter", "x-format-description": "bytes" }, "trimmed_frames": { "description": "The trimmed frames count.", "type": "integer", "openmetrics_metric": "pid_trimmed_frames", "x-metric-type": "counter" } } }, "multiplexer_stats": { "type": "object", "properties": { "payload": { "description": "The payload bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "multiplexer_payload", "x-metric-type": "counter", "x-format-description": "bytes" }, "encoded": { "description": "The encoded bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "multiplexer_encoded", "x-metric-type": "counter", "x-format-description": "bytes" }, "fillers": { "description": "The filler packets count.", "type": "integer", "openmetrics_metric": "multiplexer_fillers", "x-metric-type": "counter" }, "stuffing": { "description": "The stuff packets count.", "type": "integer", "openmetrics_metric": "multiplexer_stuffing", "x-metric-type": "counter" }, "trimmed_bytes": { "description": "The trimmed bytes count.", "type": "integer", "format": "bytes", "openmetrics_metric": "multiplexer_trimmed_bytes", "x-metric-type": "counter", "x-format-description": "bytes" }, "trimmed_frames": { "description": "The trimmed frames count.", "type": "integer", "openmetrics_metric": "multiplexer_trimmed_frames", "x-metric-type": "counter" }, "ts_overflow": { "description": "Is TS overflowed. True if no stuffing at last time.", "type": "boolean" } } }, "vision_spec": { "type": "object", "properties": { "alg": { "description": "The algorithm used for video analytics.\n", "type": "string", "oneOf": [ { "const": "faces", "description": "The algorithm for face recognition is used." }, { "const": "plates", "description": "The algorithm for license plate recognition is used." } ], "example": "faces", "x-api-allow": [ "vision-config-external", "vision", "central", "watcher-admin", "watcher-client" ] }, "areas": { "description": "This parameter allows you to select specific polygonal area(s) for detection.\nBy default, it is empty, and the recognition system searches over the entire camera field of view.\n\nEach area is specified as a sequence of comma-separated coordinates of vertices of the polygon: `x0,y0,x1,y1,x2,y2,...`.\nThe vertices are specified in a counter-clockwise direction. Multiple areas are separated by `:`.\n", "type": "string", "x-api-allow": [ "vision-config-external", "vision", "central", "watcher-admin", "watcher-client" ] } } }, "auth_spec": { "type": "object", "properties": { "url": { "description": "The URL of an HTTP backend.", "allOf": [ { "$ref": "#/components/schemas/auth_url" } ], "example": "http://middleware-address/auth/v2" }, "domains": { "description": "Specifying the domains, within which playing this video is allowed. \nThis does not work for those clients that do not pass the value of Referer HTTP header.\n", "items": { "type": "string" }, "type": "array", "example": [ "mycompany.com" ] }, "max_sessions": { "description": "The maximal number of streams or files the user can view simultaneously.\nThis limitation allows to prevent users from full restreaming to their servers.\n", "type": "integer", "example": 5000 }, "allowed_countries": { "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that have access to the content without any other checks. \n\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated. \nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/" }, "items": { "type": "string", "format": "iso3166", "x-format-description": "iso3166" }, "type": "array", "example": [ "US", "DE", "GB" ] }, "disallowed_countries": { "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that are banned from accessing the content. \n\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated. \nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/" }, "items": { "type": "string", "format": "iso3166", "x-format-description": "iso3166" }, "type": "array", "example": [ "US", "DE", "GB" ] }, "soft_limitation": { "description": "If this option is enabled and `max_sessions` limitation is used, the extra sessions are interrupted not immediately, but in 30 or 90 seconds.\nThis can be useful for middlewares that cannot generate a new token for every new stream or file request \nand therefore need time to understand that all sessions are being used.\n", "type": "boolean", "example": false }, "session_keys": { "description": "A list of keys to generate a session ID value, allowing to configure the authorization scheme \nwhich is a hash sum calculated as follows: `hash(name + ip + proto)`.\nThis parameter allows to finish one session and start another one with the same authorization token.\nThe keys `name`,`ip`, and `proto` are required.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/authorize-clients/#auth-session-keys" }, "items": { "allOf": [ { "$ref": "#/components/schemas/session_key" } ] }, "type": "array", "example": [ "name", "token", "proto", "ip" ] }, "extra": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Some additional options." } } }, "stream_stats": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "Runtime stream ID. Was used to identify different stream instances", "example": "61893ba6-07b3-431b-b2f7-716ac1643953", "deprecated": true, "x-delete-at": 25.06, "x-format-description": "uuid" }, "source_id": { "type": "string", "format": "uuid", "description": "Use `stream.stats.input.id` if you still need it. This is deprecated\n", "example": "61893be1-054e-4acc-8d24-8ed92efe6ad0", "deprecated": true, "x-delete-at": 25.04, "x-format-description": "uuid" }, "opened_at": { "type": "integer", "format": "utc_ms", "description": "The time when the stream opened before authorization/connection completed(in UTC milliseconds).\n", "example": 1636383729002, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "lifetime": { "type": "number", "format": "milliseconds", "description": "The time period in seconds during which the stream is being captured.\nCan be calculated from `opened_at`\n", "x-api-allow": [ "central", "watcher-core", "watcher-client", "watcher-admin" ], "example": 71977, "x-format-description": "milliseconds" }, "last_dts": { "type": "number", "format": "ticks", "description": "Last frame timestamp read from the stream.", "example": 383835646, "x-format-description": "ticks" }, "last_dts_at": { "type": "number", "format": "utc_ms", "description": "The time when the last time frame was sent to the stream output (in UTC).", "example": 1636383841974, "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "central" ], "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "media_info": { "allOf": [ { "$ref": "#/components/schemas/media_info" } ], "description": "Technical information about the output media content.", "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "central", "smartcam" ] }, "ts_delay": { "type": "number", "format": "ticks", "example": 1284, "description": "The time period during which no frames were received from the stream's input.", "x-api-allow": [ "central", "watcher-core", "watcher-client", "watcher-admin" ], "x-format-description": "ticks" }, "status": { "description": "Indicates the status of the stream.\n", "allOf": [ { "$ref": "#/components/schemas/stream_status" } ], "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "central", "vision" ] }, "backup_running": { "description": "Whether a backup is currently running.", "type": "boolean" }, "push": { "type": "array", "items": { "$ref": "#/components/schemas/push_counters" }, "description": "Per pusher statistic for the stream\n" }, "input": { "description": "Accumulated stats of stream input.\n\nThis is not a duplicate of `streams.inputs[N].stats`, but an accumulator of all active inputs.\n", "allOf": [ { "$ref": "#/components/schemas/input_stats" } ] }, "input_error_rate": { "type": "integer", "description": "The number of packets dropped per second.\n\nSwitch to `stream.stats.input.errors`\n", "example": 0, "x-api-allow": [ "central", "watcher-core", "watcher-client", "watcher-admin" ], "deprecated": true, "x-delete-at": 25.03 }, "inputs_duration": { "default": 0, "format": "seconds", "x-metric-type": "counter", "title": "Input Duration", "description": "Total duration of all inputs successfully captured since `opened_at` (counter)", "type": "integer", "deprecated": true, "x-delete-at": 25.03, "x-format-description": "seconds" }, "inputs_bytes": { "default": 0, "format": "bytes", "title": "Input Traffic", "x-metric-type": "counter", "description": "Total amount of data in all inputs captured since `opened_at` (counter)\nUse `stream.stats.input.bytes`\n", "type": "integer", "deprecated": true, "x-delete-at": 25.03, "x-format-description": "bytes" }, "bytes_in": { "type": "integer", "format": "bytes", "description": "The amount of stream data received from the input.\n\nUse `stream.stats.input.bytes`\n", "openmetrics_metric": "stream_bytes_in", "x-metric-type": "counter", "example": 2445568, "x-api-allow": [ "watcher-core", "central" ], "deprecated": true, "x-delete-at": 25.03, "x-format-description": "bytes" }, "retry_count": { "type": "integer", "description": "The number of attempts to restore the stream if `alive=false`.\nUse `input.retries` instead\n", "openmetrics_metric": "stream_retry_count", "x-metric-type": "counter", "example": 0, "x-api-allow": [ "central", "watcher-core", "watcher-client", "watcher-admin" ], "deprecated": true, "x-delete-at": 25.03 }, "input_bitrate": { "type": "integer", "format": "speed", "description": "Input bitrate.\n\nBetter calculate from input.bytes\n", "example": 186, "x-format-description": "speed" }, "current_agent_id": { "type": "string", "format": "agent_id", "description": "The identifier of the Agent that is currently serving the stream.", "x-api-allow": [ "watcher-core", "central", "watcher-client", "watcher-admin" ], "x-format-description": "agent_id" }, "agent_status": { "enum": [ "connected", "not_connected", "rproxy_not_configured" ], "type": "string", "description": "The status of the Agent serving the stream.", "x-api-allow": [ "watcher-core", "central", "watcher-client", "watcher-admin" ] }, "dvr_enabled": { "description": "If DVR is enabled for the stream.", "type": "boolean" }, "dvr_info": { "description": "The information about the recorded DVR archive.", "allOf": [ { "$ref": "#/components/schemas/dvr_info" } ], "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "central", "central-layouter" ] }, "dvr_replication": { "description": "If DVR replication is enabled for the stream.\nReplication means that a DVR archive is stored on two (or more) Flussonic servers for reliability.\n", "type": "integer", "format": "percent", "deprecated": true, "x-delete-at": 25.03, "x-format-description": "percent" }, "dvr_replication_running": { "description": "If DVR replication is in progress for the stream.\nReplication means that a DVR archive is stored on two (or more) Flussonic servers for reliability.\n\nRead `dvr_write_stats.segments_written_from_replication` instead\n", "type": "boolean", "deprecated": true, "x-delete-at": 25.03 }, "dvr_read_popularity": { "description": "DVR read popularity statistics\nThis list of stats shows \"read depth\" -- how much segments are read from the ram, cache, local DVR or remote DVR.\nIt also shows how segment's popularity changes from day to day. \nThis information can be useful to decide how much disk space needed for DVR cache.\n", "allOf": [ { "$ref": "#/components/schemas/dvr_read_popularity_stats" } ] }, "dvr_read_performance": { "description": "Various statistics on DVR archive read requests, such as read speed and failed requests.\nThis list of stats shows \"read performance\" -- how fast segments were read and from what source the data was finally obtained\n", "allOf": [ { "$ref": "#/components/schemas/dvr_read_performance_stats" } ] }, "dvr_write": { "description": "Various statistics for DVR archive writing\n", "allOf": [ { "$ref": "#/components/schemas/dvr_write_counters" } ] }, "alive": { "default": false, "type": "boolean", "example": true, "description": "Becomes `false` when `ts_delay` > 12000 (= 12 seconds)", "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "central" ] }, "coder_error": { "type": "boolean", "description": "Shows if there was any encoding error.\nWas not fully implemented.\n", "deprecated": true, "x-delete-at": 25.03 }, "bitrate": { "type": "integer", "format": "speed", "description": "Stream bitrate.", "openmetrics_metric": "stream_bitrate", "x-metric-type": "gauge", "example": 186, "x-api-allow": [ "watcher-core", "central", "watcher-client", "watcher-admin" ], "x-format-description": "speed" }, "running_transcoder": { "default": false, "type": "boolean", "description": "If the transcoder is enabled for the stream." }, "transcoder_overloaded": { "type": "boolean", "openmetrics_metric": "stream_transcoder_overloaded", "x-metric-type": "gauge", "description": "If the transcoder is overloaded." }, "start_running_at": { "type": "number", "format": "utc_ms", "description": "Date and time when `status = running` was set.", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "running_on": { "type": "array", "items": { "type": "string", "format": "server_name", "x-format-description": "server_name" }, "description": "List of servers hostnames where the stream is running on.", "example": [ "streamer1.example.com" ], "x-api-allow": [ "central", "watcher-core" ] }, "srt_port_resolve": { "type": "boolean", "example": false, "description": "This flag shows that the stream name was resolved via srt_port_resolve call.\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n" }, "play": { "description": "Playback statistics\n", "allOf": [ { "$ref": "#/components/schemas/play_counters" } ] }, "online_clients": { "type": "integer", "format": "client_count", "description": "The number of clients receiving the stream.\nUse play.play_opened_sessions instead\n", "openmetrics_metric": "stream_online_clients", "x-metric-type": "gauge", "example": 3, "x-api-allow": [ "watcher-core", "central", "watcher-client", "watcher-admin" ], "deprecated": true, "x-delete-at": 25.04, "x-format-description": "client_count" }, "last_access_at": { "type": "number", "format": "utc_ms", "description": "Date and time the stream was accessed the last time.", "example": 1669106270979, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "bytes_out": { "type": "integer", "format": "bytes", "description": "The amount of stream data sent to the clients.", "openmetrics_metric": "stream_bytes_out", "x-metric-type": "counter", "example": 0, "x-api-allow": [ "watcher-core", "central", "watcher-client", "watcher-admin" ], "x-format-description": "bytes" }, "output_bandwidth": { "type": "integer", "format": "bps", "x-metric-type": "gauge", "title": "Output Bandwidth", "description": "Upstream bandwidth on the time of the request.\nThe same as `out_bandwidth`, but this is bits/s\n\nConsider using bytes_out instead.\n", "x-format-description": "bps" } } }, "play_counters": { "type": "object", "properties": { "play_opened_sessions": { "type": "integer", "description": "How many play sessions are active at the moment\n", "openmetrics_metric": "play_opened_sessions", "x-metrics-type": "gauge" }, "play_opened_sessions_by_proto": { "type": "object", "additionalProperties": { "type": "integer" }, "description": "How many play sessions are active at the moment groupped by protocol\n" }, "play_total_sessions": { "type": "integer", "description": "All sessions opened from the stream star\n", "openmetrics_metric": "play_total_sessions" }, "play_total_sessions_by_proto": { "type": "object", "additionalProperties": { "type": "integer" }, "description": "All sessions opened from the stream start groupped by protocol\n" }, "play_bytes": { "type": "integer", "description": "How many bytes sent totally\n", "openmetrics_metric": "play_bytes" }, "play_bytes_by_proto": { "type": "object", "additionalProperties": { "type": "integer" }, "description": "How many bytes sent totally groupped by protocol\n" }, "play_duration": { "type": "integer", "format": "seconds", "description": "How many human-hours (duration*clients) were delivered\n", "openmetrics_metric": "play_duration", "x-format-description": "seconds" }, "play_duration_by_proto": { "type": "object", "additionalProperties": { "type": "integer" }, "format": "seconds", "description": "How many human-hours (duration*clients) were delivered groupped by protocol\n", "x-format-description": "seconds" }, "authorizations_success": { "type": "integer", "description": "Count of successful requests made to external authorization backend\n" }, "authorizations_denied": { "type": "integer", "description": "Count of denied authorization backend requests. This will be incremented when auth backend replies,\nbut denies playing. This means that backend is working, but denying playback.\n" }, "authorizations_failed": { "type": "integer", "description": "Authorization backend can fail and do not reply at all, or give HTTP 500 errors. These cases will be counted here.\n" }, "authorizations_declined": { "type": "integer", "description": "Authorization can be denied without even touching external authorization backend, for example in case of\ndenied IP or token. This counter will increase in this case.\n" } } }, "stream_status": { "type": "string", "oneOf": [ { "title": "Running", "const": "running", "description": "Input is OK, stream is ready to be served to your audience." }, { "title": "Waiting", "const": "waiting", "description": "Flussonic awaits for input (publish) or it's an 'on demand' stream waiting for client." }, { "title": "Error", "const": "error", "description": "Something is wrong and Flussonic is not able to serve the stream to your audience." } ] }, "pusher_status": { "anyOf": [ { "enum": [ "starting", "pending", "retry", "error" ], "type": "string" }, { "allOf": [ { "$ref": "#/components/schemas/session_status" } ] } ] }, "pusher_standby_status": { "oneOf": [ { "title": "Pusher is sending right now packets, because it does not see any traffic from main source.", "const": "active" }, { "title": "Pusher can see traffic from main source, so it is holding and does not send any packets.", "const": "waiting" } ] }, "play_protocols_spec": { "type": "object", "properties": { "whitelist": { "description": "- If set to `True`, server **allows** a playback only for listed protocols;\n- If set to `False`, server **forbids** a playback only for listed protocols;\n", "default": false, "type": "boolean" }, "hls": { "description": "Whether to allow or deny an HLS stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "cmaf": { "description": "Whether to allow or deny an LL-HLS stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "dash": { "description": "Whether to allow or deny a DASH stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "player": { "description": "Whether to allow or deny playback in embed.html, depending on the `whitelist` properties.", "type": "boolean" }, "mss": { "description": "Whether to allow or deny an MSS stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "rtmp": { "description": "Whether to allow or deny an RTMP stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "rtsp": { "description": "Whether to allow or deny an RTSP stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "m4f": { "description": "Whether to allow or deny an M4F stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "m4s": { "description": "Whether to allow or deny an M4S stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "mseld": { "description": "Whether to allow or deny an MSE-LD stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "tshttp": { "description": "Whether to allow or deny an MPEG-TS stream playback over HTTP(S), depending on the `whitelist` properties.", "type": "boolean" }, "webrtc": { "description": "Whether to allow or deny an WebRTC stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "srt": { "description": "Whether to allow or deny an SRT stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "shoutcast": { "description": "Whether to allow or deny a SHOUTcast/Icecast stream playback, depending on the `whitelist` properties.", "type": "boolean" }, "mp4": { "description": "Whether to allow or deny an MP4 file download over HTTP(S), depending on the `whitelist` properties.\nUsed to export DVR segment(s) in MP4 file.\n", "type": "boolean" }, "jpeg": { "description": "Whether to allow or deny delivering JPEG thumbnails over HTTP(S), depending on the `whitelist` properties.", "type": "boolean" }, "api": { "description": "Whether to allow or deny API requests, depending on the `whitelist` properties.", "type": "boolean" } } }, "stream_config": { "allOf": [ { "$ref": "#/components/schemas/stream_config_specific" }, { "$ref": "#/components/schemas/stream_config_base" }, { "$ref": "#/components/schemas/stream_config_input" }, { "$ref": "#/components/schemas/stream_config_media" }, { "$ref": "#/components/schemas/stream_config_onpremises" }, { "$ref": "#/components/schemas/stream_config_single_media" }, { "$ref": "#/components/schemas/stream_config_deprecated" }, { "$ref": "#/components/schemas/stream_config_additional" } ] }, "stream_config_stripped": { "description": "This is a reduced configuration of stream that contains only actual used config.\nCan compare it with stream_config that includes some runtime information and \ninterpretation of stream config information, like config_on_disk\n", "allOf": [ { "$ref": "#/components/schemas/stream_config_specific" }, { "$ref": "#/components/schemas/stream_config_base" }, { "$ref": "#/components/schemas/stream_config_input" }, { "$ref": "#/components/schemas/stream_config_media" }, { "$ref": "#/components/schemas/stream_config_onpremises" }, { "$ref": "#/components/schemas/stream_config_single_media" }, { "$ref": "#/components/schemas/stream_config_deprecated" } ] }, "stream_config_specific": { "type": "object", "properties": { "name": { "type": "string", "format": "media_name", "description": "Globally unique stream name.", "readOnly": true, "x-primary-key": true, "openmetrics_label": "name", "examples": { "default": { "value": "hockey1" }, "mylive/bunny": { "value": "mylive/bunny" }, "decklink": { "value": "Decklink-Stream" }, "dektec": { "value": "Dektec-Stream" }, "test_stream": { "value": "test_stream" } }, "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "vision-config-external", "smartcam", "central-layouter", "vision" ], "x-format-description": "media_name" }, "comment": { "description": "Human-readable description of the stream.\n", "type": "string", "example": "This is a test stream", "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin" ] }, "title": { "description": "Human-readable title of the stream. Provided for SDT MPEG-TS table or\nSDP RTSP title parameter.\n", "type": "string", "example": "Hockey channel", "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin" ] }, "position": { "type": "integer", "format": "sort_index", "description": "Position of the stream in order of streams in the config file, if declared.", "example": 2, "x-format-description": "sort_index" }, "named_by": { "allOf": [ { "$ref": "#/components/schemas/named_by" } ], "description": "Where the stream is initialized: config, user play/publication, or remote\ncluster server.\n", "example": "config", "readOnly": true }, "srt_port_resolve": { "type": "boolean", "example": false, "readOnly": true, "deprecated": true, "x-delete-at": 24.06, "description": "Stream name was resolved via `srt_port_resolve` call.\n\nSee [endpoint](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve)\nand [listener](https://flussonic.com/doc/api/reference/#tag/config/operation/config_save%7Cbody%7Clisteners%7Csrt)\nfor feature description.\n\nThis parameter now lives in `stats` object.\n" }, "template": { "description": "Template of the stream.", "type": "string", "format": "media_name", "example": "sports-hd", "x-format-description": "media_name" }, "recheck_secondary_inputs_interval": { "description": "How often to re-check secondary inputs. If this option is not set than check is never performed.", "type": "integer", "format": "seconds", "example": 120, "x-format-description": "seconds" } }, "required": [ "name" ] }, "stream_config_base": { "type": "object", "properties": { "static": { "default": true, "description": "Whether a stream is `static` or not. \nIf set to `True` the server will try to keep this stream running even if\nthere are no viewers or errors encountered.\n\nStreamer restarts *all* `static` streams even if any internal errors occur\nand the `static` streams crash.\n", "type": "boolean", "example": true, "x-api-allow": [ "watcher-core", "watcher-client", "watcher-admin" ] }, "disabled": { "description": "Whether a stream is disabled. Disabled streams are inactive and do not run. \nDisplayed only with the API calls.\n", "type": "boolean", "example": false, "x-api-allow": [ "watcher-core", "watcher-client", "watcher-admin", "central-layouter" ] } } }, "stream_config_input": { "type": "object", "properties": { "inputs": { "description": "List of stream inputs. \n***Important:*** A stream without any inputs can receive video frames **only** if backup file is specified.\n", "items": { "allOf": [ { "$ref": "#/components/schemas/stream_input" } ] }, "type": "array", "x-api-allow": [ "smartcam", "watcher-core", "vision-config-external", "watcher-client", "watcher-admin", "central-layouter" ] }, "password": { "description": "Specify a password when publishing a password-protected stream.\n\nThe password is passed unencrypted in a query string. \nSome protocols may additionally offer built-in tools for stream protection, \nfor example you can use `passphrase` for SRT publications.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/publish-video-on-media-server/#live-publish-on_publish" }, "type": "string" }, "input_media_info": { "description": "Use this option for fine-grained control over each input track.\n\nYou can select, rename, change name and title for each video, audio track.\n", "allOf": [ { "$ref": "#/components/schemas/input_media_info" } ] }, "provider": { "description": "Human-readable name of the content provider. Used, for example, for MPEG-TS.\n\nDeprecated, use `input_media_info.provider` instead\n", "type": "string", "example": "SportsTV", "deprecated": true, "x-delete-at": 25.03 }, "dvbocr": { "description": "This parameter allows to manage subtitles in an output stream.\n", "oneOf": [ { "const": "replace", "description": "An output stream will have a track containing subtitles converted to a text format (WebVTT)." }, { "const": "add", "description": "An output stream will have two tracks containing subtitles: \nthe original track with subtitles in DVB and a new track with text subtitles.\n" } ], "example": "replace" }, "source_timeout": { "description": "If a connected source does not send any data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n", "anyOf": [ { "type": "integer", "format": "seconds", "x-format-description": "seconds" }, { "enum": [ false ], "type": "boolean" } ], "example": 10, "x-api-allow": [ "watcher-core" ] }, "video_timeout": { "description": "If a connected source does not send video data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n", "type": "integer", "format": "seconds", "example": 20, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "audio_timeout": { "description": "If a connected source does not send audio data within this timeout period (in seconds), \nthe source connection is considered to be lost.\nThis is a default configuration for a stream, can be modified for any input.\n", "type": "integer", "format": "seconds", "example": 20, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "max_retry_timeout": { "description": "The maximum time that Media Server will set for attempts to reconnect to sources when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n", "type": "integer", "format": "seconds", "example": 30, "minimum": 1, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "backup": { "description": "When all inputs are down, this can be used to show at least something to users.\nIt is important to understand that backup video behaves differently, not as inputs. \nIt is not a _last input_ in the list. After any input stops sending frames, timer starts.\nAfter `source_timeout` seconds backup starts working, while all other inputs are still trying to\nconnect and start working.\nSo backup and all inputs are working in parallel.\n", "allOf": [ { "$ref": "#/components/schemas/backup_config" } ], "x-api-allow": [ "watcher-core" ] }, "epg_enabled": { "description": "Whether to extract EPG from the input.", "type": "boolean", "example": true }, "mpegts_ac3": { "description": "It allows to specify pack information about ac3 for outgoing MPEGTS-TS streams. The default value is `system_b`.", "allOf": [ { "$ref": "#/components/schemas/output_mpegts_ac3" } ] } } }, "stream_config_media": { "type": "object", "properties": { "clients_timeout": { "description": "Stream's lifetime after the last client was disconnected (can be expressed in *seconds* or set to `False`). \nApplicable to on-demand streams **only**. \n", "anyOf": [ { "type": "integer" }, { "type": "boolean" } ], "example": 485, "x-api-allow": [ "watcher-core" ] }, "retry_limit": { "description": "Number of attempts for the server to reconnect to a data source.\nApplicable to on-demand streams **only**. If not defined, server will constantly try to reconnect (unlimited number of retries). \nIf the input does not become active after specified amount of attempts, stream shuts down till the next user request.\n", "type": "integer", "x-api-allow": [ "watcher-core" ] }, "transcoder": { "description": "Configuration of the transcoder settings.", "allOf": [ { "$ref": "#/components/schemas/transcoder_opts" } ], "examples": { "mylive/bunny": { "value": {} } }, "x-api-allow": [ "smartcam", "central-layouter" ] }, "thumbnails": { "description": "Configuration of thumbnails generator.", "allOf": [ { "$ref": "#/components/schemas/thumbnails_spec" } ], "x-api-allow": [ "watcher-core" ] }, "jpeg_snapshot_sign_key": { "description": "A key to sign jpeg_snapshot requests", "type": "string", "x-api-allow": [ "watcher-core" ] }, "dvr": { "description": "DVR configuraton.", "allOf": [ { "$ref": "#/components/schemas/stream_dvr_spec" } ], "x-api-allow": [ "watcher-core", "watcher-admin", "watcher-client", "central-layouter" ] }, "on_play": { "description": "Configuration of authorization backend for play sessions.", "externalDocs": { "description": "Find more information about `on_play` and `on_publish` here.", "url": "https://flussonic.com/doc/authorize-clients/#auth-on_play-on_publish" }, "allOf": [ { "$ref": "#/components/schemas/auth_spec" } ], "x-api-allow": [ "watcher-core" ] }, "on_publish": { "description": "Configuration of authorization backend for publish sessions.", "allOf": [ { "$ref": "#/components/schemas/auth_spec" } ] }, "drm": { "description": "Configuraton of Digital Rights Management system (DRM).", "allOf": [ { "$ref": "#/components/schemas/drm_spec" } ] }, "protocols": { "description": "Configuration to allow/forbid playing the stream via various protocols. \n- If the `whitelist` option is set to 'true', the server allows a playback only for listed protocols;\n- If the `whitelist` option is set to 'false', the server forbids a playback for listed protocols;\n- Server allows a playback for all the protocols by default.\n", "allOf": [ { "$ref": "#/components/schemas/play_protocols_spec" } ] }, "prepush": { "description": "The time (in seconds) that Media Server reserves for preloading the data, i. e. *buffering*.\nPrepush is always defined through GoP, but this option provides you with a more flexible way\nto configure the buffer size, e. g. a 1-3 or 7-10 seconds time interval.\n\nThe bigger the buffer size, the better the user experience is for the users\nwith a bad internet connection. However, the latency also increases.\n\nIf set to `False` to remove the latency, the stream's start time \nincreases. To decrease it, reduce the GoP size and make the bitrate higher \nor the video quality lower.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/technology-glossary/#glossary-prepush" }, "anyOf": [ { "type": "boolean" }, { "type": "integer" } ], "example": false, "x-api-allow": [ "watcher-core" ] }, "segment_count": { "description": "Number of segments stored in memory for the segment-based protocols, such as HLS and DASH.\nAdded to HLS live manifest. Do not forget that one more segment is stored for stale clients\nthat come too late, but the latest segment is not shown in the manifest.\n", "type": "integer", "example": 4 }, "segment_duration": { "description": "The time of the segment duration. Used for the protocols like HLS or DASH. \nThe disk config offers this value in seconds.\n", "allOf": [ { "$ref": "#/components/schemas/segment_duration" } ], "example": 5000 }, "chunk_duration": { "description": "Chunk duration in LL-HLS manifest to be used for tunning latency.", "type": "integer", "format": "milliseconds", "example": 200, "x-format-description": "milliseconds" }, "url_prefix": { "description": "A string starting the addresses of separate segments within a *segment-based* playlists (HLS or DASH).\nEach sub-playlist is stored on Media Server.\n\nIf set to `false`, the configured value in a template will be disabled. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/configure-similar-streams-with-templates/#global-options-of-streams" }, "allOf": [ { "$ref": "#/components/schemas/url_prefix" } ] }, "hls_scte35": { "description": "Whether to enable SCTE-35 ad insertion markers signaling in HLS manifest.\nAd markers can be included in SCTE-35 (`scte35`), AWS (`aws`), EXT-X-DATERANGE (`rfc8216`) formats or not included (`false`).\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/advertisement-scte-markers/", "type": "string" }, "oneOf": [ { "title": "aws", "const": "aws", "description": "AWS format" }, { "title": "scte35", "const": "scte35", "description": "ANSI SCTE35 format" }, { "title": "rfc8216", "const": "rfc8216", "description": "Apple RFC 8216 EXT-X-DATERANGE format" } ], "example": "scte35" }, "add_audio_only": { "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/what-is-live-stream/#live-audio_only_hls" }, "type": "boolean", "example": true }, "webrtc_abr": { "description": "WebRTC play configuration for a stream.", "allOf": [ { "$ref": "#/components/schemas/webrtc_abr_opts" } ] }, "pushes": { "description": "A list of pushes. When a server initiates the connection and sends a stream \nto other server(s), it is called a `push`. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/push-video-from-media-server/" }, "items": { "allOf": [ { "$ref": "#/components/schemas/stream_push" } ] }, "type": "array", "x-api-allow": [ "watcher-core", "watcher-admin" ] }, "mpegts_pids": { "description": "This parameter sets PIDs values for outgoing MPEG-TS streams. PID contains information about the TS package content and can be decoded according to special service tables. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks. Tracks are numbered starting from one. \nThe code `a1=123` sets a PID value for the first audio track. It is possible to set the base index for the tracks of a certain type using the 0 (zero) index. \nFor example, `t0=100` sets PID=101 for the first track, 102 for the second, and so on. Numbers can be given in decimal form (by default) or hexadecimal with 16# prefix. \n", "allOf": [ { "$ref": "#/components/schemas/output_mpegts_pids" } ] }, "labels": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 40, "minLength": 1 }, "maxItems": 10, "x-key-type": "string", "description": "Stream labels in key value format.", "x-api-description": { "central": "Stream labels in key value format.\n\nSee [Layouter schema](https://flussonic.com/doc/api/layouter/#tag/stream/operation/streams_list/response%7Cstreams%7Clabels)\nfor more details.\n", "central-layouter": "Stream labels in key value format.\nYou can use labels to control the desired stream layout.\n\nNote, that if you are using a multi-stream agent (i.e. multiple streams use the same agent in their inputs),\nthen the labels of these streams **must** be the same. Otherwise, one or more streams will not work.\n\nLayouter can process next labels:\n\n- With `required_` prefix. If stream has `required_x=y` label, layouter will provision stream only to nodes with label `x=y`.\nIf there are no available nodes with label `x=y`, then the stream will not be provisioned. \n\n**Use cases**\n\nSuppose you have a server used to test new hardware models, and you want the new streams to be provisioned only to the test nodes.\nTo provide this layout you can add the `required_env=test` label for stream and the `env=test` label for test nodes.\n" }, "examples": [ { "key1": "value1", "key2": "value2" }, { "required_env": "test", "location": "eu" } ], "x-api-allow": [ "watcher-core", "central-layouter", "watcher-admin" ] }, "playback_headers": { "description": "This parameter sets playback HTTP headers for streams.\n", "items": { "$ref": "#/components/schemas/playback_headers" }, "maxItems": 10, "type": "array" } } }, "stream_config_onpremises": { "type": "object", "properties": { "cluster_ingest": { "description": "Server configuration for a cluster ingest group.\nUsed to connect several servers between each other to capture the stream(s) and prevent the failover when one of the servers (peers) fails.\nLearn more about cluster ingest in [How to add failover to input](https://flussonic.com/doc/ingest-failover-with-cluster/#ingest-failover-with-cluster).\n", "allOf": [ { "$ref": "#/components/schemas/cluster_ingest_config" } ] }, "cache": { "description": "Configuration of DVR cache.", "allOf": [ { "$ref": "#/components/schemas/cache_spec" } ] }, "meta": { "additionalProperties": { "type": "string" }, "type": "object", "description": "The param is deprecated and now used only for onvif_url and onvif_profile options.", "deprecated": true, "x-delete-at": 23.12 }, "vision": { "allOf": [ { "$ref": "#/components/schemas/vision_spec" } ], "description": "Video analytics parameters.", "x-api-allow": [ "vision-config-external", "smartcam", "vision", "watcher-core", "watcher-admin", "watcher-client", "central-layouter" ] } } }, "stream_config_single_media": { "type": "object", "properties": { "srt": { "description": "A port used for playing SRT streams. Can be set in global settings or for a particular stream. \nIf it is used in the configuration, Flussonic works as a \"Listener\" and receives connection requests from a source working as a \"Caller\".\nLearn more in [SRT port](https://flussonic.com/doc/srt-protocol/#srt_ports).\n", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "example": 9060 }, "srt2": { "description": "A port used for playing SRT2 streams. Can be set in global settings or for a particular stream.\nIf it is used in the configuration, Flussonic works as a \"Listener\" and receives connection requests from a source working as a \"Caller\".\nLearn more in [SRT port](https://flussonic.com/doc/srt-protocol/#srt_ports).\n", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "example": 9062 }, "srt_play": { "description": "SRT play configuration for a stream.", "allOf": [ { "$ref": "#/components/schemas/srt_config" } ] }, "srt2_play": { "description": "SRT2 play configuration for a stream.", "allOf": [ { "$ref": "#/components/schemas/srt_config" } ] }, "srt_publish": { "description": "SRT publishing configuration for a stream.", "allOf": [ { "$ref": "#/components/schemas/srt_config" } ] }, "srt2_publish": { "description": "SRT2 publishing configuration for a stream.", "allOf": [ { "$ref": "#/components/schemas/srt_config" } ] } } }, "stream_config_deprecated": { "type": "object", "properties": { "aac_ab": { "type": "integer", "description": "Bitrate of the AAC audio track." }, "output_audio": { "allOf": [ { "$ref": "#/components/schemas/output_audio" } ], "description": "Audio transcoding options." }, "prefer_codec": { "allOf": [ { "$ref": "#/components/schemas/webrtc_prefer_video_codec" } ], "description": "Preferred codec for WebRTC." }, "transport": { "allOf": [ { "$ref": "#/components/schemas/webrtc_transport" } ], "description": "Transport protocol for WebRTC." }, "max_bitrate": { "type": "integer", "format": "speed", "description": "Maximum bitrate for WebRTC.", "x-format-description": "speed" }, "min_bitrate": { "type": "integer", "description": "Minimum bitrate for WebRTC." }, "frames_timeout": { "type": "integer", "description": "Specifies the period of time, in seconds, \nfor which Flussonic Media Server waits for new frames to come from the data source \nbefore it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Flussonic issues the `frames_restored` event.\n" }, "abr_stepup": { "type": "integer", "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, \nFlussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n" }, "abr_correction": { "type": "integer", "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n" }, "abr_loss_lower": { "type": "number", "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n" }, "abr_loss_upper": { "type": "number", "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n" }, "abr_stepdown": { "type": "number", "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n" }, "abr_mode": { "type": "integer", "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n" }, "abr_debug": { "type": "integer", "description": "Whether adaptive bitrate process is logged." }, "abr_cycles": { "type": "integer", "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n" } } }, "stream_config_additional": { "type": "object", "properties": { "config_on_disk": { "description": "Part of the effective config from the configuration file.", "allOf": [ { "$ref": "#/components/schemas/stream_config_stripped" } ] }, "stats": { "description": "Stream's metrics and other statistical information.", "allOf": [ { "$ref": "#/components/schemas/stream_stats" } ], "readOnly": true, "x-api-allow": [ "watcher-client", "watcher-core", "watcher-admin", "smartcam", "vision", "central-layouter" ] } } }, "template_config": { "allOf": [ { "$ref": "#/components/schemas/template_config_specific" }, { "$ref": "#/components/schemas/stream_config_base" }, { "$ref": "#/components/schemas/stream_config_input" }, { "$ref": "#/components/schemas/stream_config_media" }, { "$ref": "#/components/schemas/stream_config_onpremises" }, { "$ref": "#/components/schemas/stream_config_deprecated" } ] }, "template_config_specific": { "type": "object", "properties": { "name": { "type": "string", "format": "media_name", "description": "Globally unique template name.", "x-primary-key": true, "x-format-description": "media_name" }, "prefixes": { "description": "List of prefixes that will be used to create dynamic names for published streams. \nA template creates one publishing point with one or more publishing locations, depending on the number of prefixes you define. \nAll settings within the template with prefixes apply to the streams published under the name of the prefixes. \nYou can also specify an empty prefix (`\"\"`) to publish a stream with any prefix or even without a prefix. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/configure-similar-streams-with-templates/#stream-templates-page-prefixes" }, "items": { "type": "string", "format": "media_name", "x-format-description": "media_name" }, "type": "array", "example": [ "chats", "" ] } } }, "push_counters": { "type": "object", "properties": { "url": { "description": "Obfuscated URL where to push to", "type": "string", "format": "input_url", "x-format-description": "input_url" }, "opened_at": { "type": "integer", "format": "utc_ms", "description": "The time in milliseconds when the pusher instance was created.", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "status": { "description": "State of the push session.", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/sessions-in-media-server/#events-and-session-states" }, "allOf": [ { "$ref": "#/components/schemas/pusher_status" } ] }, "standby_status": { "description": "State of the standby push.", "allOf": [ { "$ref": "#/components/schemas/pusher_standby_status" } ] }, "bytes": { "type": "integer", "format": "bytes", "description": "Total amount of bytes sent since the pusher was created.", "x-format-description": "bytes" }, "frames": { "type": "integer", "description": "Number of frames sent by this pusher.\n" }, "segments": { "type": "integer", "description": "Number of segments sent by this pusher.\n" }, "pusher_restarts": { "description": "How many times pusher was restarted", "type": "integer" }, "errors_stop_overloaded": { "description": "How many times pusher was stopped due to overload", "type": "integer" }, "errors_dropped_frames": { "description": "Number of dropped frames", "type": "integer" }, "errors_dropped_segments": { "description": "Number of dropped segments", "type": "integer" }, "pids": { "type": "array", "items": { "$ref": "#/components/schemas/push_pid_counters" }, "description": "Per pid statistics for MPEG-TS encoding calculated for the pusher\n" }, "sys_fillers_bytes": { "description": "The fillers bytes count for system traffic.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "sys_payload_bytes": { "description": "The payload bytes count for system traffic.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "sys_stuffing_packets": { "description": "The stuff packets count for system traffic.", "type": "integer" }, "encoded_bytes": { "description": "The encoded bytes count.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "resent_packets": { "description": "Number of retries since the last successful push.", "type": "integer" }, "errors_device_not_opened": { "description": "How much times pusher was unable to open (attach to) device for pushing", "type": "integer" }, "errors_device_buffer_overflow": { "description": "How many times internal device buffer was overflowed.", "type": "integer" }, "errors_audio_frame_decode": { "description": "Number of errors during of audio frame decoding to raw format.", "type": "integer" }, "errors_video_frame_decode": { "description": "Number of errors during of video frame decoding to raw format.", "type": "integer" }, "errors_no_destination": { "description": "How many times pusher did not establish connection because of destination peer is not reached", "type": "integer" }, "errors_tls": { "description": "How many times pusher got TLS errors.", "type": "integer" }, "errors_connection_lost": { "description": "How many times pusher unexpectedly lost connection with peer", "type": "integer" }, "errors_401": { "type": "integer", "description": "How many times we've got 401 (unauthorized).\n" }, "errors_403": { "type": "integer", "description": "How many times we've got 403 (forbidden).\n" }, "errors_404": { "type": "integer", "description": "How many times we've got 404 (enoent).\n" }, "errors_409": { "type": "integer", "description": "How many times we've got 409 (double_publish_denied).\n" }, "errors_500": { "type": "integer", "description": "How many times we've got 500 (server_error).\n" }, "errors_redirect_limit": { "type": "integer", "description": "How many times pusher was stopped because of redirect limit is reached\n" }, "errors_not_authorized": { "description": "How many times pusher did not establish connection because of missing or wrong credentials", "type": "integer" }, "genlock_status": { "description": "SDI card output clock-lock state.", "allOf": [ { "$ref": "#/components/schemas/genlock_status" } ] }, "genref_status": { "description": "SDI card reference port (Ref In Port) status.", "allOf": [ { "$ref": "#/components/schemas/genref_status" } ] } } }, "push_pid_counters": { "type": "object", "required": [ "pid" ], "properties": { "pid": { "description": "Related MPEG-TS pid", "type": "integer" }, "pnr": { "description": "What program does have this pid", "type": "integer" }, "packets": { "description": "How many MPEG-TS packets with 188 bytes on this pid produced\n", "type": "integer" }, "payload_bytes": { "description": "The payload bytes count.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "fillers_bytes": { "type": "integer", "format": "bytes", "description": "How many bytes were seen in NAL fillers\n", "x-format-description": "bytes" }, "stuffing_packets": { "description": "The stuff packets count.", "type": "integer" }, "trimmed_bytes": { "description": "The trimmed bytes count.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "trimmed_frames": { "description": "The trimmed frames count.", "type": "integer" } } }, "vbi_lines": { "type": "object", "properties": { "service": { "description": "The service information passed to VBI of the output analog stream.\nThe allowed value is `ttxt` - teletext.\n", "allOf": [ { "$ref": "#/components/schemas/vbi_service" } ] }, "lines": { "description": "Numbers of VBI lines that will carry a teletext track.", "items": { "allOf": [ { "$ref": "#/components/schemas/vbi_line" } ] }, "type": "array" } } }, "scale_algorithm": { "enum": [ "fast_bilinear", "bilinear", "bicubic", "experimental", "neighbor", "area", "bicublin", "gauss", "sinc", "lanczos", "spline" ], "type": "string" }, "web_logo_spec": { "type": "object", "properties": { "path": { "description": "Path to the logo file.\nIf specified without the `@` in the beginning, the logo will be served from the webroot (***not recommended***).\nIf specified with the `@` in the beginning, the logo will be served from the special directory and can be\nmanaged by the logo API.\n", "type": "string", "format": "logo_path", "example": "@chan.png", "x-format-description": "logo_path" }, "height": { "description": "Set the specified height for the logo.", "type": "integer", "example": 100 }, "width": { "description": "Set the specified width for the logo.", "type": "integer", "example": 200 }, "left": { "description": "Change the position of the logo to the left.", "type": "integer", "example": 15 }, "top": { "description": "Change the position of the logo to the top.", "type": "integer", "example": 15 }, "right": { "description": "Change the position of the logo to the right.", "type": "integer" }, "bottom": { "description": "Change the position of the logo to the bottom.", "type": "integer" } } }, "network_port": { "maximum": 65535, "minimum": 0, "type": "integer" }, "network_port_range": { "type": "object", "properties": { "first": { "allOf": [ { "$ref": "#/components/schemas/network_port" } ], "description": "First port in the range", "example": 10001 }, "last": { "allOf": [ { "$ref": "#/components/schemas/network_port" } ], "description": "Last port in the range", "example": 10099 } }, "required": [ "first", "last" ] }, "listen_spec": { "anyOf": [ { "allOf": [ { "$ref": "#/components/schemas/network_port" } ] }, { "type": "string", "format": "hostport", "x-format-description": "Hostname with port" } ] }, "listeners": { "type": "object", "properties": { "http": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_http_config" } ] }, "description": "List of HTTP ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 80, "api": false } ] } }, "x-api-allow": [ "watcher-admin" ] }, "https": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_https_config" } ] }, "description": "List of HTTPS ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 443 } ] } } }, "rtmp": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_config" } ] }, "description": "List of RTMP ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 1935 } ] } } }, "rtmps": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_rtmps_config" } ] }, "description": "List of RTMPS ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 1936 } ] } } }, "rtsp": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_config" } ] }, "description": "List of RTSP ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 554 } ] } } }, "rtsps": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_rtsps_config" } ] }, "description": "List of RTSPS ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 555 } ] } } }, "turn": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_config" } ] }, "description": "List of TURN ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 3478 } ] } } }, "snmp": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_config" } ] }, "description": "List of SNMP ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 161 } ] } } }, "sip": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_config" } ] }, "description": "List of SIP ports or `host:port` pairs that will be used for listening.", "examples": { "default": { "value": [ { "port": 5060 } ] } } }, "srt": { "description": "The list of port ranges or `host:port-range` pairs that may be in use for playing SRT or accepting SRT publications \n(depending on the `mode` parameter).\n\nWhen playing from or publishing to one of the ports from the range using `srt://server:port` URL with `stream_id` not specified,\nMedia Server requests the stream name from `config_external` backend using \n[GET /srt_port_resolve/{port}](https://flussonic.com/doc/api/config-external/#tag/srt/operation/srt_port_resolve) endpoint\nand uses the stream with such name for further playback or publishing.\n\nSo for resolving a stream name by SRT port you need:\n\n* `srt` ranges set (this option)\n* `config_external` option set in Media Server\n* `/streams` and `/srt_port_resolve` endpoints implemented on the config backend side\n* a stream name in the provisioned external config equals to the name returned by `/srt_port_resolve` for the specified port.\n\nNote that you should use `stream.srt_publish` and `stream.srt_play` options \nfor SRT-specific settings of streams involved to `/srt_port_resolve` logics.\n", "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/listen_srt_config" } ] } } } }, "listen_config": { "type": "object", "properties": { "port": { "type": "integer", "format": "network_port", "description": "Port that will be used for listening.", "example": 80, "x-primary-key": true, "x-format-description": "network_port" }, "address": { "type": "string", "description": "Network address that will be used for listening.", "example": "10.0.35.1" } }, "required": [ "port" ] }, "listen_ssl_config": { "type": "object", "properties": { "ssl_protocols": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/tls_version" } ] }, "description": "List of SSL protocol versions that will be used for listening.", "example": [ "tlsv1.1", "tlsv1.2" ] } } }, "listen_http_config": { "allOf": [ { "$ref": "#/components/schemas/listen_config" }, { "$ref": "#/components/schemas/listen_http_config_params" } ] }, "listen_http_config_params": { "type": "object", "properties": { "api": { "type": "boolean", "default": true, "description": "If false, listener do not serve api calls." } } }, "listen_https_config": { "allOf": [ { "$ref": "#/components/schemas/listen_http_config" }, { "$ref": "#/components/schemas/listen_ssl_config" } ] }, "listen_rtmps_config": { "allOf": [ { "$ref": "#/components/schemas/listen_config" }, { "$ref": "#/components/schemas/listen_ssl_config" } ] }, "listen_rtsps_config": { "allOf": [ { "$ref": "#/components/schemas/listen_config" }, { "$ref": "#/components/schemas/listen_ssl_config" } ] }, "listen_srt_config": { "allOf": [ { "$ref": "#/components/schemas/srt_direction" }, { "$ref": "#/components/schemas/listen_port_range_config" } ] }, "listen_port_range_config": { "type": "object", "properties": { "address": { "type": "string", "description": "Network address that will be used for listening.", "example": "10.0.35.1" }, "ports": { "description": "The range of ports that will be listened.", "allOf": [ { "$ref": "#/components/schemas/network_port_range" } ] } }, "required": [ "ports" ] }, "session_key_query": { "format": "query_session_key", "type": "string", "x-format-description": "query_session_key" }, "input_stats": { "allOf": [ { "type": "object", "properties": { "ip": { "type": "string", "description": "IP address of the connected peer.", "example": "172.16.25.73" }, "proto": { "allOf": [ { "$ref": "#/components/schemas/protocol" } ], "description": "Protocol used for the data transmission in the session.", "example": "dash" }, "opened_at": { "type": "number", "format": "utc_ms", "description": "The time when this session was created.", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "media_info": { "allOf": [ { "$ref": "#/components/schemas/media_info" } ], "description": "Technical description of the input content.\n" }, "ts_delay": { "type": "number", "format": "ticks", "example": 1284, "description": "The time period during which no frames were received from the stream's input.\n", "x-format-description": "ticks" }, "ts_delay_per_tracks": { "type": "array", "items": { "type": "number", "format": "ticks", "x-format-description": "ticks" }, "example": [ 1284 ], "description": "The time period during which no frames were received per each track according to `media_info`\n" }, "url": { "type": "string", "format": "url", "description": "Final URL after redirects.\n\nDeprecated because was never actually used.\n", "example": "udp://239.0.0.1:1234", "deprecated": true, "x-delete-at": 25.03, "x-format-description": "url" }, "user_agent": { "type": "string", "description": "Client's user agent for selected protocol.", "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36" }, "active": { "description": "Whether this input is selected as active for the stream.", "type": "boolean", "example": true }, "dvr_info": { "description": "Information about DVR that this input has\n", "allOf": [ { "$ref": "#/components/schemas/dvr_info" } ] } } }, { "$ref": "#/components/schemas/input_counters" } ] }, "input_counters": { "type": "object", "description": "Here are grouped different counters for sessions: generic and errors\n", "properties": { "bytes": { "type": "integer", "format": "bytes", "default": 0, "description": "Number of bytes received by this stream from outside.\nIt will be counted before transcoding and will sum all inputs working together.\n", "openmetrics_metric": "stream_input_bytes", "x-format-description": "bytes" }, "frames": { "type": "integer", "default": 0, "description": "Number of frames passed to this stream from the inputs.\n" }, "retries": { "type": "integer", "description": "How many times has this stream retried to connect to source" }, "media_info_changes": { "type": "integer", "description": "Indicates, how often does media_info changes\n" }, "valid_secondary_inputs": { "description": "Number of secondary inputs that have no problems.", "type": "integer", "example": 2 }, "invalid_secondary_inputs": { "description": "Number of secondary inputs that have some problems.", "type": "integer", "example": 0 }, "resync_count_normal": { "type": "integer", "description": "Stream timestamps are synchronized with real time. This counter tells, how many times\nit was syncronized after source reconnect.\n" }, "resync_count_jump": { "type": "integer", "description": "Source may change timestamps without any signalling. This counter indicates how bad is the source\n" }, "resync_count_drift": { "type": "integer", "description": "Source may send frames timestamps faster or slower than realtime.\nLive stream will catch it and resync. This counter indicates how many times did it happened.\n" }, "reorder_count": { "type": "integer", "description": "Source may send frames not in the order they should be played. It will be catched and reordered.\nThis counter indicates how many times did it happened.\n" }, "ad_splices_ingested": { "type": "integer", "description": "How many Ad markers passed to this stream from the inputs.\n" }, "ad_splices_inserted": { "type": "integer", "description": "How many Ad markers inserted to this stream by user.\n" }, "srt": { "type": "object", "$ref": "#/components/schemas/input_srt_counters" }, "motion_detector": { "type": "object", "$ref": "#/components/schemas/input_motion_detector_counters" }, "errors": { "type": "integer", "description": "Sum of all other specific errors. Can be used for triggering alert on any error\n", "example": 0 }, "errors_lost_packets": { "type": "integer", "description": "RTP, MPEG-TS or other protocols have enough information to tell how many packets were lost\n" }, "errors_decoder_reset": { "type": "integer", "description": "Decoder reset count due to abnormal DTS change. Can happen in MPEG-TS, RTP.\n" }, "errors_broken_payload": { "type": "integer", "description": "Demultiplexing was done right, but content is broken.\n" }, "errors_dropped_frames": { "type": "integer", "description": "Dropped frames count due timestamp adjustment.\n" }, "errors_desync": { "type": "integer", "description": "This can be used as a `TS_sync_loss` - how many times MPEG-TS sync was lost.\n\nAlso this counter refers to RTSP desync, when camera starts dropping TCP data and\nwe have to find packet boundaries.\n\nHere we write count of such resynchronizations.\n" }, "errors_ts_pat": { "type": "integer", "description": "how many times PAT was missing during 0,5 seconds or pid 0 misses PAT\n\n`PAT_error`\n" }, "pids": { "type": "array", "items": { "$ref": "#/components/schemas/input_pid_counters" }, "description": "Per pid statistics calculated for MPEG-TS input\n" }, "rtp_channels": { "type": "array", "items": { "$ref": "#/components/schemas/input_rtp_counters" }, "description": "Per channel statistics calculated for RTP input\n" }, "errors_ts_service_lost": { "type": "integer", "description": "How many times have received PAT that was missing required service (program)\n" }, "errors_ts_stuck_restarts": { "type": "integer", "description": "Number of connection restarts to fix ts_stuck issue. Can happen in RTSP.\n" }, "errors_404": { "type": "integer", "description": "How many times we've got 404 (enoent).\n" }, "errors_403": { "type": "integer", "description": "How many times we've got 403 (eaccess).\n" }, "errors_500": { "type": "integer", "description": "How many times we've got 500 (backend error).\n" }, "errors_crashed": { "type": "integer", "description": "How many times input was restarted due to internal crash.\n\nThis may happen due to unhandled input.\n" }, "sdi": { "type": "object", "$ref": "#/components/schemas/input_sdi_counters" }, "agent": { "type": "object", "$ref": "#/components/schemas/input_agent_counters" } } }, "input_pid_counters": { "type": "object", "required": [ "pid" ], "properties": { "pid": { "description": "Related MPEG-TS pid with following problems\n", "type": "integer" }, "pnr": { "description": "What program does have this pid\n", "type": "integer" }, "packets": { "description": "How many MPEG-TS packets with 188 bytes on this pid received\n", "type": "integer" }, "frames": { "description": "Frame count on this pid\n", "type": "integer" }, "empty_packets": { "description": "Packets without payload and adaptation field\n", "type": "integer" }, "errors_adaptation_broken": { "description": "Packets with adaptation field larger than packet size\n", "type": "integer" }, "errors_ts_scrambled": { "type": "integer", "description": "Amount of scrambled TS packets\n" }, "errors_ts_pmt": { "type": "integer", "description": "how many times PMT was not received after 0,5 seconds\n\n`PMT_error`\n" }, "errors_ts_cc": { "type": "integer", "description": "how many MPEG-TS packets were received with non-contigious contiuity counters.\n\n`Continuity_count_error`\n", "example": 0 }, "errors_ts_tei": { "type": "integer", "description": "How many MPEG-TS packets with Transport Error Indicator were received\n\n`Transport_error`, 2.1\n" }, "errors_ts_psi_checksum": { "type": "integer", "description": "How many times have received PSI entry with broken checksum\n\n`CRC_error`\n" }, "errors_pid_lost": { "type": "integer", "description": "How many times pid has been lost\n" }, "broken_pes_count": { "type": "integer", "description": "How many PES packets were started not from startcode\n" }, "broken_pes_sum": { "type": "integer", "description": "How many bytes were discarded due to lack of PES startcode\n" }, "time_corrections": { "type": "integer", "description": "Jumps of timestamps inside a MPEG-TS stream\n" }, "repeated_frames": { "type": "integer", "description": "In case of CC error last frame can be repeated. This is a count of repeated frames\n" }, "corrected_backward_pts": { "type": "integer", "description": "How many times PTS was less than PCR or previous PTS\n" }, "pcr_resync": { "type": "integer", "description": "If PTS is drifting away from PCR, it can be resynchronized with PCR. This is a resync count\n" }, "discarded_buffer_count": { "type": "integer", "description": "How many times was discarded too big ES buffer without making a frame of it\n" }, "discarded_buffer_sum": { "type": "integer", "description": "How many bytes were lost due to discarding ES buffer\n" }, "fillers_count": { "type": "integer", "description": "How many H264(5) NAL fillers were seen in the input\n" }, "fillers_sum": { "type": "integer", "description": "How many bytes were seen in NAL fillers\n" }, "padding_pes_count": { "type": "integer", "description": "How many PES packets were on the Padding streamId\n" }, "padding_pes_sum": { "type": "integer", "description": "How many bytes were in PES packets on the Padding streamId\n" }, "crashed": { "type": "integer", "description": "Unhandled crashes inside mpegts decoding process due\n" }, "dts_goes_backwards": { "type": "integer", "description": "Time on this PID jumped back from reference PTS and it was not a roll over zero\n" }, "dts_jump_forward": { "type": "integer", "description": "Time on this PID jumped forward too far away from reference PTS\n" }, "too_large_dts_jump": { "type": "integer", "description": "Jump of the PTS was so big from previous, that had to flush all frames and restart parsing\n" } } }, "input_rtp_counters": { "allOf": [ { "$ref": "#/components/schemas/rtp_counters_base" }, { "$ref": "#/components/schemas/h26x_decoder_counters" } ] }, "input_srt_counters": { "type": "object", "description": "SRT specific counters\n", "properties": { "rtt": { "type": "integer", "description": "Round-trip time\n" }, "latency": { "type": "integer", "description": "Receiver buffering delay" }, "packets": { "type": "integer", "description": "Total incoming SRT packets counter\n" }, "retransmitted_packets": { "type": "integer", "description": "How many packets were retransmitted\n" }, "error_lost_packets": { "type": "integer", "description": "How many SRT packets were lost\n" }, "error_dropped_packets": { "type": "integer", "description": "How many SRT packets were dropped by various reasons\n" } } }, "input_motion_detector_counters": { "type": "object", "description": "Specific counters to get insights on current state of getting events from cameras.\nDesigned to be used by analyzers, monitoring and alerting tools\n", "properties": { "motion_detected_count": { "type": "integer", "description": "Number of detected motions.\n" }, "episodes_count": { "type": "integer", "description": "Number of collected episodes.\n" }, "errors_not_authorized_count": { "type": "integer", "description": "Number of not authorized requests\n" }, "errors_url_unreachable_count": { "type": "integer", "description": "Number of failed requests because of bad url or network issues.\n" }, "errors_broken_payload": { "type": "integer", "description": "Number of responses with broken content.\n" }, "errors_no_agent_connected": { "type": "integer", "description": "Number of failed request attempts because of no agent connected.\n" }, "errors_no_service_count": { "type": "integer", "description": "Number of attempts to request disabled or unsupported ONVIF service \n" }, "errors_incorrect_time_values_count": { "type": "integer", "description": "`ONVIF Event Handling Test Specification` says that valid values for `CurrentTime` and `TerminationTime` are \n`TerminationTime >= CurrentTime + InitialTerminationTime`.\n\nHow many responses did not met the condition.\n" } } }, "input_sdi_counters": { "type": "object", "description": "SDI,HDMI and other raw input counters", "properties": { "errors_no_signal": { "type": "integer", "description": "Frames dropped due to 'No signal'." }, "errors_duplicate": { "type": "integer", "description": "Frame data is duplicated from previous frame because the input was too slow." }, "errors_ts_duplicate": { "type": "integer", "description": "Frame time is the same as the previous frame." }, "errors_cpu_stall": { "type": "integer", "description": "The frame was dropped due to too high CPU load." }, "peak_duration_deviation": { "type": "integer", "description": "Gauge of maximum deviation from the estimated frame duration." }, "avg_recv_duration": { "type": "integer", "description": "Gauge of average duration of incoming frame calculated in real time." }, "error_lost_audio": { "type": "integer", "description": "Counter of configured audio sdi channels without samples or non valid." } } }, "input_agent_counters": { "type": "object", "description": "Agent counters", "properties": { "errors_conn_failed": { "type": "integer", "description": "The agent was unable to open the requested connection. These errors may indicate problems opening the TCP socket on the agent or the remote host is unreacheable." }, "errors_out_of_memory": { "type": "integer", "description": "These errors indicate that the agent does not have enough memory to establish a connection to the remote host." }, "errors_buffer_overrun": { "type": "integer", "description": "These errors indicate that the agent does not have enough buffer size to handle outgoing traffic." }, "errors_invalid_request": { "type": "integer", "description": "These errors indicate that the agent is receiving invalid requests." }, "errors_unknown": { "type": "integer", "description": "Unknown errors counter." } } }, "rtp_counters_base": { "type": "object", "required": [ "channel_id" ], "properties": { "channel_id": { "description": "RTP channel number\n", "type": "integer", "example": 0 }, "content": { "description": "Content of the track transmitted in the channel\n", "type": "string", "example": "video" }, "rtp_packets": { "type": "integer", "description": "How many RTP packets received for this channel\n" }, "rtcp_packets": { "type": "integer", "description": "How many RTCP packets received for this channel\n" }, "bytes": { "type": "integer", "description": "How many bytes received for this channel\n" }, "frames": { "type": "integer", "description": "How many frames received for this channel\n" }, "pt_reject_count": { "type": "integer", "description": "Number of rtp packets rejected due to wrong payload type\n" }, "pt_reject_sum": { "type": "integer", "description": "Total size of rejected packets due to wrong payload type (pt_reject_count) rtp packets\n" }, "ts_goes_backwards": { "type": "integer", "description": "Time on this channel is jumped back from reference wallclock.\n" }, "ts_jump_forward": { "type": "integer", "description": "Time on this channel is jumped forward from reference wallclock.\n" }, "ts_stuck": { "type": "integer", "description": "https://datatracker.ietf.org/doc/html/rfc6184#section-4.1\n\naccess unit: A set of NAL units always containing a primary coded picture. In addition to the primary coded\npicture, an access unit may also contain one or more redundant coded pictures or other NAL units not containing\nslices or slice data partitions of a coded picture. The decoding of an access unit always results in a\ndecoded picture.\n\nThere is `marker bit` in RTP packet which is set for the very last packet of the access unit indicated by the RTP timestamp.\n\nIt is protocol violation if received RTP packet has the same timestamp as previous marker bit packet.\n\nThis counter is a number of RTP packets which `RTP timestamp` is equal to previous RTP marker bit packet.\n" }, "errors_dts_stuck": { "type": "integer", "description": "Number of frames which dts is same as previous frame dts.\n" }, "sr_ts_stuck": { "type": "integer", "description": "Number of rtcp SR packets which `RTP timestamp` is equal to the previous rtcp SR packet `RTP timestamp`. \n" }, "sender_clock_deviation": { "type": "integer", "description": "Sender wallclock deviation from server time in ms. Positive value means that sender time is ahead of server time.\n" }, "marker_packets_count": { "type": "integer", "description": "Number of RTP packets which marker bit is set to one.\n" }, "no_marker_mode_flag": { "type": "boolean", "description": "If no marker bit packet is received after 400 RTP packets then decoder switches to `no_marker_mode` and\nmakes frame on each timecode change. \n\nThis flag shows if decoder works in `no_marker_mode`.\n" }, "errors_broken_payload": { "type": "integer", "description": "Demultiplexing was done right, but content is broken.\n" }, "errors_lost_packets": { "type": "integer", "description": "RTP have enough information to tell how many packets were lost\n" } } }, "h26x_decoder_counters": { "type": "object", "description": "Here are counters for h264/h265 decoder.\n", "properties": { "nal_count": { "type": "integer", "description": "How many NAL units handled by this decoder.\n" }, "discarded_broken_nal_count": { "type": "integer", "description": "Number of NAL units, which `forbidden_zero_bit` is set to one.\n" }, "discarded_not_allowed_nal_count": { "type": "integer", "description": "Number of NAL units, which type is not allowed in `non-interleaved packetization mode`.\n" }, "nal_fu_count": { "type": "integer", "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows how many `Fragmentation Units` handled by this decoder. \n" }, "nal_stap_a_count": { "type": "integer", "description": "How many NAL `STAP_A` units handled by this decoder.\n" }, "nal_aggregation_count": { "type": "integer", "description": "How many NAL `AGGREGATION` units handled by this decoder.\n" }, "fu_pattern_is_broken_count": { "type": "integer", "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\n`Fragmentation Units` pattern must have a `Start FU`, `End FU` and could have `FUs` between these ones. \n\nThis counter indicates how many times pattern was broken.\n" }, "fu_has_both_start_end_bits_count": { "type": "integer", "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows number of `Fragmentation Units` which `Start bit` and `End bit` are set to one in the same `FU` header\n" }, "incomplete_nal_count": { "type": "integer", "description": "NAL deframentation could be interrupted by unexpected NAL or broken/incomplete packet.\nIf NAL deframentation is interrupted then incomplete fragment of NAL is not discarded and used in decoding process.\n\nThis counter indicates how many incomplete NALs were used. \n" }, "discarded_fu_count": { "type": "integer", "description": "`Fragmentation Unit` used to fragment a single NAL unit over multiple RTP packets.\n`H.264` uses `FU-A` NAL. `H.265` has its own fragmentation unit.\n\nThis counter shows number of discarded `Fragmentation Units`\n" }, "fu_end_then_middle_workaround_count": { "type": "integer", "description": "There is workaround to not interrupt `FU` sequence if `end-FU` followed by `middle-FU`. \nThis counter shows how many time the workaround was applied.\n" }, "nal_sei_count": { "type": "integer", "description": "How many NAL `SEI` units handled by this decoder.\n" }, "invalid_sei_type_count": { "type": "integer", "description": "Number of `SEI` NAL units with invalid type\n" }, "invalid_sei_size_count": { "type": "integer", "description": "Number of `SEI` NAL units with invalid size\n" }, "invalid_sei_payload_count": { "type": "integer", "description": "Number of `SEI` NAL units with bad payload\n" }, "discarded_sei_count": { "type": "integer", "description": "Number of discarded `SEI` NAL units\n" }, "nal_idr_count": { "type": "integer", "description": "How many NAL `IDR` units handled by this decoder.\n" }, "nal_single_count": { "type": "integer", "description": "How many NAL `SINGLE` units handled by this decoder. \n" }, "nal_sps_count": { "type": "integer", "description": "How many NAL `SPS` units handled by this decoder.\n" }, "nal_pps_count": { "type": "integer", "description": "How many NAL `PPS` units handled by this decoder.\n" }, "nal_aud_count": { "type": "integer", "description": "How many NAL `AUD` units handled by this decoder.\n" }, "nal_filler_count": { "type": "integer", "description": "How many NAL `FILLER` units handled by this decoder.\n" }, "nal_slice_count": { "type": "integer", "description": "How many NAL `SLICE` units handled by this decoder.\n" }, "nal_vps_count": { "type": "integer", "description": "How many NAL `VPS` units handled by this decoder.\n" }, "nal_other_count": { "type": "integer", "description": "How many other NAL units handled by this decoder.\n" }, "discarded_nal_count": { "type": "integer", "description": "Number of discarded NAL units.\n" } } }, "segment_duration": { "type": "integer", "format": "milliseconds", "minimum": 1000, "maximum": 15000, "x-format-description": "milliseconds" }, "stream_push": { "oneOf": [ { "$ref": "#/components/schemas/stream_push_rtmp", "x-api-allow": [ "watcher-admin" ] }, { "$ref": "#/components/schemas/stream_push_udp" }, { "$ref": "#/components/schemas/stream_push_m4f" }, { "$ref": "#/components/schemas/stream_push_m4s" }, { "$ref": "#/components/schemas/stream_push_decklink" }, { "$ref": "#/components/schemas/stream_push_dektec" }, { "$ref": "#/components/schemas/stream_push_dektec_asi" }, { "$ref": "#/components/schemas/stream_push_tshttp" }, { "$ref": "#/components/schemas/stream_push_hls" }, { "$ref": "#/components/schemas/stream_push_srt" }, { "$ref": "#/components/schemas/stream_push_st2110" } ], "x-pattern-discriminator": "url" }, "stream_push_base": { "type": "object", "properties": { "comment": { "description": "Human-readable description of the pusher.\n", "type": "string", "example": "This is a test push", "x-api-allow": [ "watcher-admin" ] }, "stats": { "description": "Detailed runtime information about the push.", "allOf": [ { "$ref": "#/components/schemas/push_counters" } ], "readOnly": true, "x-api-allow": [ "watcher-admin" ] }, "retry_limit": { "description": "The maximum number of times *Flussonic* retries to push the stream.", "type": "integer", "x-api-allow": [ "watcher-admin" ] }, "retry_timeout": { "description": "How often *Flussonic* should retry attempts to send the stream, e.g., if it has become offline. \nIt is an interval in seconds, 5 seconds by default. \nYou can increase this value to reduce server load.\n", "type": "integer", "format": "seconds", "example": 7, "x-api-allow": [ "watcher-admin" ], "x-format-description": "seconds" }, "timeout": { "description": "Time interval, in seconds, after which the pusher is stopped if the source stream or publishing is stopped.\n", "type": "integer", "format": "seconds", "example": 10, "x-api-allow": [ "watcher-admin" ], "x-format-description": "seconds" }, "connect_timeout": { "description": "Connection timeout, in seconds. Equals to 0 by default.", "type": "integer", "format": "seconds", "example": 2, "x-format-description": "seconds" }, "disabled": { "description": "Disable pushing the stream.\n\nTemporary disabling, or pausing, an offline stream eliminates the necessity to remove it from the the configuration in order to stop Flussonic trying to push it. \nIn this way, the URL and other settings of a disabled stream remain in Flussonic.\n", "type": "boolean", "x-api-allow": [ "watcher-admin" ] } } }, "stream_push_rtmp": { "allOf": [ { "type": "object", "title": "RTMP", "required": [ "url" ], "properties": { "url": { "description": "RTMP URL where to push.\nYou can publish to RTMP servers. Usually it is a social network streaming.\n", "type": "string", "x-api-allow": [ "watcher-admin" ], "format": "input_url", "examples": { "default": { "value": "rtmp://your-server.com/app/stream1" } }, "pattern": "^rtmps?://.*$", "x-format-description": "input_url" }, "service": { "description": "The name of the service.\nThe value will be sent within FlashVer string when establishing a connection.\nString template is `FMLE/3.0 (compatible; #{encoder}; Streamer #{streamer_version}; #{service}`.\nExample of the resulting FlashVer string is `FMLE/3.0 (compatible; Lavf56.40.101; Streamer 25.01; My service)`.\n", "type": "string", "example": "My service" }, "domain": { "description": "Service public domain name.\nThe value will be sent within notify message with command name 'onMetaData'\nMetadata also will contain the name `Streamer`, streamer version, the type and version of the operating system.\nMetadata will be sent as map with associated map key `yt_project`.\nString template is `Streamer #{streamer_version} #{encoder} #{os_type} #{os_version} #{domain}`.\nExample of the resulting string is `{\"yt_project\" : \"Streamer 25.01 Lavf56.40.101 unix-linux 6.1.0 officialdomain.com\"}`.\n", "type": "string", "example": "officialdomain.com" }, "encoder": { "description": "The name of the encoder used by the pusher. Can also be used as a device name.\nThe value will be sent within notify message with command name 'onMetaData' and within FlashVer string (see above).\n", "type": "string", "example": "Lavf57" } } }, { "$ref": "#/components/schemas/stream_push_base" } ] }, "stream_push_udp": { "allOf": [ { "type": "object", "title": "Multicast MPEG-TS", "required": [ "url" ], "properties": { "url": { "description": "UDP URL of multicast group\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "udp://239.0.0.1:1234" }, "interface": { "value": "udp://eth0@239.0.0.1:1234" }, "bind_ip": { "value": "udp://239.0.0.1:1234/192.168.20.24" } }, "pattern": "^udp[12]?://([^@]+\\@)?[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+:[0-9]+.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_udp_base" }, { "$ref": "#/components/schemas/stream_push_mpegts_base" } ] }, "stream_push_m4f": { "allOf": [ { "type": "object", "title": "M4F", "required": [ "url" ], "properties": { "url": { "description": "Another Flussonic URL where to push video to.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "m4f://your-server.com/app/stream1" } }, "pattern": "^m4fs?://.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" } ] }, "stream_push_m4s": { "allOf": [ { "type": "object", "title": "M4S", "required": [ "url" ], "properties": { "url": { "description": "Flussonic stream URL where to push to.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "m4s://your-server.com/app/stream1" } }, "pattern": "^m4ss?://.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" } ] }, "stream_push_decklink": { "allOf": [ { "type": "object", "title": "Decklink SDI", "required": [ "url" ], "properties": { "url": { "description": "Specify Blackmagic Decklink SDI card as a destination for this stream.\n\nYou need to specify exact number of output, refer to decklink manual to find\nenumeration rules.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "decklink://0" } }, "pattern": "^decklink://[0-9]+$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_sdi_base" } ] }, "stream_push_dektec": { "allOf": [ { "type": "object", "title": "Dektec SDI", "required": [ "url" ], "properties": { "url": { "description": "Select which Dektec SDI card to use as a sink for this stream.\n\nDektec url is combined of card serial # and number of output port on this card.\n\nOutput ports on a card are numbered starting from 1.\nSerial numbers are uniq for each produced card. Take a look at admin UI or use\nnative dektec tools to find the serial number.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "dektec://2174223350:1" } }, "pattern": "^dektec://[0-9]+:[0-9]+$", "x-format-description": "input_url" }, "genlock": { "description": "Enable clock-lock feature (if supported). See also genlock_status property in pusher stats.", "type": "boolean" }, "pixel_offset": { "description": "Adjusting genlock timing pixel offset.", "type": "integer" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_sdi_base" } ] }, "stream_push_dektec_asi": { "allOf": [ { "type": "object", "title": "Dektec ASI", "required": [ "url" ], "properties": { "url": { "description": "Select which Dektec ASI card to use as a sink for this stream.\n\nDektec url is combined of card serial # and number of output port on this card.\n\nOutput ports on a card are numbered starting from 1.\nSerial numbers are uniq for each produced card. Take a look at admin UI or use\nnative dektec tools to find the serial number.\n\nMention that ASI is a MPEG-TS transport\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "dektec-asi://" } }, "pattern": "^dektec-asi://.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_mpegts_base" } ] }, "stream_push_tshttp": { "allOf": [ { "type": "object", "title": "HTTP MPEG-TS", "required": [ "url" ], "properties": { "url": { "description": "Content will be similar to multicast MPEG-TS, but endless HTTP POST will be used to upload content.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "tshttp://your-server.com/app/stream1" }, "https": { "value": "tshttps://your-server.com/app/stream1" } }, "pattern": "^tshttps?://.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_mpegts_base" } ] }, "stream_push_hls": { "allOf": [ { "type": "object", "title": "HLS", "required": [ "url" ], "properties": { "url": { "description": "It is possible to publish HLS to a CDN. Segments will be uploaded together with manifests.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "hls://your-server.com/app/stream1" } }, "pattern": "^hlss?://.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" } ] }, "stream_push_srt": { "allOf": [ { "type": "object", "title": "SRT", "required": [ "url" ], "properties": { "url": { "description": "SRT URL where to push video.\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "srt://my-server.com:8994" } }, "pattern": "^srt[12]?://[^:]+:[0-9]+.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" }, { "$ref": "#/components/schemas/stream_push_udp_base" }, { "$ref": "#/components/schemas/stream_push_mpegts_base" }, { "$ref": "#/components/schemas/srt_config_base" } ] }, "stream_push_udp_base": { "type": "object", "properties": { "multicast_loop": { "description": "Whether to capture multicast back to the *Flussonic* host. \nThis option allows you to ingest the sent stream on the sending host by *Flussonic* or other application.\nSet to `True` for a UDP MPEG-TS push.\n", "type": "boolean", "example": true }, "standby": { "description": "Monitoring multicast group and stop pushing if another publisher presented", "type": "boolean" } } }, "stream_push_mpegts_base": { "type": "object", "properties": { "vb": { "description": "Average bitrate per second that you can send of a video track, including all the headers and encapsulation in the transport stream. \nSo, for example, the value of vb=2720 approximately corresponds to the bitrate 2600 specified in the transcoder settings.\n", "type": "integer", "format": "speed", "example": 2720, "x-format-description": "speed" }, "bitrate": { "description": "The bitrate of the whole stream.", "type": "integer", "format": "speed", "example": 3200, "x-format-description": "speed" }, "pnr": { "description": "Program number in the outgoing MPEG-TS stream. A program may represent a television channel.\n", "type": "integer" }, "pids": { "description": "This parameter sets PIDs values for outgoing MPEG-TS streams. \nIt is possible to set PID values for PMT, STD and video and audio tracks.\n", "allOf": [ { "$ref": "#/components/schemas/output_mpegts_pids" } ] }, "mpegts_ac3": { "description": "It allows to specify pack information about ac3 for outgoing MPEGTS-TS streams. The default value is `system_b`.", "allOf": [ { "$ref": "#/components/schemas/output_mpegts_ac3" } ] }, "service": { "description": "Service name. Used to fill in the field service name within SDT MPEG-TS table.\n", "type": "string", "example": "My service name" }, "provider": { "description": "Provider name. Used to fill in the field service provider within SDT MPEG-TS table.\n", "type": "string", "example": "My provider name" } } }, "stream_push_sdi_base": { "type": "object", "properties": { "volume": { "description": "Audio volume coefficient.\nThe output audio volume is given by the relation: `output_volume = volume * input_volume`.\nThe maximum volume value is 1.0 (default value).\n", "type": "number", "example": 0.5 }, "deinterlace": { "description": "Activate deinterlacing, i.e., converting an interlaced image to a progressive image. \nIt is necessary for comfortable viewing of legacy TV video on PC/mobile devices.\n", "type": "boolean" }, "video_format": { "description": "Specify SDI/HDMI output format", "anyOf": [ { "$ref": "#/components/schemas/video_format" } ] }, "vbi_lines": { "description": "Lines of VBI (vertical blanking interval) of an output analog stream that will contain teletext.\nIt is used for passing teletext from MPEG-TS to analog streams.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/push-teletext-to-sdi-vbi/" }, "items": { "allOf": [ { "$ref": "#/components/schemas/vbi_lines" } ] }, "type": "array" }, "dthreads": { "description": "Defines a number of threads in a decoder. \nOne thread uses one core. \nThe default value equals 4, but you can set it equal to the number of cores of your CPU.\n", "type": "integer", "x-notice": "video decoder threads number" }, "scale": { "description": "Defines a scaling algorithm.\nYou can choose only one algorithm at a time. \nIf a pushing stream has the same video resolution as an ingest stream, the `fast_bilinear` algorithm is used by default. \nIf a video resolution of a pushing stream does not equal the video resolution of an ingest stream, the bicubic algorithm is used by default. \nIf the algorithm is specified explicitly, it applies to all the formats.\n", "allOf": [ { "$ref": "#/components/schemas/scale_algorithm" } ] } } }, "stream_push_st2110": { "allOf": [ { "type": "object", "title": "SMPTE 2110", "required": [ "url" ], "properties": { "url": { "description": "UDP URL of multicast group\n", "type": "string", "format": "input_url", "examples": { "default": { "value": "st2110://239.0.0.1:1234" }, "interface": { "value": "st2110://eth0@239.0.0.1:1234" }, "bind_ip": { "value": "st2110://239.0.0.1:1234/192.168.20.24" } }, "pattern": "^st2110?://([^@]+\\@)?[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+:[0-9]+.*$", "x-format-description": "input_url" } } }, { "$ref": "#/components/schemas/stream_push_base" } ] }, "stream_input": { "oneOf": [ { "$ref": "#/components/schemas/stream_input_fake" }, { "$ref": "#/components/schemas/stream_input_file" }, { "$ref": "#/components/schemas/stream_input_h323" }, { "$ref": "#/components/schemas/stream_input_hls" }, { "$ref": "#/components/schemas/stream_input_rtmp" }, { "$ref": "#/components/schemas/stream_input_rtsp" }, { "$ref": "#/components/schemas/stream_input_srt" }, { "$ref": "#/components/schemas/stream_input_tshttp" }, { "$ref": "#/components/schemas/stream_input_mixer" }, { "$ref": "#/components/schemas/stream_input_mosaic" }, { "$ref": "#/components/schemas/stream_input_m4f" }, { "$ref": "#/components/schemas/stream_input_m4s" }, { "$ref": "#/components/schemas/stream_input_rtp" }, { "$ref": "#/components/schemas/stream_input_shoutcast" }, { "$ref": "#/components/schemas/stream_input_timeshift" }, { "$ref": "#/components/schemas/stream_input_playlist" }, { "$ref": "#/components/schemas/stream_input_copy" }, { "$ref": "#/components/schemas/stream_input_spts" }, { "$ref": "#/components/schemas/stream_input_mpts" }, { "$ref": "#/components/schemas/stream_input_publish" }, { "$ref": "#/components/schemas/stream_input_v4l" }, { "$ref": "#/components/schemas/stream_input_decklink" }, { "$ref": "#/components/schemas/stream_input_dektec" }, { "$ref": "#/components/schemas/stream_input_ndi" }, { "$ref": "#/components/schemas/stream_input_st2110" }, { "$ref": "#/components/schemas/stream_input_frip" } ], "x-pattern-discriminator": "url" }, "stream_input_base": { "type": "object", "properties": { "comment": { "description": "Human-readable description of the input.\n", "type": "string", "example": "This is a test input" }, "source_timeout": { "description": "The period of time, in seconds, for which Media Server will wait for new frames until it considers the source as lost.", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#source_timeout" }, "anyOf": [ { "type": "integer", "format": "seconds", "x-format-description": "seconds" }, { "enum": [ false ], "type": "boolean" } ], "example": 20, "x-api-allow": [ "watcher-core" ] }, "audio_timeout": { "description": "The period of time, in seconds, for which Media Server will wait for new audio frames until it considers the source as lost.", "externalDocs": { "description": "Find more information here" }, "type": "integer", "format": "seconds", "example": 20, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "video_timeout": { "description": "The period of time, in seconds, for which Media Server will wait for new video frames until it considers the source as lost.", "type": "integer", "format": "seconds", "example": 20, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "max_retry_timeout": { "description": "The maximum time that Media Server will set for attempts to reconnect to source when source problems occur.\nThe time between attempts is not linear and may increase if source problems are not fixed. This parameter limits this value, but the time itself between attempts may be longer.\n", "type": "integer", "format": "seconds", "example": 30, "minimum": 1, "x-api-allow": [ "watcher-core" ], "x-format-description": "seconds" }, "timeout": { "description": "The time, in seconds, for Media Server to switch to the fallback source if the main source stops sending frames (video or audio). \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\n", "type": "integer", "example": 10, "x-api-allow": [ "watcher-core" ] }, "frames_timeout": { "description": "Specifies the period of time, in seconds, for which Media Server waits for new frames to come from the data source before it generates the `frames_timed_out` event that informs you that the source might soon be lost. \nThis period of time must be smaller than `source_timeout`. \nIf frames come again from this source, before `source_timeout` has passed, Media Server issues the `frames_restored` event.\n", "type": "integer", "example": 3, "x-api-allow": [ "watcher-core" ] }, "priority": { "description": "The priority that Media Server takes into account when switching to another source.\nThe source with `priority=1` has the first priority, the source with `priority=2` has the second priority, and so on.\n\nBy default, the first source in the list has the highest priority and the last source in the list has the lowest priority. \nIf priority is not specified for some sources, or if some sources have equal priorities, then the default order is applied. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#priority" }, "type": "integer", "example": 1, "x-api-allow": [ "watcher-core" ] }, "stats": { "description": "Detailed runtime information about the input.", "allOf": [ { "$ref": "#/components/schemas/input_stats" } ], "readOnly": true, "x-api-allow": [ "watcher-core" ] }, "user_agent": { "type": "string", "description": "User agent. Can be modified if a protocol allows it.", "x-api-allow": [ "watcher-core" ] }, "cluster_key": { "type": "string", "description": "Authorization key used to fetch the stream from another streamer in a cluster." }, "via": { "type": "string", "format": "agent_url", "description": "Agent ID. Used as a proxy to connect to the input server.", "x-api-allow": [ "watcher-core", "central-layouter" ], "x-format-description": "agent://ID identification for `via` configuration option\n" }, "max_bitrate": { "description": "Maximum bitrate value. Media Server checks the input bitrate value, and if it overflows this value, the input will be disconnected.", "type": "integer", "format": "speed", "x-format-description": "speed" }, "remote_dvr": { "enum": [ "nochain", "chain", "none" ], "type": "string", "description": "Mode to describe the interconnection with a DVR on a remote server.\nAllows to chain requests to other servers or read-only from a peer.\n" }, "output_audio": { "description": "Enables transcoding of the published audio to another codec.\nThe option is useful when you want to get an AAC audio track from WebRTC publish with OPUS or RTSP camera with PCMU.\n", "allOf": [ { "$ref": "#/components/schemas/output_audio" } ], "x-api-allow": [ "watcher-core" ] }, "headers": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Request headers as key-value pairs.", "example": { "User-Agent": "curl/7.85.0", "Authorization": "Basic dXNlcjpwYXNzd29yZA==" }, "x-api-allow": [ "watcher-core" ] }, "no_clients_reconnect_delay": { "type": "integer", "description": "Skip input start if the stream has no clients." }, "allow_if": { "type": "string", "description": "Path to a file. The input will be allowed if you put `1` in the file, or denied if `0` (reverse logic to `deny_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `allow_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. That means that the first input is used when you play the stream.\nWhen you put `0` to the `/path/to/file` file, the first input is denied, so the second one is played.\n\nIf no such file, the input is allowed.\n" }, "deny_if": { "type": "string", "description": "Path to a file. The input will be denied if you put `1` in the file, or allowed if `0` (reverse logic to `allow_if`).\nThis option allows you to manage inputs without API requests.\n\nFor example, your stream has two inputs and you set `deny_if = /path/to/file` for the first input.\nThe `/path/to/file` file contains only the digit `1`. \nThat means that the first input will not be used when you play the stream, so the second one will.\nWhen you put `0` to the `/path/to/file` file, the first input is allowed to be played.\n\nIf no such file, the input is allowed.\n" } } }, "stream_input_fake": { "allOf": [ { "type": "object", "title": "Demo source", "properties": { "url": { "description": "URL to get a demo stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "fake://fake", "pattern": "^fake://.*$", "x-format-description": "input_url" }, "width": { "type": "integer", "description": "Width of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n" }, "height": { "type": "integer", "description": "Height of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n" }, "bitrate": { "type": "integer", "format": "speed", "description": "Bitrate of an artificially created test video stream. \nApplicable to the `fake://fake` URL.\n", "x-format-description": "speed" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_file": { "allOf": [ { "type": "object", "title": "File", "properties": { "url": { "description": "URL to get a stream from file.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "file://vod/bunny.mp4", "pattern": "^file://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_mpegts_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_h323": { "allOf": [ { "type": "object", "title": "H323", "properties": { "url": { "description": "URL to connect to the H323 source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "h323://192.168.100.150", "pattern": "^h323://.*$", "x-format-description": "input_url" }, "id": { "type": "string", "description": "H323 input ID." }, "video_bitrate": { "type": "integer", "format": "speed", "description": "H323 input bitrate.", "x-format-description": "speed" }, "audio_bitrate": { "type": "integer", "format": "speed", "description": "H323 audio bitrate.", "x-format-description": "speed" }, "connections": { "type": "integer", "description": "H323 connections." } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_hls": { "allOf": [ { "type": "object", "title": "HLS", "properties": { "url": { "description": "URL to get a stream from HLS source.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "hls://remote.host.com/example/video.m3u8" }, "apple_standard": { "value": "hls://remote.host.com/example/index.m3u8" }, "secure": { "value": "hlss://remote.host.com/example/video.m3u8" }, "hls2": { "value": "hls2://remote.host.com/example/video.m3u8" }, "hlss2": { "value": "hlss2://remote.host.com/example/video.m3u8" }, "http": { "value": "http://remote.host.com/index.m3u8" }, "https": { "value": "https://remote.host.com/index.m3u8" } }, "pattern": "^(hls|hlss|hls2|hlss2)://.*$|^(http|https)://.*\\.m3u8((#|\\?).*)?$", "x-format-description": "input_url" }, "skip_stalled_check": { "description": "By default Flussonic will wait for at least 2-3 new segments before making stream available.\n\nThis parameter allows to disable this protection. Use it at your own risk - with it enabled, old content might be repeated over and over.\n", "type": "boolean" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_mpegts_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_rtmp": { "allOf": [ { "type": "object", "title": "RTMP", "properties": { "url": { "description": "URL to connect to the RTMP source and get the stream.\n\nRTMP uses a special URL consisting of at least two segments. *Flussonic* parses the URL and splits it into parts, \nusing the first segment as an RTMP application name.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "rtmp://remote.host.com/static/example" }, "secure": { "value": "rtmps://remote.host.com/static/example" } }, "pattern": "^(rtmp|rtmps)://.*$", "x-format-description": "input_url" }, "pageUrl": { "description": "URL of the web page from where the SWF file was loaded. \nThis is an RTMP header (Referer) used for establishing connection.\n", "type": "string", "format": "url", "example": "http://somehost/sample.html", "x-format-description": "url" }, "swfUrl": { "description": "URL of the source SWF file making the connection by RTMP.", "type": "string", "example": "file://C:/FlvPlayer.swf" }, "tcUrl": { "description": "URL of the remote Server for entering credentials. \nIt has the following format: `protocol://servername:port/appName/appInstance`.\n", "type": "string", "format": "url", "example": "rtmp://localhost:1935/testapp/instance1", "x-format-description": "url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_rtsp": { "allOf": [ { "type": "object", "title": "RTSP", "properties": { "url": { "description": "URL to connect to the RTSP source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "rtsp://remote.host.com/example" }, "secure": { "value": "rtsps://remote.host.com/example" }, "rtsp-udp": { "value": "rtsp-udp://remote.host.com/example" }, "rtsp2": { "value": "rtsp2://remote.host.com/example" } }, "pattern": "^(rtsp|rtsps|rtsp-udp|rtsp2)://.*$", "x-format-description": "input_url" }, "rtp": { "enum": [ "udp" ], "type": "string", "description": "Whether to force UDP to capture a video from RTSP cameras.", "x-api-allow": [ "watcher-core" ] }, "wait_rtcp": { "type": "boolean", "description": "Whether to wait for the full RTP time synchronization before the processing of frames from the RTSP camera.\n", "x-api-allow": [ "watcher-core" ] } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_v4l": { "allOf": [ { "type": "object", "title": "V4L", "required": [ "url" ], "properties": { "url": { "description": "URL to connect to the Video4Linux source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "v4l2://" }, "v4l": { "value": "v4l://" } }, "pattern": "^(v4l|v4l2)://.*$", "x-format-description": "input_url" }, "audio_device": { "description": "The audio device to capture audio from Stream Labs SDI cards.\n\nThis parameter is specified for ALSA devices in the following format `interface:card,device`.\n", "type": "string", "example": "plughw:1,0" }, "video_device": { "description": "The video device to capture video from Stream Labs SDI cards.\nIt is actually a path to a device file created on the disk by Video4Linux.\n", "type": "string", "example": "/dev/video0" }, "vbi_device": { "description": "The VBI device to capture raw VBI data from Stream Labs SDI cards. VBI data can contain information about teletext or closed captions.\nIt is actually a path to a VBI device file created on the disk by Video4Linux.\n", "type": "string", "example": "/dev/vbi" }, "ttxt_descriptors": { "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.", "items": { "allOf": [ { "$ref": "#/components/schemas/ttxt_descriptors" } ] }, "type": "array" }, "vbi_threshold": { "description": "This parameter is used for debugging when reading teletext from VBI.\nThis is a threshold, in seconds, for turning on the decoder.\n", "type": "integer" }, "vbi_debug": { "description": "This parameter allows logging the decoded data when reading teletext from VBI.", "type": "boolean" } } }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_decklink": { "allOf": [ { "type": "object", "title": "Decklink SDI", "properties": { "url": { "description": "URL to connect to the Decklink SDI source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "decklink://0", "pattern": "^decklink://.*$", "x-format-description": "input_url" }, "mode": { "description": "Mode of the input stream captured from the Decklink card. It is composed of the size and FPS of the captured video. \n\nUsually, it is autodetected, but for some Decklink models you'll need to specify it manually.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/ingest-sdi-with-blackmagic/#live-sdi-capture" }, "anyOf": [ { "$ref": "#/components/schemas/bm_display_mode" } ], "example": "4d30" }, "ainput": { "description": "Audio interface for capturing from the Decklink card.\n\nUsually, it is autodetected, but for some Decklink models you should specify it manually.\n", "anyOf": [ { "type": "integer", "enum": [ 1, 2, 3, 4, 5, 6, 7 ] }, { "enum": [ "embedded", "aes_ebu", "analog", "analog_xlr", "analog_rca", "microphone", "headphones" ], "type": "string" } ], "example": "microphone" }, "vinput": { "description": "Video interface for capturing from the Decklink card.\n\nUsually, it is autodetected, but for some Decklink models you should specify it manually.\n", "anyOf": [ { "type": "integer", "enum": [ 1, 2, 3, 4, 5, 6 ] }, { "enum": [ "sdi", "hdmi", "optical_sdi", "component", "composite", "s_video" ], "type": "string" } ], "example": "hdmi" }, "vpts": { "description": "Synchronization mode for video captured from the Decklink card.\n", "oneOf": [ { "const": "audio", "description": "Synchronization by audio." }, { "const": "ref", "description": "Synchronization according to the timing reference signal." }, { "const": 2, "description": "Equivalent of 'audio'." }, { "const": 3, "description": "Equivalent of 'ref'." } ] }, "apts": { "description": "Synchronization mode for audio captured from the Decklink card.\n", "oneOf": [ { "const": "video", "description": "Synchronization by video." }, { "const": "ref", "description": "Synchronization according to the timing reference signal." }, { "const": 1, "description": "Equivalent of 'video'." }, { "const": 3, "description": "Equivalent of 'ref'." } ] }, "pixel": { "description": "Preferred pixel format for captured video.", "oneOf": [ { "const": "rgb8", "description": "rgb color model and 8 bits per pixel." }, { "const": "rgb10", "description": "rgb color model and 10 bits per pixel." }, { "const": "rgb12", "description": "rgb color model and 12 bits per pixel." }, { "const": "yuv8", "description": "YUV color model and 8 bits per pixel." }, { "const": "yuv10", "description": "YUV color model and 10 bits per pixel." }, { "const": "8", "description": "equivalent of `yuv8`." }, { "const": "10", "description": "equivalent of `yuv10`." } ] }, "sar": { "description": "The ratio of the width of the display representation to the width of the pixel representation of video.\n\nThis parameter is used for creating non-anamorphic video from anamorphic video.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder-internals/#transcoder-options_sar" }, "type": "string", "example": "16:9" }, "ttxt_descriptors": { "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.", "items": { "allOf": [ { "$ref": "#/components/schemas/ttxt_descriptors" } ] }, "type": "array" }, "vbi_threshold": { "description": "This parameter is used for debugging when reading teletext from VBI.\nThis is a threshold, in seconds, for turning on the decoder.\n", "type": "integer" }, "vbi_debug": { "description": "This parameter allows logging the decoded data when reading teletext from VBI.", "type": "boolean" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_dektec": { "allOf": [ { "type": "object", "title": "DekTec SDI", "properties": { "url": { "description": "URL to connect to the DekTec SDI source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "dektec://2174220025:2", "pattern": "^dektec://.*$", "x-format-description": "input_url" }, "pixel": { "description": "Preferred pixel format for captured video.", "oneOf": [ { "const": "rgb8", "description": "rgb color model and 8 bits per pixel." }, { "const": "rgb10", "description": "rgb color model and 10 bits per pixel." }, { "const": "rgb12", "description": "rgb color model and 12 bits per pixel." }, { "const": "yuv8", "description": "YUV color model and 8 bits per pixel." }, { "const": "yuv10", "description": "YUV color model and 10 bits per pixel." }, { "const": "8", "description": "equivalent of `yuv8`." }, { "const": "10", "description": "equivalent of `yuv10`." } ] }, "sar": { "description": "The ratio of the width of the display representation to the width of the pixel representation of video.\n\nThis parameter is used for creating non-anamorphic video from anamorphic video.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/transcoder/#video-options" }, "type": "string", "example": "16:9" }, "ttxt_descriptors": { "description": "This information is necessary for adding into the PMT table to identify streams which carry teletext data in the resulting MPEG-TS stream.", "items": { "allOf": [ { "$ref": "#/components/schemas/ttxt_descriptors" } ] }, "type": "array" }, "vbi_debug": { "description": "This parameter allows logging the decoded data when reading teletext from VBI.", "type": "boolean" }, "scte35": { "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n", "type": "boolean", "default": true, "example": true, "deprecated": true, "x-delete-at": 23.09 } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_srt": { "allOf": [ { "type": "object", "title": "SRT", "required": [ "url" ], "properties": { "url": { "description": "Artificial URL to connect to the SRT source and get the stream.\n\nSRT requires IP and port, so we create an artificial URL to specify the options to manage the data interchange.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "srt://remote.host.com:1234?bind_ip=10.77.0.100" }, "srt1": { "value": "srt1://remote.host.com:1234?bind_ip=10.77.0.100" }, "srt2": { "value": "srt2://remote.host.com:1234?bind_ip=10.77.0.100" } }, "pattern": "^(srt|srt1|srt2)://.*$", "x-format-description": "input_url" }, "closed_captions": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "string", "description": "The rules for handling the closed captions.\n" } } }, { "$ref": "#/components/schemas/stream_input_srt_publish_specific" }, { "$ref": "#/components/schemas/stream_input_base" }, { "$ref": "#/components/schemas/srt_config_base" } ] }, "stream_input_srt_publish_specific": { "type": "object", "properties": { "subtitles": { "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n", "oneOf": [ { "const": "drop", "description": "An output stream will have no subtitles track." }, { "const": "accept", "description": "An output stream will have a subtitles track in DVB, without conversion to text (default behavior)." }, { "const": "ocr_replace", "description": "An output stream will have a track containing subtitles converted to a text format (WebVTT)." }, { "const": "ocr_add", "description": "An output stream will have two tracks containing subtitles: \nthe original track with subtitles in DVB and a new track with text subtitles.\n" } ], "example": "drop", "deprecated": true, "x-delete-at": 25.03 }, "scte35": { "description": "This option disables processing of SCTE-35 markers from SRT input stream.\n", "type": "boolean", "default": true, "example": true } } }, "stream_input_tshttp": { "allOf": [ { "type": "object", "title": "TSHTTP", "properties": { "url": { "description": "URL for ingest and pass a stream \"as is\" without repackaging.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "tshttp://ADMIN:PASSWORD@FLUSSONIC_IP/flussonic/api/dvbts/a0" }, "secure": { "value": "tshttps://127.0.0.1:8080" }, "mpegts": { "value": "http://remote.host.com/mpegts" }, "mpegts_secure": { "value": "https://remote.host.com/mpegts" }, "ts": { "value": "http://remote.host.com/example.ts" }, "ts_secure": { "value": "https://remote.host.com/example.ts" } }, "pattern": "^(tshttp|tshttps)://.*$|^(http|https)://.*(\\.ts|/mpegts)$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_mpegts_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_webrtc_publish_specific": { "type": "object", "title": "WebRTC", "properties": { "prefer_codec": { "description": "Choose one of the listed video codecs at the start of the publication via WebRTC.\n", "deprecated": true, "x-delete-at": 24.11, "x-alias": "prefer_video_codec", "allOf": [ { "$ref": "#/components/schemas/webrtc_prefer_video_codec" } ], "example": "av1" }, "prefer_video_codec": { "description": "Prefer one of the listed video codecs at the start of the publication via WebRTC.\n", "allOf": [ { "$ref": "#/components/schemas/webrtc_prefer_video_codec" } ], "example": "av1" }, "transport": { "description": "Choose the prefered transport of the publication via WebRTC: UDP or TCP.\n", "allOf": [ { "$ref": "#/components/schemas/webrtc_transport" } ], "example": "udp" }, "min_bitrate": { "description": "The minimum bitrate threshold, in kbit/s. The default value is 100 kbit/s.", "type": "integer", "example": 150 }, "webrtc_abr": { "description": "Whether the adaptive bitrate mechanism is used for WebRTC publications.", "type": "boolean", "example": true }, "abr_stepup": { "description": "Increment step for raising the bitrate to the maximum, in percent. The default step is 30%. \nIf the loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup percent`.\n", "type": "integer" }, "abr_correction": { "description": "The correction between the target bitrate (Receiver Estimated Maximum Bitrate, calculated in Flussonic) and browser bitrate, in kbit/s.\nFlussonic sends the target bitrate to the browser from which the publication is carried out so that the browser adjusts the bitrate of the publication by this value.\nThe default value is 300 kbit/s.\n", "type": "integer", "example": 200 }, "abr_loss_lower": { "type": "number", "description": "The lower limit of packet loss. When it is reached, Flussonic raises the bitrate. \nThat is, if packet loss is less than `abr_loss_lower`, Flussonic makes the publisher to step up from the current bitrate to the maximum one with the rate of `abr_stepup` percent.\n", "example": 2 }, "abr_loss_upper": { "description": "The upper limit of packet loss. When it is reached, Flussonic reduces the bitrate. \nThat is, if packet loss is greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n", "type": "number", "example": 10 }, "abr_stepdown": { "description": "A step of reducing the bitrate to the minimum. \nIf packet losses are greater than `abr_loss_upper`, Flussonic makes the publisher to reduce the current bitrate in steps with the maximum rate of `abr_stepdown` percent.\n", "type": "number" }, "abr_mode": { "description": "The algorithm for determining the need to change the bitrate of the published stream and for calculating the target bitrate. \nTwo options are possible:\n\n* `abr_mode=0` - This mode takes into account the packet losses, target bitrate, browser bitrate and the number of auto-adjustment cycles.\n* `abr_mode=1` - This mode considers only packet losses and target bitrate.\n", "type": "integer", "example": 1 }, "abr_debug": { "description": "Whether adaptive bitrate process is logged.", "type": "integer", "example": 1 }, "abr_cycles": { "description": "The number of cycles of bitrate auto-adjustment.\nAfter the specified number of auto-adjustment cycles passes, Flussonic considers the bitrate to be optimal, and it is no longer analyzed. \nBy default, `abr_cycles`=5. \nIf `abr_cycles`=0, the adjustment process takes place all the time while the publication lasts.\n", "type": "integer", "example": 3 }, "abr_max_bitrate": { "description": "Maximum bitrate for adjustment process, in kbit/s.\nFlussonic will keep the publication bitrate equal or below of the specified value.\n", "type": "integer", "default": 2500, "example": 1000 } } }, "stream_input_mixer": { "allOf": [ { "type": "object", "title": "Mixer", "properties": { "url": { "description": "URL to make a mixer stream from other streams.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "mixer://stream1,stream2", "pattern": "^mixer://.*$", "x-format-description": "input_url" }, "sync": { "description": "This parameter is used for a mixer stream that uses other streams as its video and audio sources.\n\nIf the parameter is set to `realtime`, audio frames will be played in sync with video frames: \nif the difference between timestamps of an audio frame and a corresponding video frame is more than 2 seconds, \nthe audio frame will be played at the timestamp of the video frame. \n\nIf this parameter is set to `dts`, no synchronization is performed.\n", "enum": [ "dts", "realtime" ], "type": "string", "example": "dts", "default": "dts", "x-api-allow": [ "watcher-core" ] }, "audio_add": { "type": "integer", "description": "Moves audio timestamp forwards or backwards on a specified number of milliseconds.", "deprecated": true, "x-delete-at": 23.09, "format": "milliseconds", "x-alias": "audio_offset", "x-api-allow": [ "watcher-core" ], "x-format-description": "milliseconds" }, "mixer_strategy": { "description": "The mixing mode for the `mixer://` input type.\n", "oneOf": [ { "const": "all", "description": "Mix all input tracks." }, { "const": "first_video_audio", "description": "Mix only a first video track of the first input with a first audio track of the second input." } ], "default": "first_video_audio", "type": "string" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_timeshift": { "allOf": [ { "type": "object", "title": "Timeshift", "properties": { "url": { "description": "Special URL to play the archive record of a stream with a fixed delay.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "timeshift://channel/7200" } }, "pattern": "^timeshift://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_m4f": { "allOf": [ { "type": "object", "title": "M4F", "properties": { "url": { "description": "URL to get a stream from m4f source.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "m4f://remote.host.com/example" }, "secure": { "value": "m4fs://remote.host.com/example" } }, "pattern": "^(m4f|m4fs)://.*$", "x-format-description": "input_url" }, "closed_captions": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "string", "description": "The rules for handling the closed captions.\n" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_copy": { "allOf": [ { "type": "object", "title": "Copy source", "properties": { "url": { "description": "URL to connect to the source and get a copy of the original stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "copy://stream1", "pattern": "^copy://.*$", "x-format-description": "input_url" }, "closed_captions": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "string", "description": "The rules for handling the closed captions.\n" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_shoutcast": { "allOf": [ { "type": "object", "title": "SHOUTcast", "properties": { "url": { "description": "URL to connect to the SHOUTcast source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "shoutcast://remote.host.com/example/shoutcast" }, "secure": { "value": "shoutcasts://remote.host.com/example/shoutcast" } }, "pattern": "^(shoutcast|shoutcasts)://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_rtp": { "allOf": [ { "type": "object", "title": "RTP", "properties": { "url": { "description": "URL to connect to RTP source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "rtp://remote.host.com", "pattern": "^rtp://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_m4s": { "allOf": [ { "type": "object", "title": "M4S", "properties": { "url": { "description": "URL to get a stream from m4s source.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "m4s://remote.host.com/example" }, "secure": { "value": "m4ss://remote.host.com/example" } }, "pattern": "^(m4s|m4ss)://.*$", "x-format-description": "input_url" }, "closed_captions": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "string", "description": "The rules for handling the closed captions.\n" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_mosaic": { "allOf": [ { "type": "object", "title": "Mosaic", "properties": { "url": { "description": "Special URL to make a mosaic stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "mosaic://cam1,cam2,cam3,cam4?fps=20&preset=ultrafast&bitrate=1024k&size=340x240&mosaic_size=16" }, "mosaic2": { "value": "mosaic2://" } }, "pattern": "^(mosaic|mosaic2)://.*$", "x-format-description": "input_url" }, "bitrate": { "type": "integer", "format": "speed", "description": "Bitrate of the audio. \n", "x-format-description": "speed" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_publish": { "allOf": [ { "type": "object", "title": "Publish", "properties": { "url": { "description": "The publish:// URL used to indicate where this stream started in publish mode.\n\nYou can publish videos to Flussonic using the following URLs: \n __RTSP__: rtsp://FLUSSONIC-IP/stream_name \n __HTTP MPEG-TS__: http://FLUSSONIC-IP/stream_name/mpegts \n __RTMP__: rtmp://flussonic-ip/published or rtmp://flussonic-ip/static/published \n __WebRTC__: http://FLUSSONIC-IP/stream_name/whip \n __SRT__: srt://FLUSSONIC-IP:SRT_PORT?streamid=#!::r=STREAM_NAME,m=publish\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "publish://", "pattern": "^publish://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_webrtc_publish_specific" }, { "$ref": "#/components/schemas/stream_input_srt_publish_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_playlist": { "allOf": [ { "type": "object", "title": "Playlist", "properties": { "url": { "description": "URL to get a stream from playlist.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "playlist://remote.host.com/example.m3u8", "pattern": "^playlist://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_ndi": { "allOf": [ { "type": "object", "title": "NDI", "properties": { "url": { "description": "URL to get a stream from NDI source. Usually NDI software display sources like `My PC (Camera1)`, convert it into `ndi://My PC/Camera1`.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "example": "ndi://hostname/Source1", "pattern": "^ndi://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_frip": { "allOf": [ { "type": "object", "title": "FRIP", "properties": { "url": { "description": "FRIP input. Can be a cmd if started from `-` or an existing socket.\n", "type": "string", "examples": { "socket": { "value": "frip://hostname/Source1" }, "cmd": { "value": "frip://-contrib/devel/simulator.erl" } }, "pattern": "^frip://.*$", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ] }, "socket_dir": { "description": "Directory for shmem files\n", "type": "string", "example": "tmp" }, "shmem_size": { "description": "Size of shared memory buffer. Omit to make it auto\n", "type": "integer", "example": 1024000 } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_spts": { "allOf": [ { "type": "object", "title": "SPTS", "properties": { "url": { "description": "URL to connect to the SPTS source and get the stream.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "udp://239.0.0.1:1234" }, "udp1": { "value": "udp1://239.0.0.1:1234" }, "udp2": { "value": "udp2://239.0.0.1:1234" }, "udp3": { "value": "udp3://239.0.0.1:1234" } }, "pattern": "^(udp|udp1|udp2|udp3)://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_mpegts_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_mpts": { "allOf": [ { "type": "object", "title": "MPTS", "properties": { "url": { "description": "URL to get a stream from MPTS source.\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "smartcam", "central-layouter" ], "examples": { "default": { "value": "mpts-udp://239.0.0.1:1234" }, "mpts-http": { "value": "mpts-http://239.0.0.1:1234" }, "mpts-https": { "value": "mpts-https://239.0.0.1:1234" }, "mpts-dvb": { "value": "mpts-dvb://asi_10?program=15" }, "dvb": { "value": "dvb://asi_10?program=15" } }, "pattern": "^(mpts-udp|mpts-http|mpts-https|mpts-dvb|dvb)://.*$", "x-format-description": "input_url" } }, "required": [ "url" ] }, { "$ref": "#/components/schemas/stream_input_mpegts_specific" }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "stream_input_mpegts_specific": { "type": "object", "properties": { "programs": { "description": "Choose a program to ingest from an MPEG-TS stream.", "items": { "type": "integer" }, "type": "array", "example": [ 1 ] }, "pids": { "description": "Choose a specific PID to ingest from an MPEG-TS stream. \nPID identifies separate data stream inside the multiplexed MPEG-TS stream. \nIt is possible to set PID values for PMT, SDT, video, and audio tracks.\n", "items": { "type": "integer" }, "type": "array", "example": [ 211 ] }, "subtitles": { "description": "This configuration is deprecated. Use `dvbocr` configuration field in stream.\n\nThis parameter allows to manage subtitles in an output stream.\n", "oneOf": [ { "const": "drop", "description": "An output stream will have no subtitles track." }, { "const": "accept", "description": "An output stream will have a subtitles track in DVB, without conversion to text (default behavior)." }, { "const": "ocr_replace", "description": "An output stream will have a track containing subtitles converted to a text format (WebVTT)." }, { "const": "ocr_add", "description": "An output stream will have two tracks containing subtitles: \nthe original track with subtitles in DVB and a new track with text subtitles.\n" } ], "example": "drop", "deprecated": true, "x-delete-at": 25.03 }, "closed_captions": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "string", "description": "The rules for handling the closed captions.\n" }, "scte35": { "description": "This option disables processing of SCTE-35 markers from an MPEG-TS input stream.\nDeprecated since 22.12.\nAvailable ways to disable processing of SCTE-35 markers:\n1. pids option to select tracks without SCTE-35 markers\n2. hls_scte35 option from stream_config_media for hls output\n3. performing appropriate tuning pids in the transponder\n", "type": "boolean", "default": true, "example": true, "deprecated": true, "x-delete-at": 23.09 }, "languages": { "additionalProperties": { "type": "string" }, "type": "object", "x-key-type": "mpegts_lang_track", "description": "An array of MPEG-TS language descriptors in format `[{key: track, value: language}]`\n" } } }, "stream_input_st2110": { "allOf": [ { "type": "object", "title": "SMPTE 2110\n", "required": [ "url" ], "properties": { "url": { "description": "SMPTE 2110 UDP multicast group\n", "type": "string", "format": "input_url", "x-api-allow": [ "watcher-core", "vision-config-external", "central-layouter" ], "examples": { "default": { "value": "st2110://239.0.0.1:1234" }, "interface": { "value": "st2110://eth0@239.0.0.1:1234" }, "bind_ip": { "value": "st2110://239.0.0.1:1234/192.168.20.24" } }, "pattern": "^st2110://.*$", "x-format-description": "input_url" }, "width": { "type": "integer", "description": "Must specify received pixel width\n" }, "height": { "type": "integer", "description": "Must specify received pixel height\n" }, "bind_to_core": { "type": "integer", "description": "Optional bind core\n" } } }, { "$ref": "#/components/schemas/stream_input_base" } ] }, "webrtc_abr_opts": { "type": "object", "properties": { "start_track": { "description": "Video track number from which playback starts. Possible values: `v1`, `v2`, `v3` and so on.\n\nIf not specified, or an audio track specified (`start_track=a3`), or a video track number does not exist, \nplayback starts with the track number in the middle of the list (e.g. `v2` if you have tracks `v1`, `v2`, and `v3`) \nand then adjusts to the bandwidth availability.\n\nIf some tracks are excluded by the query parameter `?filter=tracks:...`, Flussonic searches for an available track with a lower number up to v0. \nIf no track with a lower number was found, Flussonic searches for a closest track with a higher number.\n", "type": "string", "example": "v2" } } }, "named_by": { "type": "string", "oneOf": [ { "const": "config", "description": "Media is described in file on local disk" }, { "const": "user", "description": "Media was started and configured by user request: play or publish\n" }, { "const": "remote", "description": "Media was sourced from another streamer via `source` directive" }, { "const": "external", "description": "Media was configured via config_external backend" } ] }, "backup_config": { "type": "object", "properties": { "file": { "description": "Path to the backup file in a VOD location on the server (**not on the local disk!**). \nThe backup file is played to fill in a time interval when the source is down.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#live-sources-url_file" }, "type": "string", "example": "vod/blank.mp4" }, "timeout": { "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending frames. \nThe important thing here is that the source remains active (connected), allowing for a client-publisher to stay on the socket.\nThis option takes any type of frames into account. \n\nIf you do not specify timeout specifically for a fallback source, then in the absence of frames, `source_timeout` of the main source will be used.\n", "type": "integer", "example": 10 }, "audio_timeout": { "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending audio frames.", "type": "integer", "example": 5 }, "video_timeout": { "description": "The time (in seconds) for Flussonic to switch to the fallback source if the main source stops sending video frames.", "type": "integer", "example": 4 }, "transcode": { "description": "Whether or not to transcode the backup file. Set to `True` by default. \nIf set to `False`, backup file frames will bypass as-is to the output stream.\n\nShould not be set to `False` unless the backup file has the same stream characteristics\nas the live stream.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/add-secondary-source-for-redundancy/#live-sources-backup_transcode" }, "type": "boolean" }, "dvr": { "description": "Whether or not to record a backup to DVR. \nSet to `False` by default (backup is not recorded).\n", "type": "boolean" } } }, "auth_url": { "anyOf": [ { "type": "string", "format": "auth_url", "x-format-description": "This may be a limited amount of schemas or a .lua file on disk\n" }, { "type": "string", "oneOf": [ { "const": "true", "description": "Allow all playback sessions. Use the value to override template value." } ] } ] }, "dvr_info": { "type": "object", "properties": { "from": { "type": "integer", "format": "utc", "description": "The UTC timestamp of the first recording in this archive.", "example": 1641045644, "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 }, "depth": { "type": "integer", "format": "seconds", "description": "The time interval between the start of the *first* recording segment and the end of the *last* one.", "example": 259200, "x-format-description": "seconds" }, "ranges": { "deprecated": true, "x-delete-at": 24.09, "description": "The list of DVR ranges. The param is replaced with `ranges_list` method.", "items": { "allOf": [ { "$ref": "#/components/schemas/dvr_range" } ] }, "type": "array" }, "bytes": { "description": "The size of the recorded archive.", "type": "integer", "format": "bytes", "example": 129600000000, "x-format-description": "bytes" }, "disk_size": { "description": "The size of the recorded archive. Please, use bytes instead.", "type": "integer", "format": "bytes", "example": 1099511627776, "deprecated": true, "x-delete-at": 25.07, "x-format-description": "bytes" }, "duration": { "type": "integer", "format": "seconds", "description": "A total duration of the recorded segments, excluding recording gaps.\nIt can be smaller than depth if you have gaps.\n", "example": 172800, "x-format-description": "seconds" } }, "required": [ "from", "depth", "ranges" ] }, "cluster_ingest_config": { "type": "object", "properties": { "capture_at": { "description": "Preferred server to run the main stream on.", "type": "string" } } }, "url_prefix": { "anyOf": [ { "enum": [ false ], "type": "boolean" }, { "type": "string" } ] }, "output_mpegts_pids": { "type": "object", "properties": { "pmt": { "description": "PID of the elementary stream that contains Program Map Table (PMT) in the outgoing MPEG-TS stream.\n\nPMT contains the description of each program and lists the PIDs of elementary streams associated with that program.\nFor instance, a transport stream used in digital television might contain three programs, to represent three television channels. \nSuppose each channel consists of one video stream, one or two audio streams, and any necessary metadata. \nA receiver wishing to decode one of the three channels merely has to decode the payloads of each PID associated with its program. \nIt can discard the contents of all other PIDs.\n", "allOf": [ { "$ref": "#/components/schemas/ts_pid" } ] }, "pcr": { "description": "PID of the elementary stream that contains PCR (Program Clock Reference) in the outgoing MPEG-TS stream.\n\nPCR is the time label used for synchronization of a stream playback with real time. \nAdditionally, for DVB streams it is used for managing a decoder and its buffer. \nIn this case, PCR gives a signal to the frames with DTS<PCR to be sent to the decoder from the buffer. \nThis mechanism allows to compensate different sizes of frames: if a frame is too big to be played in time with a specified FPS, the frames from the buffer are played.\n", "allOf": [ { "$ref": "#/components/schemas/ts_pid" } ] }, "sdt": { "description": "PID of the elementary stream that contains Service Description Table (SDT) in the outgoing MPEG-TS stream.\nSDT provides information about services contained in MPEG-TS stream.\n", "allOf": [ { "$ref": "#/components/schemas/ts_pid" } ] }, "media": { "description": "Information about a particular media track.", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_pid" } ] }, "type": "array" }, "default": { "description": "The default algorithm of selecting PID for a track.\n\n* `auto`: track PID = PMT PID + track ID, \nwhere PMT PID is the PID of Program Map Table and track ID is a number of the track set by Flussonic \n(usually, all video tracks and then all audio tracks are numbered starting from 1).\n* `increment`: track PID = previous track PID + 1.\n", "enum": [ "auto", "increment" ], "type": "string" } } }, "output_mpegts_ac3": { "type": "string", "oneOf": [ { "const": "system_b" }, { "const": "system_a" }, { "const": "keep" } ], "example": "keep" }, "bm_display_mode": { "enum": [ "ntsc", "nt23", "pal", "ntsp", "palp", "23ps", "24ps", "Hp25", "Hp29", "Hp30", "Hp47", "Hp48", "Hp50", "Hp59", "Hp60", "Hp95", "Hp96", "Hp10", "Hp11", "Hp12", "Hi50", "Hi59", "Hi60", "hp50", "hp59", "hp60", "2k23", "2k24", "2k25", "2d23", "2d24", "2d25", "2d29", "2d30", "2d47", "2d48", "2d50", "2d59", "2d60", "2d95", "2d96", "2d10", "2d11", "2d12", "4k23", "4k24", "4k29", "4k30", "4k47", "4k48", "4k50", "4k59", "4k60", "4k95", "4k96", "4k10", "4k11", "4k12", "4d23", "4d24", "4d25", "4d29", "4d30", "4d47", "4d48", "4d50", "4d59", "4d60", "4d95", "4d96", "4d10", "4d11", "4d12", "8k23", "8k24", "8k25", "8k29", "8k30", "8k47", "8k48", "8k50", "8k59", "8k60", "8d23", "8d24", "8d25", "8d29", "8d30", "8d47", "8d48", "8d50", "8d59", "8d60", "vga6", "svg6", "wxg5", "wxg6", "sxg5", "sxg6", "uxg5", "uxg6", "wux5", "wux6", "1945", "1946", "wqh5", "wqh6", "wqx5", "wqx6", "rwci", "rwcc" ], "type": "string" }, "video_format": { "type": "string", "oneOf": [ { "const": "pal", "description": "pal 720x576 @ 50Hz interlace SMPTE-259" }, { "const": "625i50", "description": "Similar PAL" }, { "const": "ntsc", "description": "NTSC 720x480 @ 59.94Hz interlace SMPTE-259" }, { "const": "525i29.97", "description": "Similar NTSC" }, { "const": "525i29", "description": "Similar NTSC" }, { "const": "720p23.98", "description": "1280x720 @ 23.98Hz progressive SMPTE-296" }, { "const": "720p23", "description": "Similar 720p23.98" }, { "const": "720p24" }, { "const": "720p25" }, { "const": "720p29.97" }, { "const": "720p29" }, { "const": "720p30" }, { "const": "720p50" }, { "const": "720p59.94" }, { "const": "720p59" }, { "const": "720p60" }, { "const": "1080p23.98", "description": "1920x1080 @ 23.98Hz progressive SMPTE-274" }, { "const": "1080p23" }, { "const": "1080p24" }, { "const": "1080p25" }, { "const": "1080p29.97" }, { "const": "1080p29" }, { "const": "1080p30" }, { "const": "1080psf23.98", "description": "1920x1080 @ 23.98Hz progressive Progressive segmented Frame SMPTE-274" }, { "const": "1080psf23" }, { "const": "1080psf24" }, { "const": "1080psf25" }, { "const": "1080psf29.97" }, { "const": "1080psf29" }, { "const": "1080psf30" }, { "const": "1080i50" }, { "const": "1080i59.94" }, { "const": "1080i60" }, { "const": "1080p50", "description": "1920x1080 @ 50Hz progressive annex A or annex B depending hardware SMPTE-274" }, { "const": "1080p50b", "description": "1920x1080 @ 50Hz progressive annex B SMPTE-274" }, { "const": "1080p59.94" }, { "const": "1080p59" }, { "const": "1080p59.94b" }, { "const": "1080p59b" }, { "const": "1080p60" }, { "const": "1080p60b" }, { "const": "2160p50", "description": "4k 3840x2160 @ 50Hz progressive SMPTE-2036" }, { "const": "2160p50b" }, { "const": "2160p59.94" }, { "const": "2160p59" }, { "const": "2160p59.94b" }, { "const": "2160p59b" }, { "const": "2160p60" }, { "const": "2160p60b" }, { "const": "2160p23" }, { "const": "2160p24" }, { "const": "2160p25" }, { "const": "2160p29" }, { "const": "2160p30" } ] }, "language_value": { "type": "string", "description": "The language of the teletext received from an SDI card. \nSpecified according to the ISO 639-2 standard.\n", "pattern": "^[a-zA-Z]{2,3}", "example": "ita" }, "srt_direction": { "type": "object", "properties": { "mode": { "description": "The type of SRT sessions expected for the port.", "enum": [ "play", "publish" ], "type": "string" } }, "required": [ "mode" ] }, "input_media_info": { "allOf": [ { "type": "object", "description": "This structure looks like a regular `media_info`, but it is designed to be a\nmatching filter. It will be used as a mask for matching over incoming tracks with\npatterns.\n\nMatched track templates will be used to rewrite settings of input media_info tracks.\n", "properties": { "tracks": { "description": "Just like a regular `track_info`, but with matching rules,\nthat allow to select which input track must be mapped to output\n", "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/input_track_info" } ] } } } }, { "$ref": "#/components/schemas/media_info_common" } ] }, "input_track_info": { "allOf": [ { "type": "object", "description": "Almost the same as track_info, but with match rules for matching with\nother media_info\n", "properties": { "match": { "allOf": [ { "$ref": "#/components/schemas/input_track_info_match" } ], "description": "Set of matching rules that will be checked\nto select from input tracks\n" } } }, { "$ref": "#/components/schemas/track_info" } ] }, "input_track_info_match": { "type": "object", "properties": { "language": { "type": "string", "description": "Select input track language\n", "example": "eng" }, "codec": { "allOf": [ { "$ref": "#/components/schemas/frame_codec" } ], "description": "Select input codec\n", "example": "ac3" }, "index": { "type": "integer", "description": "SUnfortunately, the sources may change the index of track without notice.\nPlease, use matching by index only and only if no other match option is suitable.\n", "example": 2 } } }, "drm_spec": { "discriminator": { "propertyName": "vendor", "mapping": { "aes128": "#/components/schemas/drm_vendor_aes128", "axinom": "#/components/schemas/drm_vendor_axinom", "buydrm": "#/components/schemas/drm_vendor_buydrm", "conax": "#/components/schemas/drm_vendor_conax", "cpix": "#/components/schemas/drm_vendor_cpix", "drmtoday": "#/components/schemas/drm_vendor_drmtoday", "ezdrm": "#/components/schemas/drm_vendor_ezdrm", "ezdrm_classic": "#/components/schemas/drm_vendor_ezdrm_classic", "gsdrm": "#/components/schemas/drm_vendor_gsdrm", "irdeto": "#/components/schemas/drm_vendor_irdeto", "keyos": "#/components/schemas/drm_vendor_keyos", "pallycon": "#/components/schemas/drm_vendor_pallycon", "playready": "#/components/schemas/drm_vendor_playready", "sample_aes": "#/components/schemas/drm_vendor_sample_aes", "sample_aes_identity": "#/components/schemas/drm_vendor_sample_aes_identity", "solocoo": "#/components/schemas/drm_vendor_solocoo", "verimatrix": "#/components/schemas/drm_vendor_verimatrix", "widevine": "#/components/schemas/drm_vendor_widevine" } }, "oneOf": [ { "$ref": "#/components/schemas/drm_vendor_aes128" }, { "$ref": "#/components/schemas/drm_vendor_axinom" }, { "$ref": "#/components/schemas/drm_vendor_buydrm" }, { "$ref": "#/components/schemas/drm_vendor_conax" }, { "$ref": "#/components/schemas/drm_vendor_cpix" }, { "$ref": "#/components/schemas/drm_vendor_drmtoday" }, { "$ref": "#/components/schemas/drm_vendor_ezdrm" }, { "$ref": "#/components/schemas/drm_vendor_ezdrm_classic" }, { "$ref": "#/components/schemas/drm_vendor_gsdrm" }, { "$ref": "#/components/schemas/drm_vendor_irdeto" }, { "$ref": "#/components/schemas/drm_vendor_keyos" }, { "$ref": "#/components/schemas/drm_vendor_pallycon" }, { "$ref": "#/components/schemas/drm_vendor_playready" }, { "$ref": "#/components/schemas/drm_vendor_sample_aes" }, { "$ref": "#/components/schemas/drm_vendor_sample_aes_identity" }, { "$ref": "#/components/schemas/drm_vendor_solocoo" }, { "$ref": "#/components/schemas/drm_vendor_verimatrix" }, { "$ref": "#/components/schemas/drm_vendor_widevine" } ] }, "drm_system": { "enum": [ "widevine", "fairplay", "playready" ], "type": "string" }, "drm_systems": { "type": "object", "properties": { "systems": { "description": "This parameter is used to specify applicable DRM systems.\nIf you turned off some of the systems (FairPlay, PlayReady, or Widevine) you should specify the systems that remain in use.\n", "items": { "allOf": [ { "$ref": "#/components/schemas/drm_system" } ] }, "type": "array" } } }, "drm_iv": { "type": "object", "properties": { "iv": { "description": "Initialization vector (IV) - an arbitrary number that can be used along with a secret key for data encryption.\nIt is employed only one time in any session.\nThe use of an IV prevents repetition in data encryption, making it more difficult for a hacker to break a cipher.\n\nUsually, IV is received from a DRM provider.\n", "type": "string" } } }, "drm_enc_key_url": { "type": "object", "properties": { "url": { "description": "Http link which specifies how to obtain the key. It is URI attribute of HLS manifest EXT-X-KEY method.\n", "type": "string" } } }, "drm_enc_key": { "type": "object", "properties": { "key": { "description": "Encryption Key in hex or file\n", "type": "string" } } }, "drm_base": { "type": "object", "properties": { "keyserver": { "description": "DRM key server.", "type": "string", "example": "https://keyserver1.mycompany.com" }, "resource_id": { "description": "The ID of a resource (a stream or a VOD file) in DRM system, usually it is a UUID.\nThe DRM system keeps track of viewing each resource by clients.\n\nA resource ID is automatically generated for each stream or VOD file by Flussonic but it changes after renaming.\nIt is possible to set it manually to attach a stream to a particular resource or to combine several streams into one.\n", "type": "string", "format": "drm_resource_id", "example": "L2sItm6", "x-format-description": "drm_resource_id" }, "expires": { "description": "Key rotation interval, in minutes.\n\nBy default, Flussonic does not rotate enryption keys.\nSpecify this parameter to enable encryption key rotation and thus to provide a better securtiy.\n", "type": "integer" }, "encryption": { "description": "If this parameter is set to `full`, all frames are encrypted.\nIf it is set to `sparse` (or empty), only the keyframes are encrypted.\n\nBy default, Flussonic encrypts only key frames. In most cases this is enough to protect the stream from an unauthorized access.\nIt also reduces the power consumption, when decrypting on the client side.\nHowever, some Smart TVs and STBs require all frames to be encrypted.\n", "type": "string", "default": "sparse", "enum": [ "full", "sparse" ] } } }, "drm_cpix_base": { "allOf": [ { "$ref": "#/components/schemas/drm_base" }, { "$ref": "#/components/schemas/drm_systems" }, { "$ref": "#/components/schemas/drm_iv" } ] }, "drm_keyos_base": { "type": "object", "properties": { "userkey": { "description": "A unique identifier of the user\n", "type": "string", "deprecated": true, "x-delete-at": "25.04" }, "content_id": { "description": "A unique identifier of the content, used for Widevine DRM.\nBy default, it is equal to the stream name.\n", "type": "string" }, "end_user_cert": { "description": "Path to end user certificate file.\n", "type": "string" }, "end_user_private_key": { "description": "Path to end user private key file\n", "type": "string" } } }, "drm_vendor_axinom": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Axinom\n", "type": "string", "x-atom": true }, "tenant_id": { "description": "Axinom Tenant Id", "type": "string" }, "management_key": { "description": "Axinom Management Key", "type": "string" } } }, { "$ref": "#/components/schemas/drm_cpix_base" } ] }, "drm_vendor_solocoo": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Solocoo\n", "type": "string", "x-atom": true }, "secret": { "description": "A part of the keyserver's URL: `https://SITE.solocoo.tv/SITEadmintools/papi/SECRET/method`.\n", "type": "string" }, "site": { "description": "A part of the keyserver's URL: `https://SITE.solocoo.tv/SITEadmintools/papi/SECRET/method`.\n", "type": "string" }, "fp": { "description": "Whether to use FairPlay system for key generation.\nIf set to `false`, the requests for FairPlay encryption key are disabled.\n", "type": "string" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_ezdrm": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Ezdrm\n", "type": "string", "x-atom": true }, "user": { "description": "A user name for authorization of a user on a key server.", "type": "string" }, "password": { "description": "A password for authorization of a user on a key server.", "type": "string" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_conax": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Conax\n", "type": "string", "x-atom": true }, "user_path": { "description": "A custom key server path", "type": "string", "example": "12345/nks/conax" } } }, { "$ref": "#/components/schemas/drm_base" }, { "$ref": "#/components/schemas/drm_systems" } ] }, "drm_vendor_cpix": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Cpix\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_cpix_base" } ] }, "drm_vendor_drmtoday": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: DRMtoday\n", "type": "string", "x-atom": true }, "auth_server": { "description": "Authentication server for DRMtoday.", "type": "string", "example": "https://auth.drmtoday.com" }, "merchant_id": { "description": "The uuid of the merchant at DRMtoday.", "type": "string" }, "cpix_config_id": { "description": "The uuid of the CPIX/SPEKE ingest configuration", "type": "string" }, "username": { "description": "The login name of an API account.", "type": "string" }, "password": { "description": "A password for API account.", "type": "string" } } }, { "$ref": "#/components/schemas/drm_cpix_base" } ] }, "drm_vendor_pallycon": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Pallycon\n", "type": "string", "x-atom": true }, "enc_token": { "description": "An API authentication token that is generated when you sign up for the PallyCon service at https://login.pallycon.com/.\n", "type": "string" } } }, { "$ref": "#/components/schemas/drm_cpix_base" } ] }, "drm_vendor_keyos": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "KeyOs\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_keyos_base" }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_verimatrix": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Verimatrix\n", "type": "string", "x-atom": true }, "user_keyserver": { "description": "The URL sent to the client for watching the content.", "type": "string", "example": "https://public-keyserver.mycompany.com" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_irdeto": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Irdeto\n", "type": "string", "x-atom": true }, "account_id": { "description": "ID of the Irdeto DRM account.", "type": "string" }, "ic_host": { "description": "A hostname of Irdeto DRM key server.", "type": "string" }, "password": { "description": "A password for authorization of a user on a key server.", "type": "string" }, "user_name": { "description": "A user name of the Irdeto DRM user.", "type": "string" } } }, { "$ref": "#/components/schemas/drm_cpix_base" } ] }, "drm_vendor_gsdrm": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: GS DRM\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_aes128": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Aes128\n", "type": "string", "x-atom": true }, "hls_ext_x_key_iv": { "description": "This parameter is used for encryption of HLS streams.\nFor successful playback of an AES128 encrypted HLS streams on some modern devices (running on Tizen 5),\nset this pareameter to `false`.\n", "type": "boolean" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_sample_aes": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Sample AES\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_sample_aes_identity": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "Sample AES which uses KEYFORMAT=identity. It allows to encrypt and decrypt content using clear text AES key.\nThe identity value for KEYFORMAT should be used only for testing.\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_iv" }, { "$ref": "#/components/schemas/drm_enc_key" }, { "$ref": "#/components/schemas/drm_enc_key_url" } ] }, "drm_vendor_widevine": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Widevine\n", "type": "string", "x-atom": true }, "aes_key": { "description": "AES (Advanced Encryption Standard) key. Used for Widevine DRM.\n", "type": "string" }, "signer": { "description": "A unique ID of the signer.\nFlussonic uses it to connect to the key server when using test key for Widevine DRM.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/drm-widevine/" }, "type": "string" } } }, { "$ref": "#/components/schemas/drm_base" }, { "$ref": "#/components/schemas/drm_iv" } ] }, "drm_vendor_buydrm": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "BuyDRM\n", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/drm_keyos_base" }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_ezdrm_classic": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Ezdrm classic\n", "type": "string", "x-atom": true }, "user": { "description": "A user name for authorization of a user on a key server.", "type": "string" }, "password": { "description": "A password for authorization of a user on a key server.", "type": "string" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "drm_vendor_playready": { "allOf": [ { "type": "object", "required": [ "vendor" ], "properties": { "vendor": { "description": "FIXME: Playready\n", "type": "string", "x-atom": true }, "keyseed": { "description": "An arbitrary Base64-encoded string of 30 bytes.\nIt is necessary for PlayReady to create an encryption key.\n", "type": "string" }, "la_url": { "description": "License URL, used for PlayReady DRM.", "type": "string", "format": "url", "x-format-description": "url" } } }, { "$ref": "#/components/schemas/drm_base" } ] }, "transponder_push": { "properties": { "url": { "description": "Push URL for the MPTS stream. Usually it is a `udp://` multicast address and port.\n", "type": "string" }, "multicast_loop": { "description": "The multicast socket option that enables ingesting the sent data back to the transponder.\nUse for test purposes, e.g. if the same server creates MTPS and splits MPTS to separate programs.\n", "type": "boolean", "default": true }, "tos": { "description": "ToS byte in the IP packages of the multicasted data.", "type": "integer", "default": 0 }, "standby": { "description": "Monitoring multicast group and stop pushing if another publisher presented", "type": "boolean" }, "stats": { "description": "Detailed runtime information about the push.", "allOf": [ { "$ref": "#/components/schemas/push_counters" } ], "readOnly": true } }, "required": [ "url" ], "type": "object" }, "ts_descriptor": { "type": "object", "properties": { "tag": { "type": "integer", "description": "Identifier of the descriptor." }, "hex": { "type": "string", "format": "hexbinary", "description": "Descriptor data.", "x-format-description": "hexbinary" } }, "required": [ "tag", "hex" ] }, "ts_timeouts": { "type": "object", "properties": { "service_type": { "type": "integer", "description": "The type of the program." }, "media_info": { "type": "integer", "description": "The timeout value." } } }, "ts_service_type": { "anyOf": [ { "type": "integer" }, { "type": "string", "enum": [ "none", "digital_tv", "digital_radio", "teletext", "nvod_reference", "nvod_shifted", "mosaic", "fm_radio", "dvb_srm", "digital_radio_aac", "mosaic_avc", "data", "common_interface", "rcs_map", "rcs_fls", "dvb_mhp", "digital_tv_mpeg2_hd", "digital_tv_avc_sd", "nvod_shifted_avc_sd", "nvod_reference_avc_sd", "digital_tv_avc_hd", "digital_tv_avc_stereo_hd", "nvod_shifted_avc_stereo_hd", "nvod_reference_avc_stereo_hd", "digital_tv_hevc", "digital_tv_hevc_uhd" ] } ] }, "ts_versions": { "type": "object", "properties": { "psi": { "description": "Global version for all PSI tables.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] }, "pat": { "description": "The version of PAT table.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] }, "pmt": { "description": "The version of PMT table.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] }, "nit": { "description": "The version of NIT table.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] }, "sdt": { "description": "The version of SDT table.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] }, "cat": { "description": "The version of CAT table.", "allOf": [ { "$ref": "#/components/schemas/psi_version" } ] } } }, "transponder_time_offset": { "type": "object", "required": [ "country" ], "properties": { "country": { "description": "The country code.", "type": "string" }, "region": { "description": "The region code.", "type": "integer" }, "time_of_change": { "description": "Date and time when the time change takes place.", "allOf": [ { "$ref": "#/components/schemas/iso8601" } ] }, "local_time_offset": { "description": "The current offset time from UTC.", "type": "string" }, "next_time_offset": { "description": "The next offset time after the change.", "type": "string" } } }, "ts_eit_intervals": { "type": "object", "properties": { "actual": { "description": "Period for the actual transponder.", "type": "integer" }, "other": { "description": "Period for the other transponder.", "type": "integer" } } }, "transponder_eit": { "type": "object", "properties": { "max_bitrate": { "description": "Maximum bitrate for the transponder's EIT EPG.", "type": "integer", "format": "max_bitrate", "x-format-description": "max_bitrate" }, "xmltv_url": { "description": "Directory for storing the XMLTV EPG files.", "type": "string", "example": "xmltv_dir" }, "keep_epg": { "description": "Period for storing the XMLTV files.", "type": "integer", "format": "seconds", "x-format-description": "seconds" }, "intervals_pf": { "description": "Periods for sending the present/following events.", "allOf": [ { "$ref": "#/components/schemas/ts_eit_intervals" } ] }, "intervals_schedule": { "description": "Periods for sending the event schedules.", "allOf": [ { "$ref": "#/components/schemas/ts_eit_intervals" } ] } } }, "transponder_program": { "type": "object", "properties": { "program_id": { "description": "Identifier of the program within the transponder.", "allOf": [ { "$ref": "#/components/schemas/program_id" } ], "x-primary-key": true, "openmetrics_label": "program_id" }, "source": { "description": "The stream that is in use as the program source.", "type": "string", "format": "media_name", "openmetrics_label": "source", "example": "hockey1", "x-format-description": "media_name" }, "lcn": { "description": "Logical channel number.", "type": "integer", "example": 5 }, "service_type": { "description": "Information about the program type.", "allOf": [ { "$ref": "#/components/schemas/ts_service_type" } ], "example": "digital_tv" }, "title": { "description": "The program title.", "type": "string", "example": "ProgramTitle" }, "pids": { "description": "The list of PIDs.", "allOf": [ { "$ref": "#/components/schemas/output_mpegts_pids" } ] }, "eit_title": { "description": "The name of the EIT.", "type": "string", "example": "EIT_Title" } }, "required": [ "program_id" ] }, "transponder_config": { "type": "object", "required": [ "name" ], "properties": { "name": { "description": "The name of the transponder.", "type": "string", "format": "media_name", "x-primary-key": true, "readOnly": true, "openmetrics_label": "name", "example": "multiplexer", "x-format-description": "media_name" }, "pushes": { "description": "The list of pushes for the transponder.", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_push" } ] }, "type": "array" }, "bitrate": { "description": "Transponder bitrate.", "type": "integer", "format": "speed", "x-format-description": "speed" }, "provider": { "description": "Provider of the transponder.", "type": "string", "example": "Example Provider" }, "network_name": { "description": "The name of the TV network.", "type": "string", "example": "Example Network" }, "ts_stream_id": { "description": "The identifier of the transport stream for the transponder.", "type": "integer" }, "network_id": { "description": "Identifier of the delivery network.", "type": "integer" }, "original_network_id": { "description": "Identifier of the original delivery network. The same original network is used for NIT and SDT.", "type": "integer" }, "ts_descriptors": { "description": "The list of transport stream descriptors. Descriptors are added to NIT and SDT.", "items": { "allOf": [ { "$ref": "#/components/schemas/ts_descriptor" } ] }, "type": "array", "default": [] }, "timeouts": { "description": "The list of timeouts for autodetect of provider, title, and service_type of the programs.\n", "allOf": [ { "$ref": "#/components/schemas/ts_timeouts" } ] }, "programs": { "description": "The list of programs in the transponder.", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_program" } ] }, "type": "array" }, "time_offsets": { "description": "The list of time offsets.", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_time_offset" } ] }, "type": "array", "default": [] }, "versions": { "description": "Versions of PSI tables.", "allOf": [ { "$ref": "#/components/schemas/ts_versions" } ] }, "others": { "description": "The list of other transponders on the network.", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_other" } ] }, "type": "array", "default": [] }, "eit": { "description": "Transponder's program guide in EIT format.", "allOf": [ { "$ref": "#/components/schemas/transponder_eit" } ] }, "video_buffer": { "description": "The size of the video buffer for the transponder.", "type": "integer" }, "prebuffer": { "description": "The length of multiplexer input buffer.\nThe higher value makes the multiplexer more robust to non-uniform inputs.\nThe lower value reduces input-to-output latency, but requires more stable bitrate (CBR) on input.\n", "format": "milliseconds", "default": 300, "example": 800, "type": "integer", "x-format-description": "milliseconds" }, "stats": { "description": "Detailed runtime information about the multiplexer.", "allOf": [ { "$ref": "#/components/schemas/multiplexer_stats" } ], "readOnly": true } } }, "transponder_other": { "type": "object", "properties": { "name": { "description": "The name of the other transponder on the network.", "type": "string", "format": "media_name", "x-primary-key": true, "readOnly": true, "x-format-description": "media_name" } }, "required": [ "name" ] }, "peer_stats": { "allOf": [ { "$ref": "#/components/schemas/server_stats_whoami" }, { "$ref": "#/components/schemas/server_stats_streamer" }, { "$ref": "#/components/schemas/server_stats_network" }, { "type": "object", "properties": { "error": { "description": "Description of an error, if any.", "type": "string", "x-api-allow": [ "central-layouter" ] }, "predictions": { "type": "object", "description": "Predictions of future stats based on the current state of the cluster.\n", "properties": { "disk": { "$ref": "#/components/schemas/central_disk_predictions", "x-scope": [ "central", "central-layouter" ] } } } } } ] }, "peer_config": { "type": "object", "properties": { "hostname": { "type": "string", "format": "server_name", "description": "Streamer's identifier in the cluster.\n\nThe managing server may try using this hostname to access the streamer \nif API URL is not specified.\n", "x-primary-key": true, "readOnly": true, "example": "peer.example.com", "x-api-allow": [ "central-layouter" ], "x-format-description": "server_name" }, "stats": { "description": "Statistics on peers in the cluster.", "allOf": [ { "$ref": "#/components/schemas/peer_stats" } ], "readOnly": true, "x-api-allow": [ "central-layouter" ] }, "api_url": { "type": "string", "format": "url", "example": "http://streamer.local:8080", "description": "The URL for provisioning of configuration from the managing server to the streamer.\nThis URL does not have to be public but must be accessible from the managing server.\n\nThe API URL can also be used as Public and/or Private payload URL if they are not set.\nWhen used as Public payload URL, the API URL shall be public to allow playback from this streamer.\n", "x-format-description": "url" }, "public_payload_url": { "description": "Clients will be redirected to this URL and port when requesting (via UI or shared URL)\nfor playback of camera captured on this streamer. \nThis URL shall be accessible from the Internet and conform to the specifications of the FQDN.\n\nIf not specified, API URL is used.\n", "type": "string", "example": "http://public.example.com" }, "private_payload_url": { "description": "The internal address for video transfer between streamers in a local network.\nIf not specified, API URL is used. \n\nThe Private payload URL will be used when accessing archive of a stream \nthat is currently ingested on other streamer due to layout change.\nOr, when other streamer restreams a camera from this streamer. \n", "type": "string", "format": "url", "example": "http://streamer.local", "x-format-description": "url" }, "fetch_timeout": { "description": "How often the peer will try to get the data from the remote server via internal API.", "type": "integer", "format": "milliseconds", "example": 1000, "x-format-description": "milliseconds" }, "stale_timeout": { "description": "The time after which deleted streams on this server are considered to be inactive \nand cannot be used in the `cluster_ingest` mechanism.\n", "type": "integer", "format": "milliseconds", "example": 1000, "x-format-description": "milliseconds" }, "channel_limit": { "description": "Maximal number of streams.", "type": "integer", "example": 5, "x-api-allow": [ "central-layouter" ] }, "cpu_limit": { "description": "CPU limit in percents.", "type": "integer", "format": "percent", "example": 10, "x-format-description": "percent" }, "cluster_key": { "description": "The key for authorization for inter-Flussonic connections.\nAll cluster peers should have the same cluster key.\n", "type": "string", "example": "xS6i6Q3DCc5nEvnu", "x-api-allow": [ "central-layouter" ] }, "max_bitrate": { "description": "Maximal output bitrate of the peer.", "type": "integer", "format": "speed", "deprecated": true, "x-delete-at": 23.09, "x-format-description": "speed" } } }, "balancer_config": { "type": "object", "properties": { "name": { "type": "string", "format": "media_name", "description": "Globally unique balancer name.", "readOnly": true, "x-primary-key": true, "x-format-description": "media_name" }, "servers": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/balancer_server_config" } ] }, "description": "Balancer will distribute requests between these servers." }, "peers": { "description": "Configuration of the peers.", "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/peer_config" } ] }, "deprecated": true, "x-delete-at": 23.09 }, "mode": { "description": "Balancing mode", "type": "string", "default": "bitrate", "oneOf": [ { "title": "Usage", "const": "usage", "description": "Bandwidth usage" }, { "title": "Clients", "const": "clients", "description": "Total clients number" }, { "title": "Bitrate", "const": "bitrate", "description": "Total output bitrate" }, { "title": "Streams", "const": "streams", "description": "Streams number" } ] } } }, "balancer_server_config": { "type": "object", "properties": { "name": { "type": "string", "description": "Hostname of the peer. Can refer to globally defined peer.", "x-primary-key": true, "readOnly": true }, "max_bitrate": { "type": "integer", "format": "speed", "description": "Maximum allowed bitrate, request is redirecting if current bitrate is lower.", "x-format-description": "speed" }, "countries": { "type": "array", "items": { "type": "string", "format": "iso3166", "x-format-description": "iso3166" }, "description": "Client will be redirected to the peer if its IP belongs to one of these countries." }, "countries_default": { "type": "boolean", "default": false, "description": "This flag allows to redirect a request to this peer if \"countries\" list not matched." } } }, "source_config": { "allOf": [ { "$ref": "#/components/schemas/source_specific_config" }, { "$ref": "#/components/schemas/stream_config_media" }, { "$ref": "#/components/schemas/stream_config_onpremises" } ] }, "source_group_config": { "type": "object", "properties": { "name": { "description": "Tha name of the source group.", "type": "string", "format": "group_name", "x-format-description": "group_name" }, "on_play": { "description": "Path to auth backend, either HTTP URL or path to script on disk. Play sessions only.", "allOf": [ { "$ref": "#/components/schemas/auth_spec" } ] }, "cache": { "description": "Cache configuration.", "allOf": [ { "$ref": "#/components/schemas/cache_spec" } ] }, "segment_duration": { "description": "The time, in seconds, of the segment duration. Used for the protocols like HLS or DASH. \n", "allOf": [ { "$ref": "#/components/schemas/segment_duration" } ] }, "dvr": { "description": "DVR configuration.", "allOf": [ { "$ref": "#/components/schemas/stream_dvr_spec" } ] } } }, "source_specific_config": { "type": "object", "properties": { "url": { "description": "URL and port of the remote server to get streams from.", "type": "string", "format": "hostport", "x-primary-key": true, "pattern": "^(m4f:|m4fs:|m4s:|m4ss:).+", "x-format-description": "Hostname with port" }, "prefix": { "description": "The prefix used for the streams on the remote server from which the peer gets them.\n", "type": "string", "format": "media_name", "x-format-description": "media_name" }, "stats": { "description": "Statistics of the peer.", "allOf": [ { "$ref": "#/components/schemas/peer_stats" } ] }, "only": { "description": "White list of streams. \nThe items of the array may be individual stream names or values like `prefix/*`\nwhich stands for all streams with the given prefix.\n", "type": "array", "items": { "type": "string", "format": "media_name", "x-format-description": "media_name" } }, "except": { "description": "Black list of streams. Higher priority than `only`.", "type": "array", "items": { "type": "string", "format": "media_name", "x-format-description": "media_name" } }, "group_config": { "description": "Configuration applied to the specific group of streams (all or limited by `only` and `except`) received from the sources.", "type": "object", "additionalProperties": { "$ref": "#/components/schemas/source_group_config" }, "x-key-type": "string" }, "cluster_key": { "description": "Cluster ingest stream key.", "type": "string" } } }, "logo_file": { "type": "object", "properties": { "name": { "type": "string", "description": "The logo name." }, "stream_names": { "description": "List of streams that use this logo", "type": "array", "items": { "type": "string" }, "default": [], "readOnly": true }, "content": { "description": "Payload of this logo", "type": "string", "format": "byte", "x-format-description": "byte" }, "content_type": { "description": "Content type of this logo. Calculated from file name extension\n", "type": "string", "readOnly": true } } }, "disk_file": { "type": "object", "properties": { "name": { "description": "The file or directory name.", "type": "string", "format": "media_name", "examples": { "default": { "value": "vod/bunny.mp4" }, "bunny1": { "value": "vod/bunny1.mp4" }, "bunny2": { "value": "vod/bunny2.mp4" }, "bunny3": { "value": "vod/bunny3.mp4" } }, "x-format-description": "media_name" }, "prefix": { "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "type": "string", "format": "media_name", "examples": { "default": { "value": "vod" }, "bunny1": { "value": "vod1" }, "bunny2": { "value": "vod2" }, "bunny3": { "value": "vod3" } }, "x-format-description": "media_name" }, "url": { "description": "URL of the file or directory.", "type": "string", "examples": { "default": { "value": "/storage/bunny.mp4" }, "bunny1": { "value": "/storage/bunny1.mp4" }, "bunny2": { "value": "/storage/bunny2.mp4" }, "bunny3": { "value": "/storage/bunny3.mp4" } } }, "folder": { "description": "Name of the folder containing the file or directory.", "type": "string", "example": "example" }, "subpath": { "description": "Subpath to the file or directory in the storage.", "type": "string", "examples": { "default": { "value": "bunny.mp4" }, "bunny1": { "value": "bunny1.mp4" }, "bunny2": { "value": "bunny2.mp4" }, "bunny3": { "value": "bunny3.mp4" } } }, "bytes": { "description": "File size in bytes.", "type": "integer", "example": 42309561 }, "is_directory": { "description": "Whether it is a directory.", "type": "boolean", "default": false, "example": false }, "is_multibitrate_directory": { "description": "Whether it is a directory with multi-bitrate content.", "type": "boolean", "default": false, "example": false }, "opened": { "description": "Whether the file or directory is currently opened.", "type": "boolean", "default": false, "example": true }, "stats": { "description": "Statistics of the file usage.", "allOf": [ { "$ref": "#/components/schemas/disk_file_stats" } ] } } }, "disk_file_stats": { "type": "object", "properties": { "worker_count": { "description": "Number of worker threads on the server executing the task of playing the file.", "type": "integer", "example": 1 }, "client_count": { "description": "Number of clients playing the file.", "type": "integer", "format": "client_count", "examples": { "default": { "value": 2 }, "bunny1": { "value": 1 }, "bunny2": { "value": 10 }, "bunny3": { "value": 5 } }, "x-format-description": "client_count" }, "bytes_in": { "description": "Number of bytes read from the disk.", "type": "integer", "format": "bytes", "example": 1700923231, "x-format-description": "bytes" }, "bytes_out": { "description": "Number of bytes downloaded form the disk.", "type": "integer", "format": "bytes", "example": 1700923231, "x-format-description": "bytes" }, "media_info": { "description": "Technical information about the output media content.", "allOf": [ { "$ref": "#/components/schemas/media_info" } ] } } }, "vod_storage": { "type": "object", "properties": { "url": { "type": "string", "description": "The storage (on the disk or on another server) that Flussonic will scan for VOD files.\nIf it is a path on the disk, it should be specified relating to the disk root.\n\nIt is possible to specify multiple storages for one VOD location. When Flussonic gets the URL for playing the file, it finds the prefix in this URL, \ncuts the path after it and consequently searches for this path in all specified storages.\n", "example": "/storage" }, "extra": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Some additional options." } } }, "vod_config": { "type": "object", "properties": { "prefix": { "description": "The unique name of VOD location. \n\nIt is used as a prefix in file playback requests to explicitly specify where the system should find the files for playing. \nAll the path after the prefix will be cut and added to the specified path on the disk (the storage configured for this VOD location). \nThus, the system will find the file on the disk and play it.\n", "type": "string", "format": "media_name", "x-primary-key": true, "example": "movies", "x-format-description": "media_name" }, "auto_mbr": { "description": "Turns on automatic creation of a multi-bitrate HLS playlist from several files with different bitrates.", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/play-mbr-vod-with-auto-mbr/" }, "type": "boolean", "default": false }, "position": { "type": "integer", "format": "sort_index", "description": "If an order of VOD locations is declared, it is a position of the this VOD location in the order.", "x-notice": "only for stream", "example": 1, "x-format-description": "sort_index" }, "disabled": { "description": "Whether this VOD location is disabled.", "type": "boolean", "example": false }, "storages": { "description": "The directories (on disk or on another server) that Flussonic scans for VOD files.", "items": { "allOf": [ { "$ref": "#/components/schemas/vod_storage" } ] }, "type": "array" }, "on_play": { "description": "Configuraton of the authorization backend for play sessions **only**. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/authorize-clients/#auth-on_play" }, "allOf": [ { "$ref": "#/components/schemas/auth_spec" } ] }, "cache": { "description": "Configuraton of the local file cache which is used for files from a cloud or an HTTP server.\n\nIf this option is enabled, a file will be downloaded to a local cache path by megabyte blocks. \nDuring playback, the file will be first read from the cache. \nThis allows to avoid multiple HTTP requests to the source for each part of data and, thus, to speed up broadcasting.\n", "allOf": [ { "$ref": "#/components/schemas/cache_spec" } ] }, "read_queue": { "description": "The number of simultaneous readers form disk that should wait in a queue for playing a file.", "type": "integer", "example": 100 }, "thumbnails": { "description": "Configuration of thumbnails generator.", "allOf": [ { "$ref": "#/components/schemas/thumbnails_spec" } ] }, "download": { "description": "Enables downloading files from the URL `http://FLUSSONIC-IP:80/vod_prefix/file_subpath.mp4`. \nThe `Range` HTTP headers are supported.\n", "type": "boolean", "default": false, "example": false }, "protocols": { "description": "Configuraton of play protocols.", "allOf": [ { "$ref": "#/components/schemas/play_protocols_spec" } ] }, "url_prefix": { "description": "The names of separate segments within a segment-based HLS or DASH playlist start with the *specified* prefix. \nThe option no longer works for *variant playlists*.\n", "allOf": [ { "$ref": "#/components/schemas/url_prefix" } ] }, "segment_duration": { "description": "The time, in seconds, of the segment duration. Used for the protocols like HLS or DASH.", "allOf": [ { "$ref": "#/components/schemas/segment_duration" } ] }, "logo": { "description": "Overlay logo.", "allOf": [ { "$ref": "#/components/schemas/web_logo_spec" } ] }, "timeout": { "description": "The time (in milliseconds) passed since the last file request.\nIf the file was not requested within this period, it will be closed and its resources will be deallocated.\n", "type": "integer", "example": 3 }, "drm": { "description": "Configuraton of the content encryption (DRM).", "allOf": [ { "$ref": "#/components/schemas/drm_spec" } ] }, "add_audio_only": { "description": "Whether to add an audio-only version of an HLS stream. \nUsed to create App Store compliant HLS streams to deliver the content to Apple iOS devices.\nAdd audio-only HLS playlist to variant MBR playlist for iOS compliant streaming.\n", "type": "boolean", "example": false }, "provider": { "description": "Human-readable name of the content provider. Applicable to MPEG-TS.", "type": "string" } } }, "dvb_card_config": { "type": "object", "properties": { "name": { "description": "DVB card name.", "type": "string", "format": "dvb_card_name", "x-primary-key": true, "readOnly": true, "openmetrics_label": "name", "example": "a16", "x-format-description": "dvb_card_name" }, "hw": { "description": "Adapter card hardware type.", "type": "string", "enum": [ "dvb", "dektec_asi", "record_input", "resi", "tbs6014" ], "example": "dvb" }, "system": { "description": "Adapter type. Different systems are supported besides DVB, as the configuring is similar.", "type": "string", "enum": [ "dvbs", "dvbs2", "dvbt", "dvbt2", "dvbca", "dvbcb", "dvbcc", "atsc", "isdbt" ] }, "adapter": { "description": "Adapter number.", "type": "integer", "example": 16 }, "device": { "description": "Modulator number in adapter.", "type": "integer" }, "frontend": { "description": "Frontend number.", "type": "integer" }, "frequency": { "description": "The carrier frequency of the transponder for this channel, in Hz.", "type": "integer", "example": 11606 }, "symbol_rate": { "description": "The symbol rate of the transponder, in symbols per second.\nA symbol is a pulse in digital baseband transmission.\n", "type": "integer", "example": 27500 }, "int_freq": { "description": "Base frequency, in MHz.", "type": "integer" }, "high_band": { "description": "Whether high frequency band is used.", "type": "boolean" }, "polarization": { "description": "Polarization of the transponder for this channel. \nThe supported values are: \n\n * `v`- vertical linear polarization, \n * `h` - horizontal linear polarization, \n * `r` - right-hand circular polarization, \n * `l` - left-hand circular polarization.\n", "type": "string", "enum": [ "v", "h", "r", "l" ], "example": "v" }, "hierarchy": { "description": "Constellation ratio for hierarchical transmission.\n", "externalDocs": { "description": "Find more information here", "url": "https://dvb.org/wp-content/uploads/2019/12/a012_dvb-t_june_2015.pdf" }, "type": "string", "enum": [ "1", "2", "4", "none", "auto" ] }, "transmission_mode": { "description": "DVB transmission mode.", "type": "string", "enum": [ "1k", "2k", "8k", "16k", "32k", "c1", "c3780" ] }, "guard_interval": { "description": "The mode of inserting a guard interval - a padding separating transmissions so that they do not interfere with each other.\n", "type": "string", "enum": [ "1_128", "1_32", "1_16", "1_8", "1_4", "19_128", "19_256", "pn420", "pn595", "pn945" ], "example": "1_16" }, "pilot": { "description": "Enable, disable, or autodetect pilot tones.\n", "type": "string", "enum": [ "auto", "on", "off" ], "example": "auto" }, "rolloff": { "description": "Rolloff factor, in %.\nIt is used to estimate bandwidth, together with symbol rate.\n", "type": "string", "enum": [ "35", "25", "20" ] }, "bandwidth": { "description": "Bandwidth, in Hz.", "type": "integer", "enum": [ 1712000, 5000000, 6000000, 7000000, 8000000, 10000000 ], "example": 6000000 }, "code_rate_lp": { "description": "Low priority stream code rate.", "allOf": [ { "$ref": "#/components/schemas/dvb_fec" } ] }, "code_rate_hp": { "description": "High priority stream code rate.", "allOf": [ { "$ref": "#/components/schemas/dvb_fec" } ] }, "modulation": { "description": "DVB-C modulation method.", "type": "string", "enum": [ "auto", "qpsk", "qam16", "qam32", "qam64", "qam128", "qam256", "qam_auto", "psk8", "apsk16", "apsk32", "vsb8", "vsb16", "dqpsk", "qam4nr" ], "example": "auto" }, "disabled": { "description": "Whether this DVB card is disabled.", "type": "boolean", "example": false }, "comment": { "description": "Any text comment.", "type": "string" }, "stats": { "description": "Statistic information about the captured signal.", "allOf": [ { "$ref": "#/components/schemas/dvb_card_stats" } ] }, "serial": { "description": "Serial number of the card, used for capturing from DekTec ASI cards.", "type": "integer" }, "port": { "description": "Port number, used for capturing from DekTec ASI cards.", "type": "integer" }, "compensate_time_drift_ppm": { "description": "Max source's internal clock drift to compensate, rounding to six decimal places.", "type": "integer" }, "plp_stream_id": { "description": "PLP stream selector. Used in DVB-T2.", "type": "integer" }, "attenuator": { "description": "Attenuation of the signal level. Takes values from 0 to 10.\n", "type": "integer" }, "interleave": { "description": "Use interleaver.\nThe interlaver disperses sequence of bits in bit stream to minimize effect of burst errors during transmission.\n", "type": "integer", "minimum": 0, "maximum": 15 }, "gain": { "description": "Adjust the output gain to the specified value in dB.", "type": "integer" }, "input_bitrate": { "description": "Input bitrate, in Mbps.", "type": "integer" }, "video_device": { "description": "The video device to capture video from Stream Labs SDI/ASI cards.\nIt is actually a path to a device file created on the disk by Video4Linux.\n", "type": "string", "example": "/dev/video0" } }, "required": [ "name" ] }, "dvb_card_stats": { "type": "object", "properties": { "ber": { "description": "Bit error rate. It is the percent of bit errors from total number of transferred bits.\n", "type": "integer", "example": 5 }, "strength_raw": { "description": "Signal strength, as a raw 16-bit number received from DVB API.", "type": "integer", "example": 62446 }, "strength": { "description": "Signal strength, in percent.", "type": "integer", "openmetrics_metric": "dvb_card_strength", "x-metric-type": "gauge", "example": 95 }, "snr_raw": { "description": "Signal-noise ratio, as a raw 16-bit number received from DVB API. It is the ratio of signal power to the noise power.\n", "type": "integer", "example": 894 }, "snr": { "description": "Signal-noise ratio, in percent. It is the ratio of signal power to the noise power. \n", "type": "integer", "example": 1 }, "has_signal": { "description": "Whether a signal is detected above the normal noise level.", "type": "boolean", "example": true }, "has_carrier": { "description": "Carrier detected in signal.", "type": "boolean", "example": true }, "has_viterbi": { "description": "DVB signal was locked at Viterbi decoder stage.", "type": "boolean", "example": true }, "has_sync": { "description": "Synchronization bytes detected.", "type": "boolean", "example": true }, "has_lock": { "description": "DVB signal was successfully locked.", "type": "boolean", "example": true }, "has_timedout": { "description": "The signal was not locked within the last about 2 seconds.", "type": "boolean", "example": false }, "has_reinit": { "description": "The frontend was reinitialized, the application is recommended to reset DiSEqC, tone and parameters.\n", "type": "boolean", "example": false }, "has_rate": { "description": "Input rate is sufficient (900 bps or greater). Used for capturing from DekTec ASI cards.\n", "type": "boolean", "example": true } } }, "dvb_fec": { "type": "string", "enum": [ "1_2", "2_3", "2_5", "3_4", "3_5", "4_5", "5_6", "6_7", "7_8", "8_9", "9_10" ] }, "genlock_status": { "oneOf": [ { "title": "No reference input signal is detected on the reference source input port.", "const": "no_ref" }, { "title": "A valid reference input signal is detected on the reference source input.", "const": "locking" }, { "title": "Full clock-lock has been achieved.", "const": "locked" }, { "title": "Invalid reference input signal is detected on the reference source input.", "const": "invalid" }, { "title": "Clock-lock feature not supported.", "const": "not_supported" }, { "title": "Unknown clock-lock state.", "const": "unknown" } ] }, "genref_status": { "type": "object", "properties": { "port": { "description": "Detected genref input port number.", "type": "integer" }, "external": { "description": "If true genref port is a physical port, else genref port is a virtual port (internal clock-lock feature).", "type": "boolean" }, "vstd": { "description": "Configured reference signal video standard.", "anyOf": [ { "$ref": "#/components/schemas/video_format" } ] }, "vstd_detected": { "description": "Detected (actual) reference signal video standard.", "anyOf": [ { "$ref": "#/components/schemas/video_format" } ] } } }, "decklink_card_id": { "oneOf": [ { "type": "integer" }, { "const": "test_fake", "type": "string" } ] }, "decklink_config": { "type": "object", "properties": { "name": { "description": "The Decklink card name.", "allOf": [ { "$ref": "#/components/schemas/decklink_card_id" } ], "x-primary-key": true, "readOnly": true }, "profile": { "description": "The Decklink card profile that allows choosing between input and output direction.", "oneOf": [ { "const": "one_full", "description": "The `bmdProfileOneSubDeviceFullDuplex` mode." }, { "const": "one_half", "description": "The `bmdProfileOneSubDeviceHalfDuplex` mode." }, { "const": "two_full", "description": "The `bmdProfileTwoSubDevicesFullDuplex` mode." }, { "const": "two_half", "description": "The `bmdProfileTwoSubDevicesHalfDuplex` mode." }, { "const": "four_half", "description": "The `bmdProfileFourSubDevicesHalfDuplex` mode." } ] } } }, "event_sink_filter": { "type": "object", "additionalProperties": { "description": "A set of filters for event fields.\nYou can specify an event field and its possible values.\n", "type": "array", "items": { "type": "string", "example": "stream_stopped" } } }, "event_sink_config": { "type": "object", "required": [ "name", "url" ], "properties": { "name": { "type": "string", "format": "event_sink_name", "description": "Globally unique event sink name.", "x-primary-key": true, "readOnly": true, "example": "my_json_sink", "x-format-description": "event_sink_name" }, "url": { "type": "string", "description": "Path where events are sent.\n\n* For event handler, it is the URL of an HTTP handler or the path to a lua script: `http://URL`, `https://URL`, or `path_to_lua_script.lua`.\n* For event logging, it is the path to a log file (human-readable text file or JSON): `log://path_to_log_file.log` or `jsonlog://path_to_log_file.json`.\n", "example": "jsonlog:///var/log/events-json.log", "pattern": "^(log|jsonlog|http|https)://.+$|^pid://<[0-9]+\\.[0-9]+\\.[0-9]+>$" }, "only": { "description": "If specified, only the events that match **every** filter in the filter set will be passed to the event sink target.\n\nThat is, if even one of the conditions is not satisfied, an event will **not** be processed. \nEach filter (condition) has several possible values. For an event to satisfy the condition, \nan event should match **any** of the specified values, not all of them.\n", "type": "array", "items": { "$ref": "#/components/schemas/event_sink_filter" }, "examples": { "default": { "value": [ { "event": [ "listener_start" ], "group": [ "system_overloaded" ] } ] } } }, "except": { "description": "If specified, only the events that match **every** filter in the filter set will not be be passed to the event sink target.\n\nThat is, if even one of the conditions is not satisfied, an event will be processed.\n\nEach filter (condition) has several possible values. For an event to satisfy the condition, \nan event should match **any** of the specified values, not all of them.\n", "type": "array", "examples": { "default": { "value": [ { "event": [ "stream_stopped", "stream_started", "source_*" ] } ] } }, "items": { "$ref": "#/components/schemas/event_sink_filter" } }, "throttle_delay": { "description": "The delay (in seconds) before sending an event to the sink after saving it into the buffer. \nThis parameter allows to lower frequency of sending events.\n\nIf there are more than 100 events in the buffer, all of them will be sent to the sink without any delay. \n", "type": "integer", "format": "seconds", "example": 1, "x-format-description": "seconds" }, "max_size": { "description": "Maximum size of a log file. \n\nWhen this limit is reached, log rotation is performed: the oldest events will be overridden by later data.\n", "type": "integer", "format": "bytes", "example": 10000, "x-format-description": "bytes" }, "max_depth": { "description": "Maximal number of log files with events (JSON or text) that can be stored on a disk.\n\nWhen this limit is reached, log rotation is performed: the oldest files will be overridden by later data.\n", "type": "integer", "example": 100 }, "resend_limit": { "description": "If an error occurs (`HTTP 500` or any other error), then *Flussonic* will try to buffer events and send them later.\n\nThe option defines the **number** of events to keep in memory for further delivery.\n\nThe default value is `unlimited`.\n", "type": "integer", "example": 1000 }, "resend_timeout": { "description": "How often *Flussonic* will try to resend non-confirmed events to the handler (in seconds).", "type": "integer", "example": 10 }, "level": { "allOf": [ { "$ref": "#/components/schemas/loglevel" } ], "description": "Specify logging level for this sink. Anything more verbose than it will not get into this sink.\n" }, "extra": { "additionalProperties": { "type": "string" }, "type": "object", "description": "Some additional options." } } }, "streamer_event1": { "oneOf": [ { "$ref": "#/components/schemas/server_starting" }, { "$ref": "#/components/schemas/server_started" }, { "$ref": "#/components/schemas/change_server_id" }, { "$ref": "#/components/schemas/presence_connected" }, { "$ref": "#/components/schemas/presence_disconnected" }, { "$ref": "#/components/schemas/config_external_error" }, { "$ref": "#/components/schemas/config_external_success" }, { "$ref": "#/components/schemas/source_opened" }, { "$ref": "#/components/schemas/source_connected" }, { "$ref": "#/components/schemas/source_started" }, { "$ref": "#/components/schemas/source_updated" }, { "$ref": "#/components/schemas/source_closed" }, { "$ref": "#/components/schemas/stream_opened" }, { "$ref": "#/components/schemas/stream_updated" }, { "$ref": "#/components/schemas/stream_closed" }, { "$ref": "#/components/schemas/play_opened" }, { "$ref": "#/components/schemas/play_started" }, { "$ref": "#/components/schemas/play_updated" }, { "$ref": "#/components/schemas/play_closed" }, { "$ref": "#/components/schemas/push_opened" }, { "$ref": "#/components/schemas/push_connected" }, { "$ref": "#/components/schemas/push_started" }, { "$ref": "#/components/schemas/push_updated" }, { "$ref": "#/components/schemas/push_closed" }, { "$ref": "#/components/schemas/push_blocked" }, { "$ref": "#/components/schemas/push_restored" }, { "$ref": "#/components/schemas/push_reconfigured" }, { "$ref": "#/components/schemas/chassis_connected" }, { "$ref": "#/components/schemas/chassis_disconnected" }, { "$ref": "#/components/schemas/transcoder_device_insufficient_resources" }, { "$ref": "#/components/schemas/webrtc_play_prober_timeout" }, { "$ref": "#/components/schemas/webrtc_play_prober_wrong_interval" }, { "$ref": "#/components/schemas/ad_injected" }, { "$ref": "#/components/schemas/multiplexer_pid_on" }, { "$ref": "#/components/schemas/multiplexer_pid_off" }, { "$ref": "#/components/schemas/motion_started" }, { "$ref": "#/components/schemas/motion_stopped" }, { "$ref": "#/components/schemas/api_call_event" }, { "$ref": "#/components/schemas/dvr_clean" }, { "$ref": "#/components/schemas/dvr_drop_write" }, { "$ref": "#/components/schemas/dvr_collapsed_write" }, { "$ref": "#/components/schemas/dvr_export_finished" }, { "$ref": "#/components/schemas/dvr_consistency_check_finished" } ], "discriminator": { "propertyName": "event" } }, "event_default": { "type": "object", "properties": { "utc_ms": { "type": "integer", "format": "utc_ms", "description": "The time of the event registration on the server.\n", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "event_id": { "type": "integer", "description": "Event identifier.\n" }, "trace_id": { "type": "string", "format": "uuid", "description": "Unique identifier of the operation.\nYou can use this field to search for events related to same operation.\nValue of this field is taken from the `X-Trace-Id` header.\nIf `X-Trace-Id` header is not set, it will be generated automatically.\nService will use the value of this field to make outgoing requests.\n", "example": "05cec7ee-fbd0-11ed-be56-0242ac120002", "x-format-description": "uuid" }, "server": { "type": "string", "description": "Originator of event.\nThis field is present if [event_sink.url](https://flussonic.com/doc/api/reference/#tag/events/operation/event_sink_get/response%7Curl)\nis configured as HTTP/HTTPS url.\n", "example": "flussonic.host" } } }, "event_media": { "type": "object", "properties": { "media": { "type": "string", "description": "The name of the stream or file where the event was captured.\n" }, "submedia": { "description": "Some additional info on the media, may vary depending on the media type.\n", "type": "string" } } }, "event_session": { "type": "object", "properties": { "token": { "type": "string", "format": "session_token", "description": "Token provided by the client.", "example": "zGAFxLkoWluO1pG7_nJmQAbCnM5", "x-format-description": "session_token" }, "duration": { "description": "Duration of the session.", "type": "integer", "format": "seconds", "x-format-description": "seconds" }, "referer": { "type": "string", "format": "uri", "description": "Referer HTTP header or its analog for other protocols.", "example": "http://my-tv-portal.local/hockey1", "x-format-description": "uri" }, "user_agent": { "type": "string", "format": "user_agent", "description": "Client's user agent for selected protocol.", "example": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML. like Gecko) Chrome/90.0.4430.72 Safari/537.36", "x-format-description": "user_agent" }, "query_string": { "type": "string", "description": "Full query string of initial request of the session." } } }, "event_play": { "type": "object", "properties": { "country": { "description": "The country determined from the user's IP address.", "type": "string" }, "user_name": { "description": "User-provided original stream/VOD name.", "type": "string" }, "user_id": { "description": "User ID provided by the authorization backend like Middleware, your billing, or web portal.", "type": "string" } } }, "server_starting": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Server started booting." }, "version": { "description": "Version of service.", "type": "string" }, "full_version": { "description": "Full version of service with the build number.", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "server_started": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Server started successfully." }, "previous_state": { "$ref": "#/components/schemas/previous_server_state" }, "version": { "description": "Version of Service.", "type": "string" }, "instance_id": { "description": "The ID of the started instance.", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "change_server_id": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Change the server ID." }, "old": { "description": "The previous server ID.", "type": "string" }, "instance_id": { "description": "The instance ID.", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "presence_connected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Presence connected." }, "flush": { "description": "The number of flushes.", "type": "integer" }, "ip": { "description": "Presence server IP address.", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "presence_disconnected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Presence disconnected." }, "reason": { "description": "Reason for disconnecting from the presence server.", "type": "string", "x-atom": true }, "ip": { "description": "Presence server IP address.", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "config_external_error": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "External config is not valid." } } }, { "$ref": "#/components/schemas/config_external_error_status" }, { "$ref": "#/components/schemas/event_default" } ] }, "config_external_success": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "External config is successfully refreshed." } } }, { "$ref": "#/components/schemas/event_default" } ] }, "source_opened": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Source opened." }, "url": { "description": "The input (source) URL.", "type": "string", "format": "url", "x-format-description": "url" }, "priority": { "description": "The input priority.", "type": "integer" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "source_connected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Source is connected" }, "url": { "description": "The input (source) URL.", "type": "string", "format": "url", "x-format-description": "url" }, "priority": { "description": "The input priority.", "type": "integer" }, "status": { "type": "string", "description": "Status", "oneOf": [ { "title": "Connecting", "const": "connecting", "description": "Connection is in progress" }, { "title": "Connected", "const": "connected", "description": "Source is connected" }, { "title": "Retrying", "const": "retrying", "description": "Retrying connection" }, { "title": "Redirected", "const": "redirected", "description": "Redirection received from the source" }, { "title": "Socket_connected", "const": "socket_connected", "description": "Socket is connected" }, { "title": "Transport_connected", "const": "transport_connected", "description": "Transport is connected" } ], "example": "socket_connected" }, "while": { "type": "string", "description": "The state of connection", "example": "rtsp_setup" }, "version": { "type": "string", "description": "Protocol version (when applicable)" }, "redirected_to": { "type": "string", "description": "URL to which connection was redirected. The value is available only on 'redirected' status. \n" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "source_started": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Source started." }, "url": { "description": "The input (source) URL.", "type": "string", "format": "url", "x-format-description": "url" }, "priority": { "description": "The input priority.", "type": "integer" }, "dts": { "description": "First frame DTS (Decoding Time Stamp).", "type": "number" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "source_updated": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Source updated." }, "url": { "description": "The input (source) URL.", "type": "string", "format": "url", "x-format-description": "url" }, "priority": { "description": "The input priority.", "type": "integer" }, "bitrate": { "description": "The input bitrate.", "type": "number", "format": "speed", "x-format-description": "speed" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "source_closed": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Source closed." }, "url": { "description": "The input (source) URL.", "type": "string", "format": "url", "x-format-description": "url" }, "priority": { "description": "The input priority.", "type": "integer" }, "bitrate": { "description": "The input bitrate.", "type": "number", "format": "speed", "x-format-description": "speed" }, "reason": { "description": "Reason for closing the source.", "type": "object" }, "limit": { "description": "Retry limit.", "type": "integer" }, "count": { "description": "Retry count.", "type": "integer" }, "client_count": { "description": "The number of clients.", "type": "integer" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "stream_opened": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Stream opened." } } }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "stream_updated": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Stream updated." }, "reason": { "description": "Reason for updating the stream.", "type": "string", "x-atom": true }, "sub_id": { "description": "Sub-stream ID.", "type": "string", "format": "uuid", "x-format-description": "uuid" }, "sub_bytes": { "description": "The number of bytes sent in the sub-stream.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "sub_opened_at": { "description": "The time when the sub-stream was created.", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" }, "bytes_in": { "description": "The amount of stream data received.", "type": "integer", "format": "bytes", "x-format-description": "bytes" }, "bytes_out": { "description": "The amount of stream data sent to the clients.", "type": "integer", "format": "bytes", "x-format-description": "bytes" } } }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "stream_closed": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Stream closed." }, "reason": { "description": "Reason for closing the stream.", "type": "string", "x-atom": true }, "bytes_out": { "description": "The number of bytes transmitted.", "type": "integer", "format": "bytes", "x-format-description": "bytes" } } }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "play_opened": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Play session opened." } } }, { "$ref": "#/components/schemas/event_play" }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "play_started": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Play session started." } } }, { "$ref": "#/components/schemas/event_play" }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "play_updated": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Play session updated." } } }, { "$ref": "#/components/schemas/event_play" }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "play_closed": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Play session closed." }, "reason": { "description": "Reason for closing the play session.", "type": "object" } } }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/event_play" } ] }, "push_opened": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push opened." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" }, "retry_count": { "description": "The number of attempts to start pushing.", "type": "integer" }, "retry_limit": { "description": "The maximum number of attempts to push the stream.", "type": "integer" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_connected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push connected." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" }, "status": { "description": "The push status.", "type": "object" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_started": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push started." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_updated": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push updated." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_closed": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push closed." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" }, "reason": { "description": "Reason for closing the push.", "type": "object" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_blocked": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push blocked." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_restored": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push restored." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "push_reconfigured": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Push reconfigured." }, "url": { "description": "The push URL.", "type": "string", "format": "url", "x-format-description": "url" }, "options": { "description": "Changed options list.", "type": "array", "items": { "type": "string" } } } }, { "$ref": "#/components/schemas/event_session" }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "chassis_connected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Chassis is connected." }, "node": { "description": "The node name.", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/event_default" } ] }, "chassis_disconnected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Chassis is disconnected." }, "node": { "description": "The node name.", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/event_default" } ] }, "transcoder_device_insufficient_resources": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "description": "No resources to autodistribute", "type": "string" }, "deviceid": { "description": "Transcoder module ID in Flussonic Coder.", "type": "integer" }, "reason": { "description": "One of the two reasons for the event: `manual_resource_allocation` or `auto_resource_allocation`.\nThe first one is a warning, the second one is an error.\n", "type": "string" } } }, { "$ref": "#/components/schemas/event_default" } ] }, "webrtc_play_prober_timeout": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "WebRTC Play Prober timeout" } } }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "webrtc_play_prober_wrong_interval": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "WebRTC Play Prober wrong interval" }, "direction": { "description": "Shows if the problem occurs when sending or receiving the `probe` packets.", "type": "string", "enum": [ "sending", "receiving" ] }, "value": { "description": "The interval value that is wrong.", "type": "integer" } } }, { "$ref": "#/components/schemas/session_generic" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "ad_injected": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Advertisement injected." }, "path": { "type": "string", "description": "The path to the advertising file in a VOD location." }, "placement": { "allOf": [ { "$ref": "#/components/schemas/ad_placement" } ] }, "duration": { "type": "integer", "format": "seconds", "description": "Duration of injected advertising.", "x-format-description": "seconds" }, "midroll_insert_by": { "type": "string", "enum": [ "interval", "splicing" ], "description": "When to perform midrolls.\nIf your stream has SCTE35 or SCTE104 you may opt to use them.\nBy default ads are inserted on regular intervals\n" }, "program_id": { "type": "integer", "description": "SCTE-35 or SCTE-104 markers program_id if set by `midroll_program_id`.", "example": 1 }, "session_id": { "type": "string", "format": "uuid", "description": "Unique identifier (or UUID) of the session.", "example": "61942414-8c15-4809-8bb6-adf1ae846027", "x-format-description": "uuid" }, "dts": { "type": "integer", "format": "utc_ms", "description": "First advertising keyframe's DTS", "example": 1655362349383, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 } } }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_play" } ] }, "multiplexer_pid_on": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Pid is added to the output multiplexed stream" } } }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/event_media" } ] }, "multiplexer_pid_off": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Pid is dropped from the output multiplexed stream" }, "reason": { "description": "Reason for dropping the PID.", "type": "string", "x-atom": true } } }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/event_media" } ] }, "motion_base": { "type": "object", "properties": { "motion_id": { "type": "string", "description": "Uniq motion id.", "example": "b639b21f-3926-4a9f-812e-4eb57e283d59" }, "motion_data": { "type": "string", "description": "Non-structured data received from source.", "example": "#{<<\\\"Message\\\">> => #{<<\\\"Topic\\\">> => <<\\\"tns1:VideoSource/MotionAlarm\\\">>}]" } } }, "motion_started": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Motion started.", "example": "stream_motion_started" } } }, { "$ref": "#/components/schemas/motion_base" }, { "$ref": "#/components/schemas/event_media" } ] }, "motion_stopped": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "Motion stopped.", "example": "stream_motion_stopped" }, "duration": { "type": "integer", "description": "How long has the movement been active.", "example": 15 } } }, { "$ref": "#/components/schemas/motion_base" }, { "$ref": "#/components/schemas/event_media" } ] }, "api_call_event": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "The api call.", "const": "api_call" }, "path": { "description": "The api call path.", "type": "string" }, "qs": { "description": "The api call query string.", "type": "string" } } }, { "$ref": "#/components/schemas/api_call" }, { "$ref": "#/components/schemas/entity_event" } ] }, "dvr_clean": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "The dvr clean occured.", "const": "dvr_clean" }, "episodes_count": { "type": "integer", "minimum": 0, "description": "The total count of all deleted episodes." }, "episodes_duration": { "description": "The total duration of all deleted episodes.", "type": "integer", "minimum": 0 } } }, { "$ref": "#/components/schemas/dvr_config" }, { "$ref": "#/components/schemas/event_default" } ] }, "dvr_drop_write": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "The dvr drop write occured.", "const": "dvr_drop_write" }, "duration": { "type": "integer", "description": "Dropped duration in milliseconds." }, "path": { "type": "string", "description": "Segment disk path which dropped." } } }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "dvr_collapsed_write": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "The dvr collapsed write occured.", "const": "dvr_collapsed_write" }, "duration": { "type": "integer", "description": "Collapsed duration in milliseconds." }, "count": { "type": "integer", "description": "Segments count which collapsed." } } }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" } ] }, "dvr_export_finished": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "DVR export operation finished", "const": "dvr_export_finished" } } }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/dvr_export_job" } ] }, "dvr_consistency_check_finished": { "allOf": [ { "type": "object", "required": [ "event" ], "properties": { "event": { "type": "string", "description": "A DVR consistency check finished", "const": "dvr_consistency_check_finished" } } }, { "$ref": "#/components/schemas/event_media" }, { "$ref": "#/components/schemas/event_default" }, { "$ref": "#/components/schemas/dvr_consistency_errors" } ] }, "auth_backend_url": { "type": "object", "properties": { "url": { "description": "The URL of an HTTP backend. \n", "example": "http://stalker-1.iptv.net/auth.php", "type": "string" } }, "required": [ "url" ] }, "auth_backend_config": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "format": "auth_backend_name", "description": "Globally unique [`auth_backend`](https://flussonic.com/doc/complex-authorization-with-backends/) name.", "x-primary-key": true, "readOnly": true, "x-format-description": "auth_backend_name" }, "allow_tokens": { "description": "Explicit list of tokens that give access to the content without any other checks.\n", "example": [ "test_token1", "test_token2" ], "type": "array", "items": { "type": "string" } }, "deny_tokens": { "description": "Explicit list of tokens that deny access to the content and stop any other checks.\n", "example": [ "test_token3", "test_token4" ], "type": "array", "items": { "type": "string" } }, "allow_ips": { "description": "Explicit list of IP-addresses or subnet masks that have access to the content without any other checks.\n", "example": [ "127.0.0.1", "10.10.0.0/24" ], "type": "array", "items": { "type": "string" } }, "deny_ips": { "description": "Explicit list of IP-addresses or subnet masks that are banned from accessing the content. \n", "example": [ "8.8.8.8", "10.10.0.0/24" ], "type": "array", "items": { "type": "string" } }, "allow_countries": { "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that have access to the content without any other checks.\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated.\nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/" }, "example": [ "RU", "US" ], "type": "array", "items": { "type": "string" } }, "deny_countries": { "description": "Explicit list of countries (two-letter country codes according to ISO 3166-1) that are banned from accessing the content.\nFlussonic uses the MaxMind GeoLite2 Country database to map a country to a block of IP addresses. \nNew releases of GeoIP2 databases come out more often than the releases of Flussonic server, so sometimes the used database can become outdated.\nTherefore we recommend you to install a separate GeoIP2 library and set up Flussonic to use it.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/restrict-viewer-country-with-geoip/" }, "example": [ "RU", "GB" ], "type": "array", "items": { "type": "string" } }, "allow_uas": { "description": "Explicit list of user agents (set-top boxes or browsers) that have access to the content without any other checks. \n", "example": [ "AppleWebKit/533.3 (KHTML, like Gecko)", "VLC/3.0.8 LibVLC/3.0.8" ], "type": "array", "items": { "type": "string" } }, "deny_uas": { "description": "The list of user agents (set-top boxes or browsers) that are banned from accessing the content. \n", "example": [ "Mobile Safari/533.3", "VLC/3.0.8 LibVLC/3.0.8" ], "type": "array", "items": { "type": "string" } }, "backends": { "description": "URL(s) of the HTTP backend(s).", "type": "array", "items": { "$ref": "#/components/schemas/auth_backend_url" } }, "allow_default": { "description": "This option defines the default behavior when all backends are not responding (usually, because of errors in HTTP responses) and the session is not started yet.\nIf this option is enabled, all clients or devices except those listed in `deny` option will have access to the content.\nIf this option is disabled, all clients or devices except those listed in `allow` option will not have access to the content. \n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/complex-authorization-with-backends/#auth-configurator-allowdefault" }, "type": "boolean", "default": false } } }, "server_name_config": { "type": "object", "required": [ "domain" ], "properties": { "domain": { "type": "string", "description": "Domain names to issue ssl certificates for", "example": "streamer.local", "x-primary-key": true, "readOnly": true }, "aliases": { "description": "List of domain aliases, used together with the primary name to issue ssl certs\n", "example": [ "s1.streamer.local", "s2.streamer.local" ], "type": "array", "items": { "type": "string" } } } }, "cache_config": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "format": "cache_name", "description": "Globally unique cache name.", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/scale-vod-playback-with-ssd-cache/" }, "x-primary-key": true, "readOnly": true, "example": "cache1", "x-format-description": "cache_name" }, "path": { "description": "The path where the files from the cloud or HTTP are cached to speed up broadcasting.", "type": "string", "format": "disk_path", "example": "/storage/cache", "x-format-description": "disk_path" }, "misses": { "description": "The number of requests necessary for a file to be cached.", "type": "integer", "example": 3 }, "storage_limit": { "description": "Maximum disk consumption in bytes. \nWhen this limit is reached, the oldest files will be overridden by later files.\n", "type": "integer", "format": "bytes", "example": 400000, "x-format-description": "bytes" }, "expiration": { "description": "A period (in seconds) back from the current moment during which the files are stored.\nAs time goes, the files which are older than this period are being overridden by the later files.\n", "type": "integer", "format": "seconds", "example": 604800, "x-format-description": "seconds" } } }, "http_proxy_config": { "type": "object", "properties": { "prefix": { "type": "string", "format": "media_name", "x-primary-key": true, "description": "HTTP prefix that will be intercepted by this http proxy configuration\n", "x-format-description": "media_name" }, "url": { "type": "string", "format": "url", "description": "Upstream url\n", "x-format-description": "url" }, "mainpage": { "type": "boolean", "default": false, "description": "If this flag is set, then streamer will redirect from \"/\" to this proxy configuration.\n" }, "stats": { "description": "The runtime statistics about http proxy\n", "allOf": [ { "$ref": "#/components/schemas/http_proxy_stats" } ], "readOnly": true } }, "required": [ "prefix", "url" ] }, "http_proxy_stats": { "type": "object", "properties": { "requests": { "description": "Total number of requests this prefix received\n", "type": "integer", "openmetrics_metric": "http_proxy_requests", "x-metric-type": "counter", "example": 1000 }, "protocol_upgrades": { "description": "Total number of requests with protocol upgrade (e.g. websocket)\n", "type": "integer", "openmetrics_metric": "http_proxy_protocol_upgrades", "x-metric-type": "counter", "example": 1000 }, "proxy_error": { "description": "Number of requests with error on proxy itself\n", "type": "integer", "example": 10, "openmetrics_metric": "http_proxy_error", "x-metric-type": "counter" }, "proxy_error_connection": { "description": "Number of requests with connection errors - econnrefused, etc\n", "type": "integer", "example": 10, "openmetrics_metric": "http_proxy_error_connection", "x-metric-type": "counter" }, "http_100": { "description": "Number of requests with HTTP code 1xx (e.g. protocol upgrades)\n", "type": "integer", "example": 1000, "openmetrics_metric": "http_proxy_100", "x-metric-type": "counter" }, "http_200": { "description": "Number of requests with HTTP code 2xx\n", "type": "integer", "example": 1000, "openmetrics_metric": "http_proxy_200", "x-metric-type": "counter" }, "http_300": { "description": "Number of requests with HTTP code 3xx\n", "type": "integer", "example": 10, "openmetrics_metric": "http_proxy_300", "x-metric-type": "counter" }, "http_400": { "description": "Number of requests with HTTP code 4xx\n", "type": "integer", "example": 10, "openmetrics_metric": "http_proxy_400", "x-metric-type": "counter" }, "http_500": { "description": "Number of requests with HTTP code 5xx\n", "type": "integer", "example": 10, "openmetrics_metric": "http_proxy_500", "x-metric-type": "counter" }, "time_100ms": { "type": "integer", "description": "Number of API calls that took less than 100ms", "example": 10, "openmetrics_metric": "http_proxy_time_100ms", "x-metric-type": "counter" }, "time_500ms": { "type": "integer", "description": "Number of API calls that took more than 100ms and less than 500ms", "example": 5, "openmetrics_metric": "http_proxy_time_500ms", "x-metric-type": "counter" }, "time_1000ms": { "type": "integer", "description": "Number of API calls that took more than 500ms and less than 1s", "example": 2, "openmetrics_metric": "http_proxy_time_1000ms", "x-metric-type": "counter" }, "time_5000ms": { "type": "integer", "description": "Number of API calls that took more than 1s and less than 5s", "example": 2, "openmetrics_metric": "http_proxy_time_5000ms", "x-metric-type": "counter" }, "time_longms": { "type": "integer", "description": "Number of API calls that took more than 5s", "example": 1, "openmetrics_metric": "http_proxy_time_longms", "x-metric-type": "counter" } } }, "http_proxies_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "$ref": "#/components/schemas/openmetrics_labels" }, { "type": "object", "properties": { "http_proxies": { "description": "List of http proxies", "type": "array", "items": { "$ref": "#/components/schemas/http_proxy_config" } } } } ] }, "chassis_config": { "type": "object", "properties": { "product_name": { "description": "Coder product name", "allOf": [ { "$ref": "#/components/schemas/chassis_product" } ], "readOnly": true }, "api_port": { "description": "Private port for API requests to the chassis from coders.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "readOnly": true }, "auto_reboot": { "description": "Shows if auto restart of coders when (re)starting chassis is enabled.", "type": "boolean", "default": false, "readOnly": true }, "dhcpd_iface": { "description": "Network interface for automatic reception of IP address from DHCP server. \nThis interface will be used for launching coders.\n", "type": "string", "format": "interface_name", "readOnly": true, "x-format-description": "interface_name" }, "dhcpd_port": { "description": "Source port for DHCP requests.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "readOnly": true }, "dhcpd_port_dest": { "description": "Destination port for DHCP requests.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "readOnly": true }, "lcd": { "description": "Shows if LCD monitor capabilities are enabled in the firmware.", "type": "boolean", "default": false, "readOnly": true }, "ntpd_iface": { "description": "Network interface for NTP daemon.", "type": "string", "format": "interface_name", "readOnly": true, "x-format-description": "interface_name" }, "ntpd_port": { "description": "Port for NTP daemon.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "readOnly": true }, "tftp_port": { "description": "Port for TFTP used for loading program core to the coders.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "readOnly": true }, "tftp_root": { "description": "TFTP root directory.", "type": "string", "format": "disk_path", "readOnly": true, "x-format-description": "disk_path" }, "update_channel": { "description": "Update channel specified in the config file.", "type": "string", "readOnly": true }, "firmware_host": { "description": "URL for downloading firmware.", "type": "string", "format": "url", "readOnly": true, "x-format-description": "url" }, "firmware_version": { "description": "Firmware version installed on the device.", "allOf": [ { "$ref": "#/components/schemas/chassis_version" } ], "readOnly": true }, "firmware_boot_dir": { "description": "Directory to boot the device from. This is also where the firmware is downloaded on updates.", "type": "string", "format": "disk_path", "readOnly": true, "x-format-description": "disk_path" }, "stats": { "description": "Statistics of the chassis connections.", "allOf": [ { "$ref": "#/components/schemas/chassis_stats" } ], "readOnly": true }, "restart_coder_timeout": { "description": "Timeout for restarting coders.", "type": "integer", "readOnly": true }, "hostname": { "description": "The name of the chassis server.", "type": "string", "format": "server_name", "example": "coder1.example.com", "x-format-description": "server_name" }, "default_gateway_interface": { "description": "If `default_gateway` parameters are set the individual interfaces config, \nthis gateway is only used for checking license and updates. \nOtherwise, it is used as gateway for all traffic.\n", "type": "string", "example": "streaming" }, "ntp_servers": { "description": "List of NTP server host names or IP addresses", "type": "array", "items": { "type": "string" } } } }, "chassis_stats": { "type": "object", "properties": { "model": { "description": "The chassis model name.", "type": "string", "example": "chassis_model" }, "version": { "description": "Full version number of the firmware. Deprecated. Version could be found at `chassis_config/firmware_version`", "deprecated": true, "x-delete-at": "24.10", "allOf": [ { "$ref": "#/components/schemas/chassis_version" } ], "example": "21.09.1-234" }, "next_version": { "deprecated": true, "x-delete-at": "24.10", "description": "The latest available version of the firmware, if any. Deprecated. Last available version could be obtained from `chassis_firmwares_list`", "allOf": [ { "$ref": "#/components/schemas/chassis_version" } ] }, "serial_number": { "description": "The serial number of the chassis.", "type": "string", "example": "2174220024" }, "hardware_id": { "description": "MAC address of the manage0 interface.", "type": "string" }, "hostname": { "type": "string", "description": "Hostname of the server.", "example": "coder1.example.com" }, "ntp_clock_synchronized": { "type": "boolean", "description": "Whether a system clock synchronized with NTP server" }, "system_time": { "type": "number", "format": "utc_ms", "description": "Chassis system time (in UTC milliseconds)", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 } } }, "chassis_product": { "type": "string", "oneOf": [ { "title": "Coder", "const": "coder_transcoder", "description": "Basic coder with transcoding support" }, { "title": "Vision Coder", "const": "coder_vision", "description": "Coder with video analytic support" }, { "title": "DVB Coder", "const": "coder_dvb", "description": "Basic coder with transcoding support and DVB output" } ] }, "chassis_version": { "type": "string" }, "server_meta": { "type": "string" }, "config_version": { "type": "array", "items": { "type": "integer" } }, "previous_server_state": { "type": "string", "enum": [ "shutdown", "killed", "unknown", "none", "error_reading", "unconfigured" ], "description": "The previous state of the server." }, "config_path_segment": { "anyOf": [ { "type": "string" }, { "type": "string", "x-atom": true }, { "type": "integer" } ] }, "config_error_status": { "type": "object", "properties": { "error": { "description": "Short error description.", "type": "string", "x-atom": true, "example": "bad_url" }, "config": { "description": "Partial configuration that can be recovered if an error occurs.", "type": "object" }, "line": { "description": "Line number pointing to where an error was detected.", "type": "integer", "example": 15 }, "first_error_line": { "description": "If an error takes up to several lines, it is the first line where the error was detected.", "type": "integer", "example": 14 }, "col": { "description": "The column number pointing to where the error was detected.", "type": "integer", "example": 20 }, "first_error_col": { "description": "Last column with something valid.", "type": "integer", "example": 5 }, "path": { "description": "Config path to the erroneous element.", "type": "array", "items": { "$ref": "#/components/schemas/config_path_segment" }, "example": [ "streams", 0, "inputs", 0, "url", "input_url" ] }, "detail": { "description": "Some other details that may help to identify the error.", "anyOf": [ { "type": "string" }, { "type": "number" }, { "type": "object", "additionalProperties": { "type": "string" } }, { "type": "array", "items": { "$ref": "#/components/schemas/config_path_segment" } } ] } } }, "license_type": { "type": "string", "enum": [ "undefined", "online", "usb", "network", "offline" ] }, "partition_stats": { "type": "object", "properties": { "path": { "description": "Mount path.", "type": "string", "format": "disk_path", "example": "_var_lib_docker_overlay2_3684778579db0a4d418fdc1a8a6953b680ab92d179a7d6f9506710d073095e36_merged", "openmetrics_label": "path", "x-format-description": "disk_path" }, "device": { "description": "The block device or file related to a mount path.", "type": "string", "format": "disk_device", "example": "sda1", "openmetrics_label": "device", "x-format-description": "disk_device" }, "total_mb": { "description": "Total number of megabytes shown by the OS for this partition.", "type": "integer", "format": "megabytes", "openmetrics_metric": "partition_total_mb", "x-metric-type": "gauge", "example": 45423, "x-format-description": "megabytes" }, "usage": { "description": "Percentage of usage of this partition.", "type": "integer", "format": "percent", "openmetrics_metric": "partition_usage", "x-metric-type": "gauge", "example": 30, "x-format-description": "percent" }, "io_util": { "description": "Percentage of IO utilization for device related to a mount path.", "type": "integer", "format": "percent", "example": 42, "openmetrics_metric": "device_io_util", "x-metric-type": "gauge", "x-format-description": "percent" } } }, "server_stats": { "allOf": [ { "$ref": "#/components/schemas/server_stats_whoami" }, { "$ref": "#/components/schemas/server_stats_streamer" }, { "$ref": "#/components/schemas/server_stats_network" }, { "$ref": "#/components/schemas/server_stats_events" } ] }, "server_stats_whoami": { "type": "object", "properties": { "server_version": { "description": "Package version of the server. Might be simple a number of release like 21.11 or longer if you have a rolling release installed.", "type": "string", "format": "server_version", "openmetrics_label": "version", "example": "23.04", "x-format-description": "server_version" }, "build": { "type": "integer", "description": "Build version\n", "openmetrics_label": "build" }, "now": { "type": "number", "format": "utc_ms", "description": "Current response time\n", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "started_at": { "description": "Boot time of this instance.", "type": "integer", "format": "utc", "openmetrics_metric": "server_started_at", "x-metric-type": "gauge", "example": 1639337825, "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 } } }, "server_stats_streamer": { "type": "object", "properties": { "config_version": { "description": "Current runtime version of config. We do not declare exact structure, but we promise\nthat it will be always comparable and increasing (if server has proper NTP configuration, of course).\nRight now it is a tuple of server start time and incrementing version of config.\n", "allOf": [ { "$ref": "#/components/schemas/config_version" } ], "example": [ 1636709231, 4 ] }, "next_version": { "description": "Notification about a newer version in the repository.", "type": "string", "format": "server_version", "example": "22.01", "x-format-description": "server_version" }, "streamer_status": { "description": "*Flussonic* will always try to start even if there are severe errors that do not\nallow functioning.\n\n`starting` status means you should wait for some time (not more than\na minute).\n\n`running` status means all configuration was loaded. However, the status does not provide\nan information about your streams and the quality of provided service.\n\nAll other statuses mean there are some severe problems on the server\nthat cannot be repaired by Flussonic itself.\n", "allOf": [ { "$ref": "#/components/schemas/server_stats_streamer_status" } ], "x-api-allow": [ "central-layouter" ] }, "config_external_status": { "description": "Information about current external config status", "allOf": [ { "$ref": "#/components/schemas/config_external_error_status" } ], "x-api-allow": [ "central-layouter" ] }, "hostname": { "description": "Hostname of your server. Please, use FQDN, do not leave your Linux misconfigured.", "type": "string", "example": "openapi.flussonic.com" }, "license_txt": { "description": "The code of the license applied on the server.", "type": "string", "example": "uO8v12HJhNXVj5gM" }, "license_type": { "description": "The license type.", "allOf": [ { "$ref": "#/components/schemas/license_type" } ] }, "id": { "description": "Unique runtime ID of this instance. Updated with the restart.", "type": "string", "format": "uuid", "example": "61893b15-75b2-4fcb-b4cf-ae1dd0858ea2", "x-format-description": "uuid" }, "vsaas": { "description": "Shows if Flussonic Watcher is enabled in the license.", "type": "boolean" }, "vsaas_branding": { "description": "Shows if Watcher branding is enabled in the license.", "type": "boolean" }, "vsaas_running": { "description": "Shows if Watcher is currently running.", "type": "boolean" }, "rproxy": { "description": "Shows if rproxy is configured.", "type": "boolean" }, "rproxy_running": { "description": "Shows if rproxy is running.", "type": "boolean" }, "transcoder": { "description": "Shows if the server's CPU can be used for transcoding \n(i.e. if the `flussonic-transcoder` package is installed on the server). \n", "type": "boolean", "x-api-allow": [ "central-layouter" ] }, "bandwidth_usage": { "description": "Outbound bandwidth usage (load balancing in `usage` mode is based on this value).", "type": "integer", "format": "percent", "example": 67, "x-format-description": "percent" }, "total_bandwidth": { "description": "Total server bandwidth.", "type": "integer", "format": "speed", "deprecated": true, "x-notice": "duplicate of config total_bandwidth", "x-deleted-at": 22.03, "x-format-description": "speed" }, "cpu_usage": { "description": "CPU usage on the server.", "type": "integer", "format": "percent", "openmetrics_metric": "server_cpu_usage", "x-metric-type": "gauge", "example": 48, "x-format-description": "percent" }, "memory_usage": { "description": "Memory usage on the server.", "type": "integer", "format": "percent", "openmetrics_metric": "server_memory_usage", "x-metric-type": "gauge", "example": 27, "x-format-description": "percent" }, "scheduler_load": { "description": "Erlang scheduler load.", "type": "integer", "format": "percent", "openmetrics_metric": "server_scheduler_load", "x-metric-type": "gauge", "example": 40, "x-format-description": "percent" }, "uptime": { "description": "The server uptime.", "type": "integer", "format": "seconds", "example": 4325502, "x-format-description": "seconds" }, "partitions": { "description": "The list of disk partitions on the server.", "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/partition_stats" } ] }, "x-api-allow": [ "central-layouter" ] }, "transcoder_devices": { "description": "Statistics on the devices used for transcoding.", "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/transcoder_device_stats" } ] }, "x-api-allow": [ "central-layouter" ] }, "text_alerts": { "description": "Human-readable format of errors and alerts that need to be fixed. \nProvided by some *Flussonic* subsystems.\n", "additionalProperties": { "type": "string" }, "type": "object" }, "config_error": { "description": "Information about errors in the config file.", "allOf": [ { "$ref": "#/components/schemas/config_error_status" } ] }, "is_chassis": { "description": "The flag shows if Flussonic runs on Flussonic Coder.\n", "type": "boolean" } } }, "server_stats_network": { "type": "object", "properties": { "total_clients": { "description": "The number of clients receiving the streams from the server at the moment of request.", "type": "integer", "openmetrics_metric": "server_total_clients", "x-metric-type": "gauge", "example": 2040 }, "total_streams": { "description": "The number of streams created on the server.", "type": "integer", "example": 45, "x-api-allow": [ "central-layouter" ] }, "online_streams": { "description": "The number of streams that are ready to be served to the clients.", "type": "integer", "openmetrics_metric": "server_online_streams", "x-metric-type": "gauge", "example": 27, "x-api-allow": [ "central-layouter" ] }, "opened_files": { "description": "The number of opened files.", "type": "integer", "openmetrics_metric": "server_opened_files", "x-metric-type": "gauge", "example": 5 }, "input_kbit": { "description": "Current incoming speed (bitrate) of the data transmission over the network.", "type": "integer", "format": "speed", "openmetrics_metric": "server_input_bitrate", "x-metric-type": "gauge", "example": 400300, "x-format-description": "speed" }, "output_kbit": { "description": "Current outgoing speed (bitrate) of the data transmission over the network.", "type": "integer", "format": "speed", "openmetrics_metric": "server_output_bitrate", "x-metric-type": "gauge", "example": 500400, "x-format-description": "speed" } } }, "server_stats_events": { "type": "object", "properties": { "events": { "type": "object", "description": "Events statistics", "properties": { "resent_events": { "description": "Number of events, which have been retransmitted due to network issues.\nThe counter relates with events sinks `resend_timeout` parameter.\n", "type": "integer", "example": 100 }, "dropped_events": { "description": "Number of events, which have been dropped due to buffer limitation\nconfigured by events sinks `resend_limit` parameter.\n", "type": "integer", "example": 100 } } } } }, "server_stats_streamer_status": { "type": "string", "oneOf": [ { "title": "Config is missing", "const": "no_config", "description": "The configuration file is not found at `/etc/flussonic/flussonic.conf`." }, { "title": "Config is broken", "const": "broken_config", "description": "There are some errors in the config file saved at `/etc/flussonic/flussonic.conf`.\nTry checking logs and `text_alerts` for details.\n" }, { "title": "Could not obtain valid external config from Central.", "const": "config_external_error", "description": "There are some errors during external config receiving or validating.\nTry checking logs and `config_external_error` for details.\n" }, { "title": "License is failing", "const": "license_failure", "description": "The license cannot be activated. Please contact the support team." }, { "title": "License is missing", "const": "no_license", "description": "The license file is not found at `/etc/flussonic/license.txt`." }, { "title": "Starting", "const": "starting", "description": "The server is starting." }, { "title": "Running", "const": "running", "description": "Normal operation mode." } ], "example": "running" }, "config_external_error_status": { "type": "object", "properties": { "status": { "description": "External config status", "type": "string", "oneOf": [ { "const": "loaded", "description": "External config is successfully loaded, parsed and applied." }, { "const": "error", "description": "Valid external config could not be obtained because of error" } ] }, "reason": { "$ref": "#/components/schemas/request_error_reason" }, "while": { "description": "Conditions of the error occurrence.", "type": "string", "oneOf": [ { "const": "refresh", "description": "Configuration server returned an error while performing a background batch refresh." }, { "const": "request", "description": "Configuration server returned an error while requesting a stream configuration for the first time." }, { "const": "srt_port_resolve", "description": "Configuration server returned an error while resolving srt port." } ] }, "code": { "type": "integer", "description": "HTTP response code" }, "error": { "type": "string", "description": "Error description (optional)", "example": "invalid_authorization" }, "path": { "description": "Config path to the erroneous element.", "type": "array", "items": { "$ref": "#/components/schemas/config_path_segment" }, "example": [ "streams", 0, "inputs", 0, "url", "input_url" ] }, "detail": { "type": "string", "description": "Detailed error description (optional)" } } }, "request_error_reason": { "description": "Reason of the error.", "type": "string", "oneOf": [ { "const": "validation_error", "description": "New configuration does not match reference." }, { "const": "network_error", "description": "Streamer could not get reply from the configuration server." }, { "const": "malformed_json", "description": "Configuration server returned an malformed json body." }, { "const": "invalid_request", "description": "Configuration server received an invalid request, e.g. required headers is missing or invalid authorization." }, { "const": "unknown", "description": "Configuration server returned an error for an unknown reason." } ] }, "admin_credentials": { "type": "object", "properties": { "login": { "type": "string", "description": "Login", "example": "secretlogin" }, "password": { "type": "string", "description": "Password", "example": "passw", "format": "password", "x-format-description": "password" }, "hash": { "type": "boolean", "description": "Server will pass your password through a hashing algorithm.", "example": true } }, "required": [ "login", "password" ] }, "server_config": { "allOf": [ { "$ref": "#/components/schemas/server_config_base" }, { "$ref": "#/components/schemas/server_config_full" }, { "$ref": "#/components/schemas/server_config_external" }, { "$ref": "#/components/schemas/server_config_stats" }, { "$ref": "#/components/schemas/openmetrics_labels" }, { "$ref": "#/components/schemas/opentelemetry" } ], "description": "Global server configuration and current runtime status" }, "server_config_base": { "type": "object", "properties": { "listeners": { "allOf": [ { "$ref": "#/components/schemas/listeners" } ], "description": "The configuration of network listeners." }, "srt": { "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ], "description": "Global SRT listening port. It is possible to use a single port for playback and publishing, but it is not compatible with clients.\nConsider configuring separate ports for playback and publishing for each stream." }, "srt_play": { "allOf": [ { "$ref": "#/components/schemas/srt_config" } ], "description": "SRT play configuration with single-port mode. Not supported by many clients, better use per-stream mode." }, "srt2_play": { "allOf": [ { "$ref": "#/components/schemas/srt_config" } ], "description": "SRT2 play configuration with single-port mode. Not supported by many clients, better use per-stream mode." }, "srt_publish": { "allOf": [ { "$ref": "#/components/schemas/srt_config" } ], "description": "SRT publish configuration with single-port mode. Not supported by many clients, better use per-stream mode." }, "srt2_publish": { "allOf": [ { "$ref": "#/components/schemas/srt_config" } ], "description": "SRT2 publish configuration with single-port mode. Not supported by many clients, better use per-stream mode." }, "geoip": { "type": "string", "format": "disk_path", "description": "Use your own GeoIP database.", "example": "/usr/share/GeoIP/GeoLite2-City.mmdb", "x-format-description": "disk_path" }, "meta": { "description": "Some additional options of the server.", "allOf": [ { "$ref": "#/components/schemas/server_meta" } ], "example": "{\"role\": \"transcoder\"}" }, "loglevel": { "allOf": [ { "$ref": "#/components/schemas/loglevel" } ], "description": "Raise loglevel to debug if needed.", "example": "error" }, "nvidia_monitor": { "description": "Enables saving statistics on Nvidia performance.", "type": "boolean", "example": true }, "total_bandwidth": { "description": "Total server bandwidth.", "type": "integer", "format": "speed", "example": 1000000000, "x-format-description": "speed" }, "log_requests": { "description": "Enables logging of requests for streams (manifests, segments) and API request.", "type": "boolean" }, "pulsedb": { "description": "Directory to store Pulse statistics.", "type": "string", "format": "disk_path", "example": "/var/run/flussonic/pulsedb", "x-format-description": "disk_path" }, "session_log": { "description": "Directory to store the session log.", "type": "string", "format": "disk_path", "example": "/var/run/flussonic/session_log", "x-format-description": "disk_path" }, "cluster_key": { "description": "The cluster key to unite several servers with the same key into a cluster.", "type": "string", "example": "xS6i6Q3DCc5nEvnu" }, "url_prefix": { "description": "This option applies to HLS and DASH protocols, for all streams on the server. \nThe addresses of individual segments within a segment-based playlist will start with the specified prefix.\nThis setting is available in the global part of the config file as well as locally for any individual stream. \nWhen specified at the stream level, it is only valid for this particular stream.\n", "allOf": [ { "$ref": "#/components/schemas/url_prefix" } ] }, "view_auth": { "allOf": [ { "$ref": "#/components/schemas/admin_credentials" } ], "description": "Credentials for access to readonly API functions like getting streams info, status, and statistics.\n" }, "edit_auth": { "allOf": [ { "$ref": "#/components/schemas/admin_credentials" } ], "description": "Credentials for administrator access to the server." }, "api_allowed_from": { "description": "The list of allowed subnets to accept API requests from.", "type": "array", "items": { "type": "string", "format": "cidr", "x-format-description": "cidr" } }, "server_names": { "type": "array", "description": "The configuration of server domain name and aliases", "items": { "allOf": [ { "$ref": "#/components/schemas/server_name_config" } ] } }, "auth_token": { "allOf": [ { "$ref": "#/components/schemas/auth_token" } ], "description": "Configure key name of query string key-value pair for token authentication\n" } } }, "server_config_full": { "type": "object", "properties": { "chassis": { "allOf": [ { "$ref": "#/components/schemas/chassis_config" } ], "description": "The configuration of the chassis." }, "event_sinks": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/event_sink_config" } ] }, "description": "The configuration of event notifications" }, "auth_backends": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/auth_backend_config" } ] }, "description": "The configuration of auth backends" }, "vods": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/vod_config" } ] }, "description": "The configuration of VODs" }, "dvrs": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/dvr_config" } ] }, "description": "The configuration of the DVRs" }, "peers": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/peer_config" } ] }, "description": "The configuration of peers in the cluster." }, "sources": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/source_config" } ] }, "description": "The configuration of the video sources." }, "transponders": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/transponder_config" } ] }, "description": "The configuration of the transponders." }, "templates": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/template_config" } ] }, "description": "The configuration of the templates." }, "streams": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/stream_config" } ] }, "default": [], "description": "The configuration of the streams." }, "caches": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/cache_config" } ] }, "description": "The configuration of the cache." }, "dvb_cards": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/dvb_card_config" } ] }, "description": "The configuration of the DVB cards." }, "balancers": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/balancer_config" } ] }, "description": "The configuration of the balancers." }, "camera_alarm": { "allOf": [ { "$ref": "#/components/schemas/camera_alarm_config" } ], "description": "The configuration of the camera alarms." }, "rproxy": { "allOf": [ { "$ref": "#/components/schemas/rproxy_config" } ], "description": "The configuration of the port forwarding." }, "vsaas": { "allOf": [ { "$ref": "#/components/schemas/vsaas_config" } ], "description": "The configuration of the video surveillance subsystem." }, "file_processor": { "allOf": [ { "$ref": "#/components/schemas/file_processor_config" } ], "description": "The configuration of the file processor." }, "iptv": { "allOf": [ { "$ref": "#/components/schemas/iptv_config" } ], "description": "The configuration of the IPTV" }, "decklinks": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/decklink_config" } ] }, "description": "Configuration of decklink SDI capture cards\n" }, "http_proxies": { "type": "array", "items": { "allOf": [ { "$ref": "#/components/schemas/http_proxy_config" } ] }, "description": "List of HTTP prefixes that can be handled via call to remote http server\n" } } }, "server_config_stats": { "type": "object", "properties": { "stats": { "allOf": [ { "$ref": "#/components/schemas/server_stats" } ], "description": "Server runtime stats." } } }, "server_config_external": { "type": "object", "properties": { "config_external": { "type": "string", "format": "url", "description": "Specify stream config backend.", "example": "http://central.example.com/streamer/api/v3/streamers", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/centralized-cluster-configuration-with-config-external/" }, "x-format-description": "url" } } }, "api_tokens_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "api_tokens": { "description": "List of available api tokens", "items": { "$ref": "#/components/schemas/api_token" }, "type": "array" } } } ] }, "api_token": { "type": "object", "description": "This object describes one API token with its unique text, permissions, etc.\n", "properties": { "key": { "type": "string", "description": "unique secret string, it's interpreted according to optional `key_format` field", "examples": { "default": { "value": "IJCo3KGLBf6NAqMCGgHf5gNhpl9" }, "plaintext": { "value": "1234" }, "crypt": { "value": "$5$tz/6I0KpagoQ9kQN$nnnKQCxuhCOCaZ7q9WEWvHo6.dRb2hawYofHPdAhHV." } }, "readOnly": true }, "name": { "type": "string", "description": "unique name of the token that can be used to distinguish tokens\n", "examples": { "default": { "value": "root" }, "inference_server": { "value": "inference_server" } } }, "auth_scopes": { "type": "array", "description": "Interected list of scopes that will limit this api token.\nIt cannot have more permissions than this array allows\n", "items": { "type": "string" }, "examples": { "default": { "value": [ "user/15" ] } } }, "permissions": { "type": "array", "description": "list of independent permissions, available for this token", "items": { "allOf": [ { "$ref": "#/components/schemas/api_token_permission" } ] } } }, "required": [ "key", "name" ] }, "api_token_permission": { "type": "object", "required": [ "scopes" ], "properties": { "read": { "type": "boolean", "description": "reading one item is allowed" }, "write": { "type": "boolean", "description": "writing/updating/deletion one item is allowed" }, "list": { "type": "boolean", "description": "listing items is allowed" }, "execute": { "type": "boolean", "description": "executing this function (if it is a function) is allowed" }, "scopes": { "type": "array", "description": "List of permission scopes that will be intersected\nEach scope is a name of the collection or a function with nested resource name\nthat is covered with this permission\n", "items": { "type": "string" }, "examples": { "default": { "value": [ "streams/*" ] }, "fine_grained": { "value": [ "streams/location1%2F*" ] }, "superadmin": { "value": [ "*" ] } } } } }, "forward_ports_config": { "type": "object", "properties": { "handler": { "description": "The handler name.", "type": "string", "x-atom": true }, "options": { "description": "The handler options.", "type": "object" } } }, "rproxy_config": { "type": "object", "required": [ "streampoint_key" ], "properties": { "streampoint_key": { "description": "The streamer ID key.", "type": "string", "minLength": 1, "maxLength": 256 }, "forward_ports": { "description": "Configuration of port handlers.", "type": "object", "additionalProperties": { "$ref": "#/components/schemas/forward_ports_config" }, "x-key-type": "network_port" }, "endpoint_auth": { "description": "Path to authorization backend on the endpoint to check if the Agents are allowed to connect.", "type": "string" } } }, "vsaas_config": { "type": "object", "properties": { "watcher_url": { "type": "string", "description": "All requests to /vsaas and /watcher will be proxied to this url.\nWatcher will not be launched by flussonic with this option.\n" }, "central_url": { "type": "string", "description": "All requests to /central will be proxied to this url.\n" } } }, "camera_alarm_config": { "type": "object", "properties": { "listen": { "description": "The `smtp://` link to get camera alarms from.", "allOf": [ { "$ref": "#/components/schemas/listen_spec" } ] }, "catch": { "description": "The list of keywords in the e-mails that are considered alarms.", "type": "array", "items": { "type": "string" } } } }, "vision_config": { "type": "object", "properties": { "jpeg_vector_helper": { "description": "Enables JPEG generation for recognized objects. By default, vision process will generate only text events.", "type": "string" }, "hw": { "description": "Hardware device type to be used for a vision process.", "type": "string" } } }, "iptv_config": { "type": "object", "properties": { "database": { "description": "DB connection string.", "type": "string" } } }, "subscribers_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "subscribers": { "items": { "$ref": "#/components/schemas/subscriber_config" }, "type": "array", "description": "List of fetched subscribers according to query parameters." } } } ] }, "subscriber_config": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "description": "Unique identifier of the subscriber.\n", "example": "client01", "readOnly": true }, "token": { "type": "string", "description": "Simple static unique token that will be automatically created for the\nsubscriber if not provided.\n\nThis token can be used in play URLs.\n\nShould be URL-friendly.\n", "example": "ybBb5CFLqSFYc2" }, "max_sessions": { "type": "integer", "description": "Limit of simulateously played sessions for this subscriber.\n", "example": 3 }, "packages": { "type": "array", "items": { "type": "string", "format": "package_name", "x-format-description": "package_name" }, "default": [], "description": "List of available packages of channels for this subscriber.\n\nChannels (streams) are not added directly, only via packages.\n" } } }, "packages_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "packages": { "items": { "$ref": "#/components/schemas/package_config" }, "type": "array", "description": "List of fetched packages according to query parameters." } } } ] }, "package_config": { "type": "object", "properties": { "name": { "description": "The package name.", "type": "string", "readOnly": true }, "channels": { "description": "The list of channels in the package.", "type": "array", "items": { "type": "string" }, "default": [] } }, "required": [ "name" ] }, "central_disk_predictions": { "type": "object", "description": "Predictions for disk usage.\n", "properties": { "estimated_disk_usage": { "type": "integer", "format": "percent", "description": "Estimated disk usage in percent.\nThis value is estimated on the based on streamer disk space and current configurations of streams processed by the streamer,\nwhich specify the rate of data writing to disk by them and the duration of their data storage.\n\nNote: This value represents what percentage of the disk will be filled when all streams on the streamer reach the point where the disk is static. \nIt can be greater than 100% if streamer can't store estimated amount of data.\n", "x-format-description": "percent" } } }, "entity_event": { "allOf": [ { "$ref": "#/components/schemas/event_default" }, { "type": "object", "properties": {} } ] }, "watcher_agents_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "agents": { "items": { "$ref": "#/components/schemas/watcher_agent_config" }, "type": "array", "description": "The list of Agents fetched according to the query parameters." } } } ] }, "watcher_agent_config": { "allOf": [ { "$ref": "#/components/schemas/agent_config_base" }, { "type": "object", "properties": {} } ] }, "watcher_agent_stats": { "type": "object", "properties": { "agent_type": { "type": "string", "enum": [ "single", "router" ], "default": "single", "description": "The type of Agent installed on the device: \n\n* `single` means \"one Agent = one camera\", i.e. Agent is installed on a camera itself.\n* `router` means \"one Agent = multiple cameras\", i.e. Agent is installed on a router\nto provision the cameras from LAN to Watcher.\n" }, "connections_requested": { "type": "integer", "default": 0, "description": "The number of connections requested by Agent." }, "connections_established": { "type": "integer", "default": 0, "description": "The number of successfully established connections." }, "peer_ip": { "type": "string", "format": "ipv4", "description": "Public IP address of the device (camera or router) on which the Agent is running.", "example": "185.134.232.183", "x-format-description": "ipv4" }, "local_ip": { "type": "string", "format": "ipv4", "description": "IP address of the device (camera or router) in the local network.", "example": "10.10.17.88", "x-format-description": "ipv4" }, "mac_address": { "type": "string", "example": "F0-23-B9-59-20-F1", "description": "MAC-address of the device." }, "version": { "type": "string", "description": "Agent version.", "example": "v21.02-8-g535c85d" }, "endpoint_connection": { "description": "Parameters of the connection between Agent and its endpoint.", "allOf": [ { "$ref": "#/components/schemas/watcher_agent_control_connection" } ] }, "streampoint_connection": { "description": "Parameters of the connection between Agent and its streampoint.", "allOf": [ { "$ref": "#/components/schemas/watcher_agent_control_connection" }, { "$ref": "#/components/schemas/watcher_agent_data_connections" } ] } } }, "watcher_agent_control_connection": { "type": "object", "properties": { "opened_at": { "type": "number", "format": "utc_ms", "description": "Timestamp of the current Agent control connection opening.", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "hostname": { "type": "string", "description": "Hostname of the server", "example": "agents-001.vsaas.io" }, "alive": { "type": "boolean", "description": "A flag showing if Agent is connected at the moment of the request." }, "status_changed_at": { "description": "UTC timestamp of the last Agent status change to offline or online.\nSame as `opened_at` if Agent is now connected.\n", "type": "integer", "format": "utc", "example": 1634560921, "x-format-description": "Unix timestamp in seconds", "minimum": 1000000000, "maximum": 10000000000 }, "bytes_from_server": { "type": "integer", "format": "bytes", "description": "A number of bytes received from the server by Agent since `opened_at`.", "example": 40000, "x-format-description": "bytes" }, "bytes_to_server": { "type": "integer", "format": "bytes", "description": "A number of bytes sent to the server by Agent since `opened_at`.", "example": 400000000000, "x-format-description": "bytes" } } }, "watcher_agent_data_connections": { "type": "object", "properties": { "connections_attempted": { "type": "integer", "description": "A number of times the streamer tried to open a data connection via this Agent.", "example": 400 }, "connections_opened": { "type": "integer", "description": "A number of successfully opened data connections via this Agent.", "example": 300 }, "connections_current": { "type": "integer", "description": "A number of currently active data connections opened via this Agent.", "example": 2 } } }, "episode": { "discriminator": { "propertyName": "episode_type", "mapping": { "generic": "#/components/schemas/episode_generic", "face": "#/components/schemas/vision_episode_face", "vehicle": "#/components/schemas/vision_episode_vehicle", "context_search": "#/components/schemas/vision_episode_context_search", "qr_code": "#/components/schemas/vision_episode_qr_code", "custom": "#/components/schemas/episode_custom" } }, "oneOf": [ { "$ref": "#/components/schemas/episode_generic" }, { "$ref": "#/components/schemas/vision_episode_face" }, { "$ref": "#/components/schemas/vision_episode_vehicle" }, { "$ref": "#/components/schemas/vision_episode_context_search" }, { "$ref": "#/components/schemas/vision_episode_qr_code" }, { "$ref": "#/components/schemas/episode_custom" } ] }, "episode_base": { "type": "object", "description": "# Definition\n\nEpisode is a record about continious part of one video stream.\n\nIt is used in video analytics, television systems, etc. for describing one continious and logically\nconsolidated part of video stream.\n\nFor example, episode can describe one TV show or a part of video when the car with specific license plate\npassed the camera view.\n\nDifferent systems in our ecosystem can emit and consume episodes of different `episode_type`.\n\n# Alternatives\n\nWhat episodes are not:\n\n * they cannot combine multiple streams. If you have multicamera view on the scene, you will have to create many episodes and join then in another system\n * they cannot be multipart. Only one continious uninterrupted episode. However, it is ok for them to overlap.\n\n# Updates\n\nEpisodes are supposed to be streamable and updatable. \n\nIf you consume episodes, you must be ready to see old `episode_id`\nwith new updated data. You MUST overwrite previous data.\n\nIf you emit episodes and you change any fields, you MUST accumulate previous data of episode and send full copy of\nupdated episode.\n\n# Borders\n\nEpisode have two mandatory fields: `opened_at` and `updated_at`, they are default borders of the episode:\nbeginning and the end.\n\nSometimes you need to look at another fields: `started_at` and `closed_at`.\n\n`started_at` appears when episode emitter decides that beginning of the episode should be different from `opened_at`,\nfor example if video analytics has analysed previous frames and decided that this object appeared earlier.\n\n`closed_at` can appear if episode source have decided that episode will not continue anymore, for example\ncar have run out of camera view. However, `updated_at` can be still changed, if any other system will add \nmore data there, for example detected licence plates of some other auxiliary information.\n", "required": [ "episode_id", "media", "opened_at", "updated_at" ], "properties": { "episode_id": { "type": "integer", "format": "snowflake_id", "description": "Unique identifier of the episode. Must be created by the system that first creates this episode.\n\nPlease, mention that it is assumed to be 64 bit length including time of creation in it (refer to snowflake),\nso you cannot handle it in javascript with simple `JSON.parse()`, you need to use parsed that will properly\nhandle very long integers.\n", "examples": { "default": { "value": 1722279170848854000 } }, "x-format-description": "snowflake_id" }, "media": { "type": "string", "format": "media_name", "description": "Stream name on which this episode exists.\n", "x-format-description": "media_name" }, "close_reason": { "description": "The reason for closing the episode.\n", "allOf": [ { "$ref": "#/components/schemas/episode_close_reason" } ] }, "opened_at": { "type": "integer", "format": "utc_ms", "description": "The time when this episode was created. Naming is standard for whole flussonic ecosystem.\nUsually this time will be the same as `started_at`, but can differ, refer to the description of that field.\n\nThe value of this field is copied into `episode_id`, so sorting by `episode_id` will give you the same\nsort as by `opened_at`\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "started_at": { "type": "integer", "format": "utc_ms", "description": "This field can be used as indication of the fact that some system have checked and ensured that\nthis episode has really started at some time, that may differ from `opened_at`.\n\nFor example video analytics will use this field for the time when this episode was confirmed as confident.\n\nMay be not relevant for television systems.\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "updated_at": { "type": "integer", "format": "utc_ms", "description": "The time of last change of the episode.\n\nSystem that processes episodes and can send them to other systems, MUST update this field\non any changes in this episode.\n\nThis field MUST be updated strictly monotonical and increasing. The updater MUST guarantee that\nthis `updated_at` can be used as a sort key for fetching fresh updates.\n\nConsumer of the episodes can use `updated_at` in the following scenario:\n\n * fetch all exisiting episodes from the source\n * take biggest `updated_at` from this dataset, it will be T\n * ask source for all episodes with `updated_at > T`\n\nThis algorithm can be used for fetching update stream from the source.\n", "examples": { "default": { "value": 1637098611000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "closed_at": { "type": "integer", "format": "utc_ms", "description": "Episode emitter can decide that episode considered closed and will not grow further.\n`closed_at` MUST NOT change, it must be emitted only once.\n\nEpisode can live without `closed_at`, in this case you should use `updated_at` as the last time\nof the episode.\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "preview_timestamp": { "type": "integer", "format": "utc_ms", "description": "The time when the preview of this episode is available.\nUse it to request preview image via Mediaserver's DVR API (`jpeg_preview_dvr`).\n\nVisit the [Getting JPEGs from DVR by specific time](https://flussonic.com/doc/thumbnails/#thumbnails-dvr-time) article\nand [JPEG thumbnail from DVR](https://flussonic.com/doc/api/streaming/#tag/image/operation/jpeg_preview_dvr) section of the Mediaserver's API Reference\nfor details.\n\nThis field may not be present. If so, you may use the timestamp from the `started_at` field to request the preview image\n", "examples": { "default": { "value": 1637094994000 } }, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "preview": { "type": "string", "contentEncoding": "base64", "format": "base64", "description": "Small inline image for previewing in UI\n", "x-format-description": "base64" }, "episode_appearance_timestamps": { "description": "The time when the episode appeared in the service relative to the server time.\n", "allOf": [ { "$ref": "#/components/schemas/episode_appearance_timestamps" } ] } } }, "episodes_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "episodes": { "description": "The list of Episodes fetched according to the query parameters.", "type": "array", "items": { "$ref": "#/components/schemas/episode" } } } } ] }, "episode_close_reason": { "type": "string", "oneOf": [ { "title": "Timeout", "description": "Episode was closed because of no activity was detected in it.", "const": "timeout" } ] }, "episode_generic": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "properties": { "episode_type": { "type": "string", "description": "Generic stream episode", "const": "generic" } } } ] }, "episode_custom": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "properties": { "episode_type": { "type": "string", "description": "Custom episode type.\nUse this field to define your own episode types when integrating custom analytics. \nIf episode type is not specified, episode will be saved with `generic` type.\n", "maxLength": 20, "minLength": 1 }, "payload": { "type": "object", "description": "Custom episode payload. Use this field to provide additional information about the episode." } } } ] }, "episode_appearance_timestamps": { "type": "object", "properties": { "inference_timestamp": { "type": "integer", "format": "utc_ms", "description": "The time when this episode was created in inference service.", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "central_timestamp": { "type": "integer", "format": "utc_ms", "description": "The time when this episode was fetched by Central.", "example": 1637098611000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "watcher_timestamp": { "type": "integer", "format": "utc_ms", "description": "The time when this episode was fetched by Watcher.", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 } } }, "vision_confidence": { "description": "Confidence metric", "type": "number", "examples": { "default": { "value": 0.34 }, "one": { "value": 0.98 } }, "minimum": 0, "maximum": 1 }, "vision_box": { "type": "object", "description": "Rectangle", "required": [ "top", "left", "bottom", "right" ], "properties": { "top": { "description": "Top border of the bounding box. Fraction of full frame height", "type": "number", "minimum": 0, "maximum": 1 }, "left": { "description": "Left border of the bounding box. Fraction of full frame width", "type": "number", "minimum": 0, "maximum": 1 }, "bottom": { "description": "Bottom border of the bounding box. Fraction of full frame height", "type": "number", "minimum": 0, "maximum": 1 }, "right": { "description": "Right border of the bounding box. Fraction of full frame width", "type": "number", "minimum": 0, "maximum": 1 } } }, "vision_episode_face": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "properties": { "episode_type": { "type": "string", "description": "Face is detected", "const": "face" }, "detections": { "type": "array", "description": "Detections associated with this episode", "items": { "$ref": "#/components/schemas/vision_detected_face" } }, "fingerprint": { "description": "The fingerprint of the detected face", "allOf": [ { "$ref": "#/components/schemas/vision_face_fingerprint" } ] }, "matched_persons": { "description": "List of matched persons with similarity metric. \nVideoanalytics identification service enriches episode's data and fills this field\nwith the list of persons that are similar to the face detected in this episode.\n", "type": "array", "items": { "$ref": "#/components/schemas/vision_person_match" } } } } ] }, "vision_episode_vehicle": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "description": "Vehicle episode", "properties": { "episode_type": { "type": "string", "description": "Vehicle is detected", "const": "vehicle" }, "detections": { "type": "array", "description": "Detections associated with this episode", "items": { "oneOf": [ { "$ref": "#/components/schemas/vision_detected_vehicle" }, { "$ref": "#/components/schemas/vision_detected_license_plate" } ] } }, "vehicle_purpose": { "description": "The purpose of the vehicle, e.g. emergency or regular.", "allOf": [ { "$ref": "#/components/schemas/vision_vehicle_purpose" } ] }, "vehicle_emergency_subtype": { "description": "Emergency type of the vehicle.", "allOf": [ { "$ref": "#/components/schemas/vision_vehicle_emergency_subtype" } ] }, "license_plate_text": { "description": "Recognized vehicle's license plate number", "allOf": [ { "$ref": "#/components/schemas/vision_license_plate_text" } ] }, "license_plate_missing": { "type": "boolean", "description": "Indicates if no license plate is detected on this vehicle" }, "vehicle_facing_side": { "description": "Shows from which side the vehicle was detected.", "allOf": [ { "$ref": "#/components/schemas/vision_vehicle_facing_side" } ] } } } ] }, "vision_episode_context_search": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "properties": { "episode_type": { "type": "string", "description": "Episode matches context search text query", "const": "context_search" }, "match_score": { "type": "number", "description": "Maximum matching score between the text query and episode.", "examples": { "default": { "value": 0.2345 } } } } } ] }, "vision_episode_qr_code": { "allOf": [ { "$ref": "#/components/schemas/episode_base" }, { "type": "object", "properties": { "episode_type": { "type": "string", "description": "QR-code is detected", "const": "qr_code" }, "payload": { "type": "string", "description": "Raw data extracted from QR-code", "example": "WIFI:T:WPA;S:MyOfficeWiFi;P:Mypassword;H:;" } } } ] }, "vision_detected_object_base": { "type": "object", "required": [ "detected_at", "object_class" ], "properties": { "detected_at": { "description": "Timestamp when the object was detected", "type": "integer", "format": "utc_ms", "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "object_class": { "description": "Class of the detected object", "allOf": [ { "$ref": "#/components/schemas/vision_object_class" } ] }, "appearance": { "description": "Appearance attributes of the detected object", "allOf": [ { "$ref": "#/components/schemas/vision_appearance" } ] }, "confidence": { "description": "Confidence level of object detection", "allOf": [ { "$ref": "#/components/schemas/vision_confidence" } ] }, "thumbnail_quality": { "description": "Quality of the thumbnail", "allOf": [ { "$ref": "#/components/schemas/vision_confidence" } ] }, "thumbnail": { "description": "Preview of the detected object", "allOf": [ { "$ref": "#/components/schemas/vision_image_attributes" } ] } } }, "vision_detected_face": { "allOf": [ { "$ref": "#/components/schemas/vision_detected_object_base" }, { "$ref": "#/components/schemas/vision_face_attributes" }, { "type": "object", "description": "Detected face" } ] }, "vision_detected_vehicle": { "allOf": [ { "$ref": "#/components/schemas/vision_detected_object_base" }, { "$ref": "#/components/schemas/vision_vehicle_attributes" }, { "type": "object", "description": "Detected vehicle" } ] }, "vision_detected_license_plate": { "allOf": [ { "$ref": "#/components/schemas/vision_detected_object_base" }, { "$ref": "#/components/schemas/vision_license_plate_attributes" }, { "type": "object", "description": "Detected license plate" } ] }, "vision_vehicle_facing_side": { "description": "Shows from which side the vehicle was detected.", "type": "string", "oneOf": [ { "title": "Front", "const": "front", "description": "The vehicle was detected from the front." }, { "title": "Rear", "const": "rear", "description": "The vehicle was detected from the rear." } ] }, "vision_face_attributes": { "type": "object", "properties": { "fingerprint": { "description": "The fingerprint of the detected face", "allOf": [ { "$ref": "#/components/schemas/vision_face_fingerprint" } ] } } }, "vision_face_fingerprint": { "type": "object", "description": "Digital fingerprint of the face", "required": [ "data", "version" ], "properties": { "data": { "description": "Base64 encoded representation of the fingerprint", "type": "string", "format": "base64", "x-format-description": "base64" }, "version": { "description": "Version identifier of the fingerprint's data. The version is assigned automatically.\nFingerprints of different versions cannot be compared to each other.\n", "type": "string", "examples": { "default": { "value": "aabbccdd" }, "one": { "value": "c6ba4246" } } } } }, "vision_vehicle_attributes": { "type": "object", "properties": { "purpose": { "description": "The purpose of the vehicle, e.g. emergency or regular.", "allOf": [ { "$ref": "#/components/schemas/vision_vehicle_purpose" } ] }, "license_plate_missing": { "type": "boolean", "description": "Indicates if no license plate is detected on this vehicle" } } }, "vision_vehicle_purpose": { "description": "The purpose of the vehicle, e.g. emergency or regular.\nPolice, ambulance cars and firetrucks are being detected by the videoanalytics as `emergency`.\nAny other type of vehicle is marked as `regular`.\n", "type": "string", "oneOf": [ { "title": "Regular", "const": "regular", "description": "Regular car" }, { "title": "Emergency", "const": "emergency", "description": "Emergency vehicle (police, ambulance or firetruck)" } ] }, "vision_vehicle_emergency_subtype": { "description": "Emergency type of the vehicle, e.g. ambulance, police, firetruck.\n", "type": "string", "oneOf": [ { "title": "Ambulance", "const": "ambulance", "description": "ambulance car" }, { "title": "Police", "const": "police", "description": "police car" }, { "title": "Firetruck", "const": "firetruck", "description": "firetruck car" } ] }, "vision_license_plate_attributes": { "type": "object", "description": "Attributes of the detected vehicle", "properties": { "plate_text": { "description": "Recognized vehicle's license plate number", "allOf": [ { "$ref": "#/components/schemas/vision_license_plate_text" } ] }, "facing_side": { "description": "Shows from which side the vehicle was detected.", "allOf": [ { "$ref": "#/components/schemas/vision_vehicle_facing_side" } ] } } }, "vision_license_plate_text": { "description": "Recognized vehicle's license plate number", "type": "string", "examples": { "default": { "value": "A123BC45" }, "one": { "value": "B98365H" }, "two": { "value": "7BTK345" } } }, "vision_object_class": { "type": "string", "description": "Object class", "oneOf": [ { "title": "Face", "const": "face" }, { "title": "License plate", "const": "license_plate" }, { "title": "Vehicle", "const": "vehicle" } ] }, "vision_appearance": { "type": "object", "properties": { "box": { "description": "Position of the objects at the frame", "allOf": [ { "$ref": "#/components/schemas/vision_box" } ] } } }, "vision_image_mimetype": { "type": "string", "oneOf": [ { "const": "image/jpeg", "title": "jpeg", "description": "jpeg" } ] }, "vision_image_attributes": { "type": "object", "required": [ "data" ], "properties": { "data": { "description": "Base64-encoded image data", "type": "string", "format": "base64", "x-format-description": "base64" }, "sha256": { "type": "string", "format": "hexbinary", "description": "Checksum of this image", "minLength": 64, "maxLength": 64, "x-format-description": "hexbinary" }, "mime_type": { "description": "MIME type of the image", "allOf": [ { "$ref": "#/components/schemas/vision_image_mimetype" } ] } } }, "vision_person": { "type": "object", "description": "Person", "required": [ "person_id", "updated_at", "originator" ], "properties": { "person_id": { "description": "Identifier of the person", "readOnly": true, "format": "snowflake_id", "type": "integer", "examples": { "default": { "value": 7036001172460667000 } }, "x-format-description": "snowflake_id" }, "external_id": { "description": "Identifier of the person in the external system. \nUse it when supplying the recognition results further into the external system\n(e.g. for access level check) if the person identifiers in the external system \nare different from the ones in Flussonic Identification database.\n\nThis field may contain `null` when video analytics detects a new person\nwhich explicitly has no association in the external system (i.e. if `originator=identification_service`). \n", "type": "string", "examples": { "default": { "value": "dedcc8e8" } } }, "originator": { "description": "Indicates the way this person was created: \nmanually via an api or automatically in the identification service.\n", "allOf": [ { "$ref": "#/components/schemas/vision_person_originator" } ] }, "updated_at": { "description": "When this person was last updated", "type": "integer", "format": "utc_ms", "example": 1637034282845, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "deleted_at": { "description": "When this person was marked as deleted", "type": "integer", "format": "utc_ms", "example": 1637095014573, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 } } }, "vision_person_match": { "type": "object", "description": "Person matching information", "required": [ "person", "match_score" ], "properties": { "person": { "description": "Matched person", "allOf": [ { "$ref": "#/components/schemas/vision_person" } ] }, "match_score": { "description": "Score of the match with person. 1.0 means absolute match", "allOf": [ { "$ref": "#/components/schemas/vision_confidence" } ] } } }, "vision_person_originator": { "type": "string", "oneOf": [ { "title": "api", "const": "api", "description": "Person is created by operator or external system via API.\nFor example, when you add the person in Watcher UI, it has `originator=api`.\nBut when you edit an automatically created person in UI, `originator=identification_service` remains.\n" }, { "title": "identification_service", "const": "identification_service", "description": "Person is created automatically by the Identification service\nbecause no matching person was found in the persons database.\n\nThe Identification service stores unrecognized persons and matches new episodes with them\nin case if it becomes known who this is (i.e. if operator edits such person in UI to specify name).\n" } ] }, "api_call": { "type": "object", "properties": { "created_at": { "type": "string", "format": "date_time", "description": "Creation date and time", "example": "2021-01-30T08:30:00.432567Z", "x-format-description": "date_time" }, "ip": { "description": "IP address of the caller.", "type": "string", "format": "ip", "example": "192.34.32.10", "x-format-description": "ip" }, "user_agent": { "description": "The type of the device from which the API call was produced.", "type": "string", "example": "Flussonic 24.04" }, "originator": { "description": "The program produced the API call. Content of `X-Originator` header.", "type": "string", "example": "flussonic" }, "operation_id": { "description": "API method ID.", "type": "string", "example": "streams_list" }, "payload": { "description": "Payload data transmitter in the API call.", "type": "string" }, "status": { "description": "Request status code.", "type": "integer" }, "duration": { "type": "integer", "format": "microseconds", "description": "Microseconds that this request took", "x-format-description": "microseconds" }, "request_id": { "x-primary-key": true, "type": "string", "description": "Internal request-id for this operation" } } }, "tls_version": { "type": "string", "oneOf": [ { "title": "TLSv1", "const": "tlsv1" }, { "title": "TLSv1.1", "const": "tlsv1.1" }, { "title": "TLSv1.2", "const": "tlsv1.2" }, { "title": "TLSv1.3", "const": "tlsv1.3" } ] }, "streams_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "$ref": "#/components/schemas/openmetrics_labels" }, { "type": "object", "properties": { "streams": { "items": { "$ref": "#/components/schemas/stream_config" }, "type": "array", "description": "List of fetched streams according to the query parameters." } } } ] }, "stream_dvr_ranges_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "ranges": { "description": "List of DVR ranges.", "type": "array", "items": { "$ref": "#/components/schemas/dvr_range" } } } } ] }, "stream_dvr_locks_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "locks": { "description": "List of locked DVR ranges.", "type": "array", "items": { "$ref": "#/components/schemas/dvr_range" } } } } ] }, "sessions_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "sessions": { "type": "array", "description": "List of fetched sessions according to query parameters.", "items": { "$ref": "#/components/schemas/session" } } } } ] }, "templates_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "templates": { "items": { "$ref": "#/components/schemas/template_config" }, "type": "array", "description": "List of templates." } } } ] }, "transponder_ts_descriptors_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "ts_descriptors": { "description": "The list of transport stream descriptors. Descriptors are added to NIT and SDT.", "type": "array", "items": { "$ref": "#/components/schemas/ts_descriptor" } } } } ] }, "transponder_others_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "others": { "description": "The list of other multiplexers added for the current multiplexer.", "items": { "$ref": "#/components/schemas/transponder_other" }, "type": "array" } } } ] }, "transponder_programs_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "programs": { "description": "The list of programs configured in the multiplexer.", "type": "array", "items": { "$ref": "#/components/schemas/transponder_program" } } } } ] }, "transponder_pushes_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "pushes": { "description": "The list of pushes configured for the multiplexer.", "type": "array", "items": { "$ref": "#/components/schemas/transponder_push" } } } } ] }, "transponder_time_offsets_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "time_offsets": { "description": "The list of time offsets.", "type": "array", "items": { "$ref": "#/components/schemas/transponder_time_offset" } } } } ] }, "transponders_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "$ref": "#/components/schemas/openmetrics_labels" }, { "type": "object", "properties": { "transponders": { "description": "The list of multiplexers.", "type": "array", "items": { "$ref": "#/components/schemas/transponder_config" } } } } ] }, "dvb_cards_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "dvb_cards": { "description": "The list of DVB cards configured on the server.", "type": "array", "items": { "$ref": "#/components/schemas/dvb_card_config" } } } } ] }, "event_sinks_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "event_sinks": { "description": "The configuration of event notifications.", "type": "array", "items": { "$ref": "#/components/schemas/event_sink_config" } } } } ] }, "available_events_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "events": { "description": "The list of available events.", "type": "array", "items": { "$ref": "#/components/schemas/streamer_event1" } } } } ] }, "auth_backends_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "auth_backends": { "description": "Configurations of the authorization backends.", "items": { "$ref": "#/components/schemas/auth_backend_config" }, "type": "array" } } } ] }, "caches_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "caches": { "description": "The list of caches.", "type": "array", "items": { "$ref": "#/components/schemas/cache_config" } } } } ] }, "dvrs_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "$ref": "#/components/schemas/openmetrics_labels" }, { "type": "object", "properties": { "dvrs": { "description": "Configurations of the DVRs.", "type": "array", "items": { "$ref": "#/components/schemas/dvr_config" } } } } ] }, "dvr_disks_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "disks": { "description": "Configurations of the RAID disks.", "type": "array", "items": { "$ref": "#/components/schemas/raid_disk_config" } } } } ] }, "peers_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "peers": { "description": "The list of peers.", "type": "array", "items": { "$ref": "#/components/schemas/peer_config" } } } } ] }, "sources_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "sources": { "description": "The list of sources.", "type": "array", "items": { "$ref": "#/components/schemas/source_config" } } } } ] }, "vods_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "vods": { "description": "Configurations of the VODs.", "type": "array", "items": { "$ref": "#/components/schemas/vod_config" } } } } ] }, "disk_files_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "files": { "description": "The list of VOD files.", "type": "array", "items": { "$ref": "#/components/schemas/disk_file" } } } } ] }, "logos_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "logos": { "description": "The array of logo files.", "type": "array", "items": { "$ref": "#/components/schemas/logo_file" } } } } ] }, "media_info_list": { "allOf": [ { "$ref": "#/components/schemas/collection_response" }, { "type": "object", "properties": { "media_info_list": { "description": "The list of `media_info` for each program transmitted via the DVB card.", "type": "array", "items": { "$ref": "#/components/schemas/media_info" } } } } ] }, "file_processor_config": { "type": "object", "properties": { "path": { "description": "The directory where Flussonic puts output files.", "type": "string", "format": "disk_path", "x-format-description": "disk_path" } } }, "file_processor_job": { "description": "Video files processing request", "type": "object", "properties": { "input_files": { "description": "Input files", "type": "array", "minItems": 1, "items": { "type": "string", "format": "disk_path", "x-format-description": "disk_path" } }, "output_file": { "description": "Prefix of the output file. Resulting name of the output file \nhas the following structure: {output_file}.processed.{timestamp}.mp4.\n", "type": "string" }, "filters": { "description": "Processing filters", "type": "array", "minItems": 1, "items": { "$ref": "#/components/schemas/file_processor_filter" } }, "id": { "description": "Job id", "type": "string", "readOnly": true }, "status": { "description": "Job status.", "type": "string", "enum": [ "new", "running", "done", "error" ], "readOnly": true }, "size": { "description": "Output file size", "type": "integer", "readOnly": true }, "duration": { "description": "Output file duration", "type": "integer", "readOnly": true }, "progress": { "description": "Percent done", "type": "integer", "minimum": 0, "maximum": 100, "readOnly": true }, "errors": { "description": "List of errors", "type": "array", "items": { "$ref": "#/components/schemas/error" }, "readOnly": true } } }, "file_processor_filter": { "oneOf": [ { "$ref": "#/components/schemas/file_processor_filter_overlay" }, { "$ref": "#/components/schemas/file_processor_filter_crop" }, { "$ref": "#/components/schemas/file_processor_filter_mute" }, { "$ref": "#/components/schemas/file_processor_filter_mosaic" }, { "$ref": "#/components/schemas/file_processor_filter_transcoder" } ], "discriminator": { "propertyName": "group", "mapping": { "overlay": "#/components/schemas/file_processor_filter_overlay", "crop": "#/components/schemas/file_processor_filter_crop", "mute": "#/components/schemas/file_processor_filter_mute", "mosaic": "#/components/schemas/file_processor_filter_mosaic", "transcoder": "#/components/schemas/file_processor_filter_transcoder" } } }, "file_processor_filter_overlay": { "type": "object", "required": [ "group", "start", "stop", "position" ], "properties": { "group": { "type": "string", "title": "Overlay", "const": "overlay", "description": "Put black rectangle to the specified place" }, "start": { "description": "Filter start time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" }, "stop": { "description": "Filter end time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" }, "position": { "description": "Overlay position at the output image", "type": "object", "required": [ "x1", "y1", "x2", "y2" ], "properties": { "x1": { "description": "Top overlay coordinate", "type": "integer" }, "y1": { "description": "Left overlay coordinate", "type": "integer" }, "x2": { "description": "Right overlay coordinate", "type": "integer" }, "y2": { "description": "Bottom overlay coordinate", "type": "integer" } } } } }, "file_processor_filter_crop": { "type": "object", "required": [ "group", "start", "stop" ], "properties": { "group": { "type": "string", "title": "Crop", "const": "crop", "description": "Cut off interval [start, stop] from the output" }, "start": { "description": "Filter start time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" }, "stop": { "description": "Filter end time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" } } }, "file_processor_filter_mute": { "type": "object", "required": [ "group", "start", "stop" ], "properties": { "group": { "type": "string", "title": "Mute", "const": "mute", "description": "Mute audio on interval [start, stop]" }, "start": { "description": "Filter start time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" }, "stop": { "description": "Filter end time", "type": "integer", "format": "milliseconds", "x-format-description": "milliseconds" } } }, "file_processor_filter_mosaic": { "type": "object", "required": [ "group" ], "properties": { "group": { "type": "string", "title": "Mosaic", "const": "mosaic", "description": "Combine all input files into single image. Cannot be used with other filters" } } }, "file_processor_filter_transcoder": { "type": "object", "required": [ "group", "transcoder" ], "properties": { "group": { "type": "string", "title": "Transcoder", "const": "transcoder", "description": "Transcode the input file. Cannot be used with other filters" }, "transcoder": { "description": "Transcoder configuration", "oneOf": [ { "$ref": "#/components/schemas/transcoder_opts" }, { "$ref": "#/components/schemas/media_info" } ] } } }, "openmetrics_labels": { "type": "object", "properties": { "server_id": { "type": "string", "format": "uuid", "openmetrics_label": "server_id", "description": "Unique server ID generated on a first start or license change.\nShould not changing until running on the same hardware.\n", "x-format-description": "uuid" } } }, "opentelemetry": { "type": "object", "properties": {} }, "agent_config_base": { "type": "object", "properties": { "id": { "type": "string", "description": "Agent identifier", "x-primary-key": true, "example": "1234567" }, "key": { "type": "string", "description": "Agent authentication key." }, "stats": { "description": "Agents's metrics and other statistical information.", "allOf": [ { "$ref": "#/components/schemas/watcher_agent_stats" } ], "readOnly": true } } } }, "securitySchemes": { "basicAuth": { "scheme": "basic", "type": "http", "description": "To use Basic Auth API calls authorization, you need credentials that can be set in `/etc/flussonic/flussonic.conf` file:\n\n* Use `edit_auth` for GET, PUT, POST, and DELETE requests.\n\n* Use `view_auth` if you need GET requests only.\n" }, "bearerAuth": { "bearerFormat": "JWT", "scheme": "bearer", "type": "http", "description": "To use Bearer Auth API calls authorization, you need a token. \nThe token is base64-encoded string `username:password`.\n\nIf you are going to use GET, PUT, POST, and DELETE requests, \nuse username and password specified in the `edit_auth` parameter in `/etc/flussonic/flussonic.conf` file.\n\nThe `view_auth` credentials allow only GET requests.\n" } } }, "paths": { "/streams": { "get": { "operationId": "streams_list", "summary": "List streams", "description": "This API method is one of the most important in whole API, because it gives the list of all streams,\nincluding:\n\n* configured (may not be running at the moment)\n* running (including those that are created via a template and do not have own disk configuration)\n* remote (available from other servers)\n* only recorded\n\nTogether with the `stream_save` method you can manage streams in Flussonic.\n\nYou can pass all stream configuration options to query string for filtering, not only specified in the parameters.\n\nThis method and `stream_get` will return `effective stream configuration` with all templates, defaults\nincluded into this response. It is not exactly what you can see in the disk config. If you have configured\nthis stream in the disk file, then the original disk configuration can be found in the field `config_on_disk`.\n\nWhat you get from this API call is not what you write to `stream_save`.\n", "parameters": [ { "name": "select", "description": "Comma-separated list of fields (including nested) that will be returned.", "explode": false, "in": "query", "required": false, "schema": { "example": "name,inputs,stats,dvr.root", "type": "string" }, "style": "form" }, { "name": "sort", "description": "Composite sort direction.\nDefault sort order is `named_by (config,user,remote)`, `position`, `name`.\n", "explode": false, "in": "query", "required": false, "schema": { "example": "-stats.bitrate,name,position", "type": "string" }, "style": "form" }, { "name": "limit", "description": "Limit select count in collection to N elements. Default value is 100.", "explode": false, "in": "query", "required": false, "schema": { "type": "integer", "example": 100 }, "style": "form" }, { "name": "cursor", "description": "Properly encoded analog of offset, allowing to read next bunch of items. \nWe do not offer common `offset` fields, use please cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n", "in": "query", "required": false, "schema": { "type": "string", "example": "JTI0cG9zaXRpb25fZ3Q9MQ==" } }, { "name": "q", "description": "Search pattern for different fields like name, title, urls, etc.", "in": "query", "required": false, "schema": { "type": "string", "example": "somepattern" } }, { "name": "Accept", "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n", "in": "header", "schema": { "type": "string" } }, { "name": "format", "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.", "in": "query", "required": false, "schema": { "type": "string", "oneOf": [ { "title": "Openmetrics", "const": "openmetrics", "description": "The openmetrics-text content format will be used in response." } ], "example": "openmetrics" } } ], "responses": { "200": { "description": "Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/streams_list" } }, "application/openmetrics-text": { "schema": { "type": "string", "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n" }, "examples": { "default": { "summary": "General example", "description": "The example describes the rule how the response string forms.", "value": "metric{label=\"value\"} VALUE" }, "bitrate": { "value": "stream_bitrate{server_id=\"123e4567-e89b-12d3-a456-426614174000\",name=\"mystream\"} 1000" }, "online_clients": { "value": "stream_online_clients{server_id=\"123e4567-e89b-12d3-a456-426614174000\",name=\"mystream\"} 1000" } } }, "text/plain": { "schema": { "type": "string", "description": "Responses content format used for receiving openmetrics for Prometheus application as a text." } } } } }, "tags": [ "stream" ] } }, "/streams/{name}": { "get": { "operationId": "stream_get", "summary": "Get one stream", "description": "This method allows to fetch a single stream. Refer to the `streams_list` operation to find out what data will be returned in this method.", "parameters": [ { "description": "Stream name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/stream_config" } } }, "description": "Whole stream" } }, "tags": [ "stream" ] }, "put": { "operationId": "stream_save", "summary": "Save stream", "description": "Create or update a stream by its name.\nIf the stream doesn't exist in the disk config, it will be created.\n\nIf you update a stream that is created with a template using a user request\nhaving `named_by=user`, a new stream will be created in the disk config.\n\nIf you pass partial stream configuration, this exact part will be updated, not the whole stream.\n\nTo disable a feature, provide the corresponding property with the `null` value, like `'{\"drm\": null}'`.\n\nPass the `\"$reset\": true` option to replace the stream configuration with the provided one.\n", "parameters": [ { "name": "name", "description": "stream name", "in": "path", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "description": "Partial stream configuration", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/stream_config" } } } }, "responses": { "200": { "description": "Updated stream", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/stream_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "stream" ] }, "delete": { "operationId": "stream_delete", "summary": "Delete the stream", "description": "This method allows to delete a single stream. \n", "parameters": [ { "name": "name", "description": "stream name", "in": "path", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "stream" ] } }, "/streams/{name}/stop": { "post": { "operationId": "stream_stop", "summary": "Stop the stream", "description": "Stop the stream with a specified name.\n\nIf the stream is static, it will restart according to existing rules.\n\nThis API call is a replacement for both: stop and restart.\n\nServer cannot restart a stream that was started by user (publish for example),\nbecause it cannot ask user to repeat publishing.\n\nStatic stream declared in config will be started automatically as if it failed\ndue to any bug.\n\nThis is why `restart` is actually a `stop` and maybe `start`, while `start` is made\nby live stream subsystem\n", "parameters": [ { "name": "name", "description": "Stream name.\n", "in": "path", "required": true, "schema": { "example": "demo", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Stopped" } }, "tags": [ "stream-ops" ] } }, "/streams/{name}/dvr/ranges": { "parameters": [ { "description": "Stream name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "get": { "description": "This method allows to get the list of DVR recorded ranges for a stream.", "operationId": "stream_dvr_ranges_list", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/stream_dvr_ranges_list" } } }, "description": "Response" } }, "summary": "Get stream recorded dvr ranges", "tags": [ "stream-dvr" ] }, "delete": { "description": "This method allows to delete a DVR recording in a specified range for a stream.", "operationId": "stream_dvr_ranges_delete", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_range" } } } }, "responses": { "204": { "description": "The DVR recording for the specified range is deleted." } }, "summary": "Delete stream recorded DVR range", "tags": [ "stream-dvr" ] } }, "/streams/{name}/dvr/locks": { "parameters": [ { "description": "Stream name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "get": { "description": "This method allows to get the list of locked DVR ranges for a stream.", "operationId": "stream_dvr_locks_list", "deprecated": true, "x-delete-at": 23.12, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/stream_dvr_locks_list" } } }, "description": "Response" } }, "summary": "Get stream locked dvr ranges", "tags": [ "stream-dvr" ] }, "post": { "description": "This method allows to lock a DVR range for a stream.\nLocking can be useful for the nPVR (Network Personal Video Recorder) service or just for keeping important recordings.\n", "operationId": "stream_dvr_locks_save", "deprecated": true, "x-delete-at": 23.12, "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_range" } } } }, "responses": { "204": { "description": "The specified DVR range is locked." } }, "summary": "Lock stream recorded DVR range", "tags": [ "stream-dvr" ] }, "delete": { "description": "This method allows to unlock a DVR range for a stream.", "operationId": "stream_dvr_locks_delete", "deprecated": true, "x-delete-at": 23.12, "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_range" } } } }, "responses": { "204": { "description": "The specified DVR range is unlocked." } }, "summary": "Unlock stream recorded DVR range", "tags": [ "stream-dvr" ] } }, "/streams/{name}/dvr/export": { "parameters": [ { "description": "Stream name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" } }, { "description": "Start time in Unix timestamp (seconds).", "in": "query", "name": "from", "required": true, "schema": { "example": 1675159800, "type": "integer" } }, { "description": "Duration in seconds.", "in": "query", "name": "duration", "required": true, "schema": { "example": 4200, "type": "integer" } }, { "description": "The recording path.", "in": "query", "name": "path", "required": true, "schema": { "examples": [ "/home/example/file.mp4", "s3://example.com/bucket/path/to/file.mp4" ], "type": "string" } }, { "name": "packing", "in": "query", "description": "How to pack a recording data in the exported file", "required": false, "schema": { "oneOf": [ { "type": "string", "const": "fragmented", "description": "Make a fragmented MP4. This allows a download to start with a minimal delay. The resulting file may be not playable by some old players." }, { "type": "string", "const": "compat", "description": "Construct a traditional MP4 file.\nThis may require a significant time to start (especially with large `duration`)\nbut the resulting file is compatible with all players.\n" } ], "default": "fragmented", "example": "compat" } }, { "name": "timelapse", "in": "query", "description": "Request a timelapse instead of normal speed", "schema": { "type": "boolean" } }, { "name": "timelapse_kbps", "in": "query", "description": "Custom bitrate for timelapse", "schema": { "type": "integer" } }, { "description": "The necessity to save the metadata with the MP4 file.\nIf true, the metadata will be stored in the udta.meta.ilst.data atom.\n", "in": "query", "name": "meta", "required": false, "schema": { "example": true, "type": "boolean" } } ], "post": { "description": "This method allows to export MP4 files from DVR and save them on the server disk or to the S3 bucket.", "operationId": "stream_save_mp4", "responses": { "204": { "description": "The requested fragment has been successfully exported" }, "303": { "content": { "text/plain": { "schema": { "type": "string" } } }, "description": "Export is taking long time, and the client is advised to monitor the job at other URI" } }, "summary": "Export DVR as MP4 file", "tags": [ "stream-dvr" ] } }, "/streams/{name}/dvr/consistency_check": { "parameters": [ { "description": "Stream name.", "in": "path", "name": "name", "required": true, "schema": { "example": "demo", "type": "string" } } ], "post": { "summary": "Check stream DVR", "description": "Run DVR consistency checks on this stream.\nWhen there are any problems found, errors are returned in response body.\nThis is a diagnostic operation, response format is not fully specified.\n", "operationId": "stream_dvr_consistency_check", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_consistency_errors" } } }, "description": "Some consistency issues were found during checks" }, "204": { "description": "No problem was found" } }, "tags": [ "stream-dvr" ] } }, "/sessions": { "get": { "operationId": "sessions_list", "summary": "List sessions", "description": "This method returns list of opened play sessions.\n\nAt this moment sessions are filtered only to `type=play`, however later\nwe may add additional sessions like `publish`, `push`, or `ingest`.\n", "parameters": [ { "description": "Comma-separated list of fields (including nested) that will be returned", "explode": false, "in": "query", "name": "select", "required": false, "schema": { "example": "name,bytes,created_at", "type": "string" }, "style": "form" }, { "description": "Composite sort direction.", "explode": false, "in": "query", "name": "sort", "required": false, "schema": { "example": "-created_at,name", "type": "string" }, "style": "form" }, { "description": "Limit select count in collection to N elements.", "explode": false, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer", "example": 100 }, "style": "form" }, { "description": "Properly encoded analog of offset, allowing to read the next bunch of items. of items", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string", "example": "JTI0cG9zaXRpb25fZ3Q9MQ==" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/sessions_list" } } }, "description": "Response" } }, "tags": [ "session" ] } }, "/sessions/reauth": { "post": { "operationId": "sessions_reauth", "summary": "Invalidate auth backend response cache for sessions of specified stream", "description": "Flussonic immediately re-call auth-backend and check if session is still authorized.\nThis will be done for all open sessions.\n", "parameters": [ { "name": "name", "in": "query", "description": "Media name", "required": true, "schema": { "type": "string", "example": "clock" } } ], "responses": { "200": { "description": "Stream sessions have been successfully marked for reauth", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/collection_response" }, "example": { "estimated_count": 42 } } } }, "404": { "description": "Stream is not found by the specified name.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" }, "example": { "errors": [ { "code": "stream_not_found", "status": "404", "title": "Stream not found" } ] } } } } }, "tags": [ "session" ] } }, "/sessions/{id}": { "get": { "operationId": "session_get", "summary": "Get the session", "description": "Get the play session.\n", "parameters": [ { "description": "Unique identifier (or UUID) of the session.", "in": "path", "name": "id", "required": true, "schema": { "example": "61942414-8c15-4809-8bb6-adf1ae846027", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/session" } } }, "description": "Whole session" } }, "tags": [ "session" ] }, "delete": { "operationId": "session_delete", "summary": "Close the session", "description": "Close the play session. The closed session will be available in the sessions history.\n", "parameters": [ { "description": "Unique identifier (or UUID) of the session.", "in": "path", "name": "id", "required": true, "schema": { "example": "61942414-8c15-4809-8bb6-adf1ae846027", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "session" ] } }, "/episodes": { "parameters": [ { "name": "select", "description": "Comma-separated list of fields (including nested) that will be returned.", "explode": false, "in": "query", "required": false, "schema": { "example": "episode_id,media,close_reason", "type": "string" }, "style": "form" }, { "name": "limit", "description": "Limit select count in collection to N elements.", "explode": false, "in": "query", "required": false, "schema": { "type": "integer", "example": 100 }, "style": "form" }, { "name": "cursor", "description": "Properly encoded analog of offset, allowing to read next bunch of items. \nWe do not offer common `offset` fields, use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n", "in": "query", "required": false, "schema": { "type": "string", "example": "JTI0cG9zaXRpb25fZ3Q9MQ==" } }, { "name": "episode_type", "description": "Episode type", "explode": false, "in": "query", "required": false, "schema": { "type": "string", "example": "motion" }, "style": "form" }, { "name": "media", "description": "Filter the collection by media name on which the episode is registered", "explode": false, "in": "query", "required": false, "schema": { "type": "string", "example": "cam-045" }, "style": "form" }, { "name": "updated_at_gt", "description": "Filter the collection by episode update time.\nThis field is rather specific because it allows to have an update stream with new/updated episodes\n", "explode": false, "in": "query", "required": false, "schema": { "type": "integer", "format": "utc_ms", "example": 1637094994000, "x-format-description": "Unix timestamp in milliseconds", "minimum": 1000000000000, "maximum": 10000000000000 }, "style": "form" }, { "name": "poll_timeout", "description": "Client may ask to delay a response if there are no episodes to fetch.\nThis should be used as a long-poll mechanism for lightweight fetching episodes from origin.\n", "explode": false, "in": "query", "required": false, "schema": { "type": "integer", "format": "seconds", "example": 30, "x-format-description": "seconds" }, "style": "form" }, { "name": "dvr_presence_check", "description": "Enables check of DVR presence on streamer for the episode.\n", "in": "query", "required": false, "schema": { "type": "boolean", "example": true, "default": false }, "style": "form" } ], "get": { "operationId": "episodes_list", "summary": "List episodes", "description": "This method allows you to fetch registered episodes\n", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/episodes_list" } } }, "description": "Response" } }, "tags": [ "episode" ] } }, "/templates": { "get": { "operationId": "templates_list", "summary": "List templates", "description": "This method allows to get the list of all templates in Flussonic with all their settings.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/templates_list" } } }, "description": "Response" } }, "tags": [ "template" ] } }, "/templates/{name}": { "parameters": [ { "description": "Template name.", "in": "path", "name": "name", "required": true, "schema": { "example": "hd-sports", "type": "string" }, "style": "simple" } ], "get": { "operationId": "template_get", "summary": "Get the template", "description": "This method allows to get a single template by name.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/template_config" } } }, "description": "The whole template configuration." } }, "tags": [ "template" ] }, "put": { "operationId": "template_save", "summary": "Save the template", "description": "Create or update a template. \nIf you pass only a partial template configuration, only the passed fields will be updated, not the whole template.\n", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/template_config" } } }, "description": "Partial template configuration." }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/template_config" } } }, "description": "Updated template." }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "template" ] }, "delete": { "operationId": "template_delete", "summary": "Delete the template", "description": "Delete the template by its name.", "responses": { "204": { "description": "The template is deleted." } }, "tags": [ "template" ] } }, "/transponders": { "get": { "description": "Fetch the multiplexers list.", "operationId": "transponders_list", "parameters": [ { "name": "format", "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.", "in": "query", "required": false, "schema": { "type": "string", "oneOf": [ { "title": "Openmetrics", "const": "openmetrics", "description": "The openmetrics-text content format will be used in response." } ], "example": "openmetrics" } }, { "name": "Accept", "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n", "in": "header", "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponders_list" } }, "application/openmetrics-text": { "schema": { "type": "string", "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n", "examples": { "default": { "summary": "General example", "description": "The example describes the rule how the response string forms.", "value": "metric{label=\"value\"} VALUE" }, "stuffing": { "value": "pusher_stuffing{server_id=\"123e4567-e89b-12d3-a456-426614174000\",id=1,name=\"multiplexer\"} 128" } } } }, "text/plain": { "schema": { "type": "string", "description": "Responses content format used for receiving openmetrics for Prometheus application as a text." } } }, "description": "Response" } }, "summary": "Get multiplexers", "tags": [ "multiplexer" ] } }, "/transponders/{name}": { "delete": { "description": "Delete the multiplexer by its name.", "operationId": "transponder_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the multiplexer", "tags": [ "multiplexer" ] }, "get": { "description": "This method allows you to fetch a single multiplexer.", "operationId": "transponder_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_config" } } }, "description": "Response" } }, "summary": "Get the multiplexer", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update the multiplexer.", "operationId": "transponder_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_config" } } }, "description": "Request" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_config" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the multiplexer", "tags": [ "multiplexer" ] } }, "/transponders/{name}/pushes": { "get": { "description": "Fetch all multiplexer pushes.", "operationId": "transponder_pushes_list", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_pushes_list" } } }, "description": "Response" } }, "summary": "Get multiplexer pushes", "tags": [ "multiplexer" ] } }, "/transponders/{name}/pushes/{index}": { "delete": { "description": "Delete the multiplexer push by its index.", "operationId": "transponder_push_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "push index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the multiplexer push", "tags": [ "multiplexer" ] }, "get": { "description": "Method allows to fetch single multiplexer push.", "operationId": "transponder_push_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "push index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_push" } } }, "description": "Response" } }, "summary": "Get the multiplexer push", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update multiplexer push.", "operationId": "transponder_push_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "push index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_push" } } }, "description": "Request" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_push" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the multiplexer push", "tags": [ "multiplexer" ] } }, "/transponders/{name}/ts_descriptors": { "get": { "description": "Fetch all multiplexer ts_descriptors.", "operationId": "transponder_ts_descriptors_list", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_ts_descriptors_list" } } }, "description": "Response" } }, "summary": "Get multiplexer ts_descriptors", "tags": [ "multiplexer" ] } }, "/transponders/{name}/ts_descriptors/{index}": { "delete": { "description": "Delete the multiplexer descriptor by its index.", "operationId": "transponder_ts_descriptor_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "descriptor index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the multiplexer MPEG-TS descriptor", "tags": [ "multiplexer" ] }, "get": { "description": "This method allows you to fetch a single multiplexer descriptor.", "operationId": "transponder_ts_descriptor_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "ts_descriptor index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ts_descriptor" } } }, "description": "Response" } }, "summary": "Get the multiplexer descriptor", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update multiplexer descriptor.", "operationId": "transponder_ts_descriptor_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "ts_descriptor index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ts_descriptor" } } }, "description": "Request" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ts_descriptor" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the multiplexer ts_descriptor", "tags": [ "multiplexer" ] } }, "/transponders/{name}/programs": { "get": { "description": "Fetch all multiplexer programs.", "operationId": "transponder_programs_list", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_programs_list" } } }, "description": "Response" } }, "summary": "Get multiplexer programs", "tags": [ "multiplexer" ] } }, "/transponders/{name}/programs/{program_id}": { "delete": { "description": "Delete the multiplexer program by its number.", "operationId": "transponder_program_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "program number", "in": "path", "name": "program_id", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the multiplexer program", "tags": [ "multiplexer" ] }, "get": { "description": "Method allows you to fetch single multiplexer program.", "operationId": "transponder_program_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "program index", "in": "path", "name": "program_id", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_program" } } }, "description": "Response" } }, "summary": "Get the multiplexer program", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update multiplexer program.", "operationId": "transponder_program_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "program index", "in": "path", "name": "program_id", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_program" } } }, "description": "Requested" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_program" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the multiplexer program", "tags": [ "multiplexer" ] } }, "/transponders/{name}/time_offsets": { "get": { "description": "Fetch all multiplexer time_offsets.", "operationId": "transponder_time_offsets_list", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_time_offsets_list" } } }, "description": "Response" } }, "summary": "Get multiplexer time_offsets", "tags": [ "multiplexer" ] } }, "/transponders/{name}/time_offsets/{index}": { "delete": { "description": "Delete the multiplexer time_offset by its index.", "operationId": "transponder_time_offset_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "time_offset index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the multiplexer time_offset", "tags": [ "multiplexer" ] }, "get": { "description": "Method allows to fetch single multiplexer time_offset", "operationId": "transponder_time_offset_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "time_offset index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_time_offset" } } }, "description": "Response" } }, "summary": "Get the multiplexer time_offset", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update multiplexer time_offset", "operationId": "transponder_time_offset_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "time_offset index", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_time_offset" } } }, "description": "Requested" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_time_offset" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the multiplexer time_offset", "tags": [ "multiplexer" ] } }, "/transponders/{name}/others": { "get": { "description": "Fetch all other multiplexers for the multiplexer with the specified name.", "operationId": "transponder_others_list", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_others_list" } } }, "description": "Response" } }, "summary": "Get other multiplexers", "tags": [ "multiplexer" ] } }, "/transponders/{name}/others/{index}": { "delete": { "description": "Delete the other multiplexer by its index.", "operationId": "transponder_other_delete", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "Other multiplexer index.", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the other multiplexer", "tags": [ "multiplexer" ] }, "get": { "description": "Method allows to fetch a single other multiplexer.", "operationId": "transponder_other_get", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "Other multiplexer index.", "in": "path", "name": "index", "required": true, "schema": { "example": "abc", "type": "integer" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_other" } } }, "description": "Response" } }, "summary": "Get the other multiplexer", "tags": [ "multiplexer" ] }, "put": { "description": "Create or update other multiplexer.", "operationId": "transponder_other_save", "parameters": [ { "description": "Multiplexer name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "Other multiplexer index.", "in": "path", "name": "index", "required": true, "schema": { "example": 1, "type": "integer" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_other" } } }, "description": "Request" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/transponder_other" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save the other multiplexer", "tags": [ "multiplexer" ] } }, "/multiplexers/{name}/xmltv_upload": { "post": { "operationId": "multiplexer_xmltv_upload", "summary": "Upload XMLTV files", "description": "Upload XMLTV files to multiplexer\n", "parameters": [ { "description": "multiplexer name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { "file": { "description": "The array of XMLTV files.", "type": "array", "items": { "type": "string", "format": "binary", "x-format-description": "binary" } } } } } }, "description": "Multipart XMLTV files upload request" }, "responses": { "204": { "description": "The XMLTV files were uploaded" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't upload" }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Multiplexer not found" } }, "tags": [ "multiplexer" ] } }, "/dvb_cards": { "get": { "operationId": "dvb_cards_list", "summary": "Get list of DVB cards", "description": "This method allows to get the list of all DVB cards configured in Flussonic.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvb_cards_list" } } }, "description": "Response" } }, "tags": [ "dvb" ] } }, "/dvb_cards/{name}": { "get": { "operationId": "dvb_card_get", "summary": "Get the DVB card", "description": "This method allows to get a single DVB card by name.", "parameters": [ { "description": "dvb_card name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvb_card_config" } } }, "description": "Response" } }, "tags": [ "dvb" ] }, "put": { "operationId": "dvb_card_save", "summary": "Save the DVB card", "description": "Create or update a DVB card.\nIf you pass only a partial DVB card configuration, only the passed fields will be updated, not the whole configuration.\n", "parameters": [ { "description": "dvb_card name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvb_card_config" } } }, "description": "Request" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvb_card_config" } } }, "description": "Response" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save a DVB card" } }, "tags": [ "dvb" ] }, "delete": { "operationId": "dvb_card_delete", "summary": "Delete the DVB card", "description": "Delete the DVB card by its name.", "parameters": [ { "description": "dvb_card name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "dvb" ] } }, "/dvb_cards/{name}/available_programs": { "get": { "operationId": "dvb_card_available_programs_get", "description": "Fetch the list of `media_info` for each program transmitted via the DVB card.", "parameters": [ { "description": "dvb_card name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/media_info_list" } } }, "description": "Response" } }, "summary": "Get the media_info for each dvb_card program", "tags": [ "dvb" ] } }, "/event_sinks": { "get": { "operationId": "event_sinks_list", "summary": "List event sinks configs", "x-api-deny": [ "watcher-core" ], "description": "This method allows to get the list of all event sinks (former `notify`) configured in Flussonic.\n\nEach event sink is an instruction for Flussonic to send events to some target. \nIn particular, you can configure sending events to an event handler or writing them to a log file.\n\nEvent sink has its unique name just for management purposes,\nevent filtering instructions and target for sending events.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/events-from-media-server/" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/event_sinks_list" } } }, "description": "List of event sinks" } }, "tags": [ "events" ] } }, "/event_sinks/{name}": { "parameters": [ { "name": "name", "description": "event_sink name", "in": "path", "required": true, "schema": { "example": "middleware_logger", "type": "string" }, "style": "simple" } ], "get": { "operationId": "event_sink_get", "summary": "Get one event sink configuration", "x-api-deny": [ "watcher-core" ], "description": "This method allows to get a single event sink configuration.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/event_sink_config" } } }, "description": "Whole event_sink config" } }, "tags": [ "events" ] }, "put": { "operationId": "event_sink_save", "summary": "Save a single event sink configuration", "x-api-deny": [ "watcher-core" ], "description": "Create or update an event sink configuration by its name.", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/event_sink_config" } } }, "description": "Partial event_sink configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/event_sink_config" } } }, "description": "Updated event sink configuration" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "events" ] }, "delete": { "operationId": "event_sink_delete", "summary": "Delete an event sink configuration", "x-api-deny": [ "watcher-core" ], "description": "Delete an event sink configuration by its name.", "responses": { "204": { "description": "Deleted" } }, "tags": [ "events" ] } }, "/event_sinks/{name}/events": { "get": { "operationId": "available_events_list", "summary": "Get events from sink configuration", "description": "This method allows to get the batch of events from an event sink configuration.\nCurrenly this method is not implemented yet.\nHowever, its schema can be used for getting the list of events with descriptions (see the `event` parameter in the response.)\n", "parameters": [ { "name": "name", "description": "Globally unique event sink name.", "in": "path", "required": true, "schema": { "example": "middleware_logger", "type": "string" }, "style": "simple" } ], "responses": { "200": { "description": "List of events", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/available_events_list" } } } } }, "tags": [ "events" ] } }, "/auth_backends": { "get": { "operationId": "auth_backends_list", "summary": "List auth backends", "description": "This method allows to get the list of all authorization backends configured in Flussonic.", "x-api-deny": [ "watcher-core" ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/auth_backends_list" } } }, "description": "Response" } }, "tags": [ "auth" ] } }, "/auth_backends/{name}": { "parameters": [ { "description": "Authorization backend name.", "in": "path", "name": "name", "required": true, "schema": { "example": "middleware_auth", "type": "string" }, "style": "simple" } ], "get": { "operationId": "auth_backend_get", "x-api-deny": [ "watcher-core" ], "summary": "Get the auth backend", "description": "This method allows to get a single authorization backend.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/auth_backend_config" } } }, "description": "The authorization backend configuration." } }, "tags": [ "auth" ] }, "put": { "operationId": "auth_backend_save", "x-api-deny": [ "watcher-core" ], "summary": "Save the auth backend", "description": "Create or update an authorization backend. \nIf you pass only a partial configuration, only the passed fields will be updated.\n", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/auth_backend_config" } } }, "description": "Partial authorization backend configuration." }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/auth_backend_config" } } }, "description": "Updated auth_backend" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "auth" ] }, "delete": { "operationId": "auth_backend_delete", "x-api-deny": [ "watcher-core" ], "summary": "Delete the auth backend", "description": "Delete the authorization backend by its name.", "responses": { "204": { "description": "The authorization backend is deleted." } }, "tags": [ "auth" ] } }, "/caches": { "get": { "description": "Fetch all caches", "operationId": "caches_list", "summary": "List of caches", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/caches_list" } } }, "description": "Response" } }, "tags": [ "cache" ] } }, "/caches/{name}": { "get": { "description": "Method allows to fetch single cache", "operationId": "cache_get", "parameters": [ { "description": "cache name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/cache_config" } } }, "description": "Whole cache" } }, "summary": "Get the cache", "tags": [ "cache" ] }, "put": { "description": "Create or update cache", "operationId": "cache_save", "parameters": [ { "description": "cache name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/cache_config" } } }, "description": "Partial cache configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/cache_config" } } }, "description": "Updated cache" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "summary": "Save cache", "tags": [ "cache" ] }, "delete": { "description": "Delete the cache by its name", "operationId": "cache_delete", "parameters": [ { "description": "cache name", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "summary": "Delete the cache", "tags": [ "cache" ] } }, "/dvrs": { "get": { "operationId": "dvrs_list", "summary": "List DVR configurations", "description": "This method allows to get the whole list of global DVR congifurations.", "parameters": [ { "name": "Accept", "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n", "in": "header", "schema": { "type": "string" } }, { "name": "format", "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.", "in": "query", "required": false, "schema": { "type": "string", "oneOf": [ { "title": "Openmetrics", "const": "openmetrics", "description": "The openmetrics-text content format will be used in response." } ], "example": "openmetrics" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvrs_list" } }, "application/openmetrics-text": { "schema": { "type": "string", "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n" }, "examples": { "default": { "summary": "General example", "description": "The example describes the rule how the response string forms.", "value": "metric{label=\"value\"} VALUE" }, "usage_per_disk": { "value": "storage_usage{disk=\"d1\",dvr_name=\"raid\",server_id=\"6617d8c7-0044-4af7-81ec-48c29d4a4b62\"} 60" }, "usage_per_storage": { "value": "storage_usage{dvr_name=\"raid\",server_id=\"6617d8c7-0044-4af7-81ec-48c29d4a4b62\"} 54" } } } }, "description": "Response" } }, "tags": [ "dvr" ] } }, "/dvrs/{name}": { "get": { "operationId": "dvr_get", "summary": "Get DVR configuration", "description": "This method allows to get a single global DVR configuration.", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_config" } } }, "description": "A single global DVR configuration." } }, "tags": [ "dvr" ] }, "put": { "operationId": "dvr_save", "summary": "Save DVR configuration", "description": "Create or update a single global DVR configuration. \nIf you pass only a partial DVR configuration, only the passed fields will be updated, not the whole configuration.\n", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_config" } } }, "description": "Partial DVR configuration." }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_config" } } }, "description": "Updated DVR configuration." }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "dvr" ] }, "delete": { "operationId": "dvr_delete", "summary": "Delete DVR configuration", "description": "Delete a single global DVR configuration by its name.", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "The DVR configuration is deleted." } }, "tags": [ "dvr" ] } }, "/dvrs/{name}/disks": { "get": { "operationId": "dvr_disks_list", "summary": "List the DVR disks", "description": "This method allows to get the whole list of disks for a DVR configuration with RAID enabled. \nLearn more in [Flussonic RAID for DVR](https://flussonic.com/doc/extend-video-storage-on-fly/). \n", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_disks_list" } } }, "description": "Response" } }, "tags": [ "dvr" ] } }, "/dvrs/{name}/disks/{path}": { "get": { "operationId": "dvr_disk_get", "summary": "Get the DVR disk", "description": "This method allows to get a single DVR disk for a DVR configuration with RAID enabled.", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "The path to a mounted disk. \n", "in": "path", "name": "path", "required": true, "schema": { "example": "volume1", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/raid_disk_config" } } }, "description": "The configuration of the DVR disk." } }, "tags": [ "dvr" ] }, "put": { "operationId": "dvr_disk_save", "summary": "Save the DVR disk", "description": "Create or update a DVR disk. \nIf you pass only a partial DVR disk configuration, only the passed fields will be updated, not the whole disk configuration.\n", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "The path to a mounted disk. \n", "in": "path", "name": "path", "required": true, "schema": { "example": "volume4", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/raid_disk_config" } } }, "description": "Partial DVR disk configuration." }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/raid_disk_config" } } }, "description": "Updated dvr disk" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "dvr" ] }, "delete": { "operationId": "dvr_disk_delete", "summary": "Delete the DVR disk", "description": "Delete the DVR disk by its path.", "parameters": [ { "description": "DVR configuration name.", "in": "path", "name": "name", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" }, { "description": "The path to a mounted disk. \n", "in": "path", "name": "path", "required": true, "schema": { "example": "volume4", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "The DVR disk is deleted." } }, "tags": [ "dvr" ] } }, "/dvr_export_jobs": { "get": { "operationId": "dvr_export_job_list", "description": "List DVR export jobs", "summary": "List DVR background jobs", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_export_job_list" } } }, "description": "List of jobs" } }, "tags": [ "stream-dvr" ] } }, "/dvr_export_jobs/{id}": { "parameters": [ { "name": "id", "description": "The job ID.", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", "example": "3c448252-2516-4950-a1f6-fa2c7e8f4cb1", "x-format-description": "uuid" } } ], "put": { "operationId": "dvr_export_job_start", "description": "Start a new DVR export job", "summary": "Start a job", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_export_job" } } }, "description": "Job request: source stream, time range, output path\n" }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_export_job" } } }, "description": "Job has been created" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } }, "409": { "description": "There is already a job with this id", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } }, "423": { "description": "There is already a job exporting to this file", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "stream-dvr" ] }, "get": { "operationId": "dvr_export_job_status", "description": "Get the status of the DVR export job", "summary": "Get the job status", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/dvr_export_job" } } }, "description": "Job status" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "stream-dvr" ] }, "delete": { "operationId": "dvr_export_job_cancel", "description": "Cancel the DVR export job.", "summary": "Cancel the job", "responses": { "204": { "description": "Deleted" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "stream-dvr" ] } }, "/cluster/peers": { "get": { "description": "Fetch all peers", "operationId": "peers_list", "summary": "List peers", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/peers_list" } } }, "description": "Response" } }, "tags": [ "cluster" ] } }, "/cluster/peers/{hostname}": { "get": { "description": "Method allows to fetch single peer", "operationId": "peer_get", "summary": "Get the peer", "parameters": [ { "description": "peer name", "in": "path", "name": "hostname", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/peer_config" } } }, "description": "Whole peer" } }, "tags": [ "cluster" ] }, "put": { "description": "Create or update peer", "operationId": "peer_save", "summary": "Save the peer", "parameters": [ { "description": "peer name", "in": "path", "name": "hostname", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/peer_config" } } }, "description": "Partial peer configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/peer_config" } } }, "description": "Updated peer" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "cluster" ] }, "delete": { "description": "Delete the peer by its name", "operationId": "peer_delete", "summary": "Delete the peer", "parameters": [ { "description": "peer name", "in": "path", "name": "hostname", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "cluster" ] } }, "/cluster/sources": { "get": { "description": "Fetch all sources", "operationId": "sources_list", "summary": "List sources", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/sources_list" } } }, "description": "Response" } }, "tags": [ "cluster" ] } }, "/cluster/sources/{url}": { "get": { "description": "Method allows to fetch single source", "operationId": "source_get", "summary": "Get the source", "parameters": [ { "description": "source name", "in": "path", "name": "url", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/source_config" } } }, "description": "Whole source" } }, "tags": [ "cluster" ] }, "put": { "description": "Create or update source", "operationId": "source_save", "summary": "Save the source", "parameters": [ { "description": "source name", "in": "path", "name": "url", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/source_config" } } }, "description": "Partial source configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/source_config" } } }, "description": "Updated source" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "cluster" ] }, "delete": { "description": "Delete the source by its name", "operationId": "source_delete", "summary": "Delete the source", "parameters": [ { "description": "source name", "in": "path", "name": "url", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "cluster" ] } }, "/logos": { "get": { "operationId": "logos_list", "summary": "List logos", "description": "List logo files", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/logos_list" } } }, "description": "Response" } }, "tags": [ "logo" ] } }, "/logos/{name}": { "parameters": [ { "name": "name", "in": "path", "required": true, "description": "logo path name", "schema": { "example": "file.png", "type": "string" }, "style": "simple" } ], "get": { "operationId": "logo_get", "summary": "Get the logo", "description": "Method allows to fetch single logo file", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/logo_file" } } }, "description": "Whole logo" } }, "tags": [ "logo" ] }, "put": { "operationId": "logo_save", "summary": "Upload the logo", "description": "Upload logo file", "requestBody": { "description": "Uploaded logo", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/logo_file" } } } }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/logo_file" } } }, "description": "Uploaded logo file" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "logo" ] }, "delete": { "operationId": "logo_delete", "summary": "Delete the logo file", "description": "Delete the logo by its path", "responses": { "204": { "description": "Deleted" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "logo" ] } }, "/vods": { "get": { "operationId": "vods_list", "summary": "List VOD locations", "description": "This method allows to get the list of all VOD locations configured in Flussonic.\nVOD location is a virtual filepath used to place files for VOD (Video on Demand) broadcasting.\n", "externalDocs": { "description": "Find more information here", "url": "https://flussonic.com/doc/launch-online-vod-theatre/" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vods_list" } } }, "description": "Response" } }, "tags": [ "vod" ] } }, "/vods/opened_files": { "get": { "operationId": "opened_files_list", "summary": "List files in VOD locations which are played by the clients", "description": "This method allows to get the list of files in VOD locations which are played by the clients.", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/disk_files_list" } } }, "description": "List of files in the VOD storage" } }, "parameters": [ { "name": "prefix", "in": "query", "required": false, "description": "The unique name of VOD location. \nIt is used as a prefix for displaying opened VOD files in this location.\n", "schema": { "example": "vod", "type": "string" }, "style": "form" }, { "name": "storage_index", "in": "query", "required": false, "description": "Index of the storage in the VOD location.\nIt is used as a storage_index for displaying opened VOD files in this storage.\n", "schema": { "example": 0, "type": "integer" }, "style": "form" }, { "name": "sort", "description": "Composite sort direction.\nDefault sort order is `name`.\n", "explode": false, "in": "query", "required": false, "schema": { "example": "-stats.bytes_out", "type": "string" }, "style": "form" }, { "name": "limit", "description": "Limit select count in collection to N elements. Default value is 100.", "explode": false, "in": "query", "required": false, "schema": { "type": "integer", "example": 100 }, "style": "form" }, { "name": "cursor", "description": "A properly encoded equivalent of offset allowing you to read the next bunch of items. \nWe do not offer common `offset` fields, so please use cursor for predictable\nfetching of quickly changing list of items. Learn more in [Flussonic API design principles](https://flussonic.com/doc/rest-api-guidelines/#api-http-collections-cursor).\n", "in": "query", "required": false, "schema": { "type": "string", "example": "JTI0cG9zaXRpb25fZ3Q9MQ==" } } ], "tags": [ "vod" ] } }, "/vods/{prefix}": { "get": { "operationId": "vod_get", "summary": "Get VOD location", "description": "This method allows to get a single VOD location.", "parameters": [ { "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "name": "prefix", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vod_config" } } }, "description": "Whole VOD location configuration" } }, "tags": [ "vod" ] }, "put": { "operationId": "vod_save", "summary": "Save VOD location", "description": "Create or update a single VOD location.\nIf you pass only a partial VOD location configuration, only the passed fields will be updated, not the whole configuration.\n", "parameters": [ { "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "name": "prefix", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vod_config" } } }, "description": "Partial VOD location configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vod_config" } } }, "description": "Updated VOD location configuration" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vod" ] }, "delete": { "operationId": "vod_delete", "summary": "Delete VOD location", "description": "Delete a single VOD location by its prefix", "parameters": [ { "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "name": "prefix", "required": true, "schema": { "example": "abc", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "vod" ] } }, "/vods/{prefix}/storages/{storage_index}/files": { "get": { "operationId": "disk_files_list", "summary": "List files in a VOD location", "description": "This method allows to get the list of all files and folders for a specific storage subpath in a VOD location.", "parameters": [ { "name": "prefix", "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "required": true, "schema": { "example": "vod", "type": "string" } }, { "name": "storage_index", "in": "path", "description": "The index of the storage in the VOD location.", "required": true, "schema": { "example": 0, "type": "integer" } }, { "name": "folder", "in": "query", "description": "The folder in the storage to filter the results by.", "required": false, "schema": { "example": "abc", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/disk_files_list" } } }, "description": "List of files in the VOD storage" } }, "tags": [ "vod" ] } }, "/vods/{prefix}/storages/{storage_index}/files/{subpath}": { "get": { "operationId": "disk_file_get", "summary": "Get a single VOD file", "description": "This method allows to get a single VOD file.", "parameters": [ { "name": "prefix", "in": "path", "required": true, "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "schema": { "example": "vod", "type": "string" }, "style": "simple" }, { "name": "storage_index", "in": "path", "required": true, "description": "Index of the storage in the VOD location.", "schema": { "example": 0, "type": "integer" }, "style": "simple" }, { "name": "subpath", "in": "path", "description": "Subpath to the file in the storage including filename.", "required": true, "schema": { "example": "bunny.mp4", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/disk_file" } } }, "description": "Whole VOD file configuration." } }, "tags": [ "vod" ] }, "put": { "operationId": "disk_file_save", "summary": "Save a VOD file", "description": "Upload a file to the VOD location.", "parameters": [ { "name": "prefix", "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "required": true, "schema": { "example": "vod", "type": "string" }, "style": "simple" }, { "name": "storage_index", "description": "Index of the storage in the VOD location.", "in": "path", "required": true, "schema": { "example": 0, "type": "integer" }, "style": "simple", "explode": false }, { "name": "subpath", "description": "Subpath to the file in the storage including filename.", "in": "path", "required": true, "schema": { "example": "bunny.mp4", "type": "string" }, "style": "simple" } ], "requestBody": { "description": "Streaming VOD file payload.", "content": { "*/*": { "schema": { "type": "string", "format": "binary", "x-format-description": "binary" } } } }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/disk_file" } } }, "description": "Uploaded VOD file." }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vod" ] }, "delete": { "operationId": "disk_file_delete", "summary": "Delete a VOD file", "description": "Delete a VOD file by its name.", "parameters": [ { "name": "prefix", "description": "The unique name of VOD location. \nIt is used as a prefix for playing VOD files in this location.\n", "in": "path", "required": true, "schema": { "example": "vod", "type": "string" }, "style": "simple" }, { "name": "storage_index", "description": "Index of the storage in the VOD location.", "in": "path", "required": true, "schema": { "example": 0, "type": "integer" }, "explode": false, "style": "simple" }, { "name": "subpath", "description": "Subpath to the file in the storage including filename.", "in": "path", "required": true, "schema": { "example": "bunny.mp4", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "vod" ] } }, "/config": { "get": { "operationId": "config_get", "summary": "Get server config", "description": "Method allows to fetch global server configuration and current runtime status.\n", "parameters": [ { "name": "Accept", "description": "Ask for `text/plain` or 'application/openmetrics-text' to get response with appropriate format.\nBy default it will be `application/json`.\n", "in": "header", "schema": { "type": "string" } }, { "name": "full", "description": "Whether to return full configuration.", "in": "query", "schema": { "type": "boolean", "default": false } }, { "name": "format", "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.", "in": "query", "required": false, "schema": { "type": "string", "oneOf": [ { "title": "Openmetrics", "const": "openmetrics", "description": "The openmetrics-text content format will be used in response." } ], "example": "openmetrics" } } ], "responses": { "200": { "description": "server config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_config" } }, "text/plain": { "schema": { "type": "string" } }, "application/openmetrics-text": { "schema": { "type": "string", "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n", "examples": { "default": { "summary": "General example", "description": "The example describes the rule how the response string forms.", "value": "metric{label=\"value\"} VALUE" }, "online streams": { "value": "server_online_streams{server_id=\"123e4567-e89b-12d3-a456-426614174000\"} 420" }, "usage": { "value": "partition_usage{server_id=\"123e4567-e89b-12d3-a456-426614174000\",disk=\"some_disk_path\"} 10" } } } } } }, "400": { "description": "Invalid config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/config_error_status" } } } } }, "tags": [ "config" ] }, "put": { "operationId": "config_save", "summary": "Save server config", "description": "Create or update global server configuration.\n", "requestBody": { "description": "Partial or full server configuration", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_config" } }, "text/plain": { "schema": { "type": "string" } } } }, "responses": { "200": { "description": "Updated config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_config" } } } }, "400": { "description": "Invalid config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/config_error_status" } } } } }, "tags": [ "config" ] }, "post": { "operationId": "config_validate", "summary": "Validate config", "description": "Just parse and validate config, nothing is saved.\n\nProvide JSON structure or plain text.\n\nTake a look at this example:\n```\ncurl -d 'http 80; stream mystream { input \"\"; }' \\\n -H 'Content-Type: text/plain' \\\n -sS http://login:pass@localhost:8080/streamer/api/v3/config | jq\n{\n \"col\": 34,\n \"config\": {\n \"http\": [\n \"80\"\n ],\n \"streams\": [\n {\n \"inputs\": [\n {\n \"url\": \"\"\n }\n ],\n \"name\": \"mystream\"\n }\n ]\n },\n \"detail\": \"\",\n \"error\": \"bad_url\",\n \"line\": 1,\n \"path\": [\n \"streams\",\n 0,\n \"inputs\",\n 0,\n \"url\",\n \"input_url\"\n ]\n}\n```\n\nYou can see that it is possible to fix error on column 34 where bad, empty url was saved.\n", "requestBody": { "description": "Partial or full server configuration", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_config" } }, "text/plain": { "schema": { "type": "string" }, "example": "http 80;\n\nstream mystream {\n input udp://239.0.0.1:1234;\n transcoder vb=2048k ab=64k;\n}\n" } } }, "responses": { "200": { "description": "Updated config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_config" } } } }, "400": { "description": "Invalid config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/config_error_status" } } } } }, "tags": [ "config" ] } }, "/config/stats": { "get": { "operationId": "config_stats_get", "summary": "Get server stats", "description": "Method allows to fetch current runtime status.\n", "responses": { "200": { "description": "server stats", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_stats" } } } } }, "tags": [ "config" ] } }, "/api_tokens": { "get": { "operationId": "api_tokens_list", "summary": "List API tokens", "description": "Method allows to fetch configured API tokens\n", "responses": { "200": { "description": "API tokens", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/api_tokens_list" } } } } }, "tags": [ "config" ] } }, "/monitoring/liveness": { "get": { "operationId": "liveness_probe", "summary": "Liveness probe", "description": "K8s liveness probe.\n", "responses": { "200": { "description": "Means that server process has started, but doesn't know anything about\nits readiness. Check readiness to validate that server can accept requests.\n", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_stats_whoami" } } } } }, "tags": [ "monitoring" ] } }, "/monitoring/readiness": { "get": { "operationId": "readiness_probe", "summary": "Readiness probe", "description": "K8s readiness probe.\n", "responses": { "200": { "description": "Means that server process is ready to work. All disks are mounted,\nDVR storages opened, etc.\n\nReady for work.\n", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/server_stats_whoami" } } } } }, "tags": [ "monitoring" ] } }, "/iptv": { "get": { "operationId": "iptv_get", "summary": "IPTV status", "description": "Get current status of the trivial IPTV subscriber management system.\n", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/iptv_config" } } }, "description": "Returns iptv config" }, "404": { "description": "IPTV plugin is not configured", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "iptv" ] }, "put": { "operationId": "iptv_save", "summary": "Save IPTV", "description": "Enable or reload IPTV plugin configuration and disk state\n", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/iptv_config" } } }, "description": "iptv configuration" }, "responses": { "200": { "description": "Updated iptv config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/iptv_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "iptv" ] }, "delete": { "operationId": "iptv_delete", "summary": "Disable IPTV", "description": "Disable trivial IPTV plugin, remove it from the config and stop runtime status.\n", "responses": { "204": { "description": "Deleted iptv config" } }, "tags": [ "iptv" ] } }, "/iptv/packages": { "get": { "operationId": "packages_list", "summary": "List all packages", "description": "List existing packages. Take a look at operation `package_get` for detailed description\nof package concept.\n", "parameters": [ { "description": "Comma-separated list of fields (including nested) that will be returned", "explode": false, "in": "query", "name": "select", "required": false, "schema": { "example": "name,inputs,stats", "type": "string" }, "style": "form" }, { "description": "Composite sort direction", "explode": false, "in": "query", "name": "sort", "required": false, "schema": { "example": "-stats.bitrate,name,position", "type": "string" }, "style": "form" }, { "description": "Limit select count in collection to N elements", "explode": false, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" }, "style": "form" }, { "description": "Properly encoded analog of offset, allowing to read next bunch of items", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/packages_list" } } }, "description": "Response" } }, "tags": [ "iptv" ] } }, "/iptv/packages/{name}": { "get": { "operationId": "package_get", "summary": "Get the package", "description": "Package is a group of streams (channels), that are provided together\nto customer as a single billing item.\n", "parameters": [ { "name": "name", "description": "package name", "in": "path", "required": true, "schema": { "example": "sports", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/package_config" } } }, "description": "Whole package" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "iptv" ] }, "put": { "operationId": "package_save", "summary": "Save the package", "description": "Create or update the package.\n\nPartial configuration can be provided.\n", "parameters": [ { "name": "name", "description": "package name", "in": "path", "required": true, "schema": { "example": "sports", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/package_config" } } }, "description": "Partial package configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/package_config" } } }, "description": "Updated package" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "iptv" ] }, "delete": { "operationId": "package_delete", "summary": "Delete the package", "description": "Delete this package with all links to streams and all links to subscribers.\n", "parameters": [ { "name": "name", "description": "package name", "in": "path", "required": true, "schema": { "example": "sports", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "iptv" ] } }, "/iptv/subscribers": { "get": { "operationId": "subscribers_list", "summary": "List all subscribers", "description": "List existing subscribers from database", "parameters": [ { "description": "Comma-separated list of fields (including nested) that will be returned", "explode": false, "in": "query", "name": "select", "required": false, "schema": { "example": "name,inputs,stats", "type": "string" }, "style": "form" }, { "description": "Composite sort direction", "explode": false, "in": "query", "name": "sort", "required": false, "schema": { "example": "-stats.bitrate,name,position", "type": "string" }, "style": "form" }, { "description": "Limit select count in collection to N elements", "explode": false, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" }, "style": "form" }, { "description": "Properly encoded analog of offset, allowing to read next bunch of items", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/subscribers_list" } } }, "description": "Response" } }, "tags": [ "iptv" ] } }, "/iptv/subscribers/{name}": { "get": { "operationId": "subscriber_get", "summary": "Get one subscriber", "description": "Get the subscriber status.\n", "parameters": [ { "name": "name", "description": "subscriber name", "in": "path", "required": true, "schema": { "example": "client01", "type": "string" }, "style": "simple" } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/subscriber_config" } } }, "description": "Whole subscriber" } }, "tags": [ "iptv" ] }, "put": { "operationId": "subscriber_save", "summary": "Save the subscriber", "description": "Create or update the subscriber, identified by his unique name.\nPartial configuration is ok.\n", "parameters": [ { "name": "name", "description": "subscriber name", "in": "path", "required": true, "schema": { "example": "client01", "type": "string" }, "style": "simple" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/subscriber_config" } } }, "description": "Partial subscriber configuration" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/subscriber_config" } } }, "description": "Updated subscriber" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "iptv" ] }, "delete": { "operationId": "subscriber_delete", "summary": "Delete the subscriber", "description": "Delete the subscriber from database.\nIf he is watching video, all his sessions will be terminated soon.\n", "parameters": [ { "name": "name", "description": "subscriber name", "in": "path", "required": true, "schema": { "example": "client01", "type": "string" }, "style": "simple" } ], "responses": { "204": { "description": "Deleted" } }, "tags": [ "iptv" ] } }, "/http_proxies/{prefix}": { "parameters": [ { "name": "prefix", "in": "path", "required": true, "description": "HTTP proxy prefix", "schema": { "example": "abc", "type": "string", "format": "media_name", "x-format-description": "media_name" }, "style": "simple" } ], "get": { "operationId": "http_proxy_get", "description": "Get http_proxy configuration.", "summary": "Get http_proxy", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/http_proxy_config" } } }, "description": "Returns http_proxy config" } }, "tags": [ "config" ] }, "put": { "operationId": "http_proxy_save", "description": "Update http_proxy configuration.", "summary": "Save http_proxy", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/http_proxy_config" } } } }, "responses": { "200": { "description": "Updated http_proxy config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/http_proxy_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "config" ] }, "delete": { "operationId": "http_proxy_delete", "description": "Delete http_proxy configuration.", "summary": "Delete http_proxy", "responses": { "204": { "description": "Deleted http_proxy config" } }, "tags": [ "config" ] } }, "/http_proxies": { "get": { "operationId": "http_proxies_list", "summary": "List http proxy configuration", "description": "This method allows to get the whole list of http proxy congifurations.", "parameters": [ { "name": "Accept", "description": "Ask for 'application/openmetrics-text' to get response with openmetrics-text content.\nAsk for 'text/plain' to get response with text content; applicable only for text view of Prometheus openmetrics and can be used only with appropriate 'format' option.\nBy default it will be `application/json`.\n", "in": "header", "schema": { "type": "string" } }, { "name": "format", "description": "This parameter is used instead of the Accept header to select of non-JSON response content format.", "in": "query", "required": false, "schema": { "type": "string", "oneOf": [ { "title": "Openmetrics", "const": "openmetrics", "description": "The openmetrics-text content format will be used in response." } ], "example": "openmetrics" } } ], "responses": { "200": { "description": "Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/http_proxies_list" } }, "application/openmetrics-text": { "schema": { "type": "string", "description": "Responses content format used for Prometheus application.\nAdditional information about it can be found at:\n- https://github.com/Prometheus/docs/blob/main/content/docs/instrumenting/exposition_formats.md#openmetrics-text-format\n- https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md\n" }, "examples": { "default": { "summary": "General example", "description": "The example describes the rule how the response string forms.", "value": "metric{label=\"value\"} VALUE" } } }, "text/plain": { "schema": { "type": "string", "description": "Responses content format used for receiving openmetrics for Prometheus application as a text." } } } } }, "tags": [ "config" ] } }, "/vsaas": { "get": { "operationId": "vsaas_get", "description": "Get Watcher configuration.", "summary": "Get vsaas", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vsaas_config" } } }, "description": "Returns vsaas config" } }, "tags": [ "vsaas" ] }, "put": { "operationId": "vsaas_save", "description": "Update Watcher configuration.", "summary": "Save vsaas", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vsaas_config" } } } }, "responses": { "200": { "description": "Updated vsaas config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vsaas_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vsaas" ] }, "delete": { "operationId": "vsaas_delete", "description": "Delete Watcher configuration.", "summary": "Delete vsaas", "responses": { "204": { "description": "Deleted vsaas config" } }, "tags": [ "vsaas" ] } }, "/rproxy": { "get": { "operationId": "rproxy_get", "description": "Get rproxy configuration.", "summary": "Get rproxy", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/rproxy_config" } } }, "description": "Returns rproxy config" } }, "tags": [ "vsaas" ] }, "put": { "operationId": "rproxy_save", "description": "Update rproxy configuration.", "summary": "Save rproxy", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/rproxy_config" } } } }, "responses": { "200": { "description": "Updated rproxy config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/rproxy_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vsaas" ] }, "delete": { "operationId": "rproxy_delete", "description": "Delete rproxy configuration.", "summary": "Delete rproxy", "responses": { "204": { "description": "Deleted rproxy config" } }, "tags": [ "vsaas" ] } }, "/rproxy/agents": { "get": { "operationId": "rproxy_agents_list", "summary": "List connected streampoint agents", "description": "Return a list of agents currently connected to the streampoint\n", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/watcher_agents_list" } } }, "description": "A list of agents currently connected to the streampoint" } }, "tags": [ "vsaas" ] } }, "/camera_alarm": { "get": { "operationId": "camera_alarm_get", "description": "Get the configuration of the `camera_alarm` plugin.", "summary": "Get camera alarm", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/camera_alarm_config" } } }, "description": "Returns camera_alarm config" } }, "tags": [ "vsaas" ] }, "put": { "operationId": "camera_alarm_save", "description": "Update the configuration of the `camera_alarm` plugin.", "summary": "Save camera alarm", "responses": { "200": { "description": "Updated camera_alarm config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/camera_alarm_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vsaas" ] }, "delete": { "operationId": "camera_alarm_delete", "description": "Delete the configuration of the `camera_alarm` plugin.", "summary": "Delete camera alarm", "responses": { "204": { "description": "Deleted camera_alarm config" } }, "tags": [ "vsaas" ] } }, "/vision": { "get": { "operationId": "vision_get", "description": "Get the video analytics configuration.", "summary": "Get vision", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vision_config" } } }, "description": "Returns vision config" } }, "tags": [ "vsaas" ] }, "put": { "operationId": "vision_save", "description": "Save the video analytics configuration.", "summary": "Save vision", "responses": { "200": { "description": "Updated vision config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/vision_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "vsaas" ] }, "delete": { "operationId": "vision_delete", "description": "Delete the video analytics configuration.", "summary": "Delete vision", "responses": { "204": { "description": "Deleted vision config" } }, "tags": [ "vsaas" ] } }, "/file_processor": { "get": { "operationId": "file_processor_get", "description": "Get the file processor config", "summary": "Get the file processor config", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_config" } } }, "description": "Returns file_processor config" }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "File processor is not configured" } }, "tags": [ "file_processor" ] }, "put": { "operationId": "file_processor_save", "description": "Update the file processor config", "summary": "Save the file processor", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_config" } } }, "description": "file_processor config" }, "responses": { "200": { "description": "Updated file_processor config", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_config" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } }, "description": "Couldn't save" } }, "tags": [ "file_processor" ] }, "delete": { "operationId": "file_processor_delete", "description": "Delete the file processor config", "summary": "Delete the file processor", "responses": { "204": { "description": "Deleted file_processor config" } }, "tags": [ "file_processor" ] } }, "/file_processor/jobs": { "post": { "operationId": "file_processor_job_start", "description": "Start the file processor job.", "summary": "Start file_processor job", "parameters": [ { "name": "Idempotency-Key", "in": "header", "description": "An idempotency key is a unique value generated by the client which\nthe server uses to recognize subsequent retries of the same request.\n", "required": false, "schema": { "type": "string", "format": "uuid", "x-format-description": "uuid" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_job" } } }, "description": "Job request: input files, output file, filters\n" }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_job" } } }, "description": "Response containing job's Id" }, "400": { "description": "Cannot start requested job", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "file_processor" ] } }, "/file_processor/jobs/{id}": { "parameters": [ { "name": "id", "description": "The job ID.", "in": "path", "required": true, "schema": { "type": "string" } } ], "get": { "operationId": "file_processor_job_check", "description": "Get the status of the file processor job.", "summary": "Get the job status", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/file_processor_job" } } }, "description": "Job status" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "file_processor" ] }, "delete": { "operationId": "file_processor_job_delete", "description": "Cancel the file processor job.", "summary": "Cancel the job", "responses": { "204": { "description": "Deleted" }, "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error_response" } } } } }, "tags": [ "file_processor" ] } } }, "security": [ { "basicAuth": [] }, { "bearerAuth": [] } ], "servers": [ { "description": "your local installation", "url": "http://localhost:8080/streamer/api/v3" } ], "tags": [ { "name": "stream", "description": "Managing streams in Flussonic." }, { "name": "stream-dvr", "description": "Managing DVR archives for streams." }, { "name": "stream-ops", "description": "Stream operations in runtime" }, { "name": "episode" }, { "name": "template", "description": "Managing templates in Flussonic. A template defines a set of settings to be applied to several streams to provide a more organized and manageable way of configuring streams." }, { "name": "dvr", "description": "Managing global DVR configurations in Flussonic." }, { "name": "auth", "description": "Managing authorization backends." }, { "name": "session", "description": "Managing play sessions in Flussonic." }, { "name": "events", "description": "Managing event sinks and events in Flussonic." }, { "name": "monitoring", "description": "Probes for cluster monitoring" }, { "name": "cache" }, { "name": "cluster", "description": "Managing cluster and peers in Flussonic." }, { "name": "vod" }, { "name": "logo", "description": "Managing logos in Flussonic." }, { "name": "multiplexer" }, { "name": "dvb", "description": "Managing DVB cards in Flussonic." }, { "name": "vsaas" }, { "name": "config" }, { "name": "iptv", "description": "Manage trivial middleware with user management and channel permissions.\nUse players like Kodi to get access to per-user playlists.\n\nIt is very trivial, just for very trivial operations like giving someone a static\ntoken for accessing content.\n\nDatabase is a static JSON file on disk that is overwritten on each update.\n" }, { "name": "file_processor" } ] }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.04 |
proxy
|
phpinfo
|
Settings