Flics Ingest [VCon OG]
RecorderFlicsIngest controls recordings on a FLICS cluster using the FLICS API. The RecorderFlicsIngest is mainly used to ingest live stream sources.
As the configuration of the sources and recording templates is done in the FLICS cluster the system is very flexible.
Setup
The installation of a RecorderFlicsIngest is done by a dynamic playbook. Below is an example (91_vpms3.recorderflicsingest.v2.yaml from the project-colus repository):
recorderflicsingest:
playbook:
name: RecorderFlicsIngest
abbreviation: flics
default:
endpoints:
http:
fqdn: "{{ (default_endpoint_scheme + lookup('prepared_config', 'kubernetesPublicEndpoint') + '/' if not lookup('prepared_config', 'kubernetesPublicEndpoint').endswith('/') else '' | string) | urlsplit('hostname') }}"
helm_chart:
install: true
chart_name: recorderflicsingest
chart_subpath:
chart_folder: VidiControl/Recorders/FlicsIngest
chart_category: VPMS
chart_namespace: "{{ server_config.system.name }}-vctl"
chart_instance_name: recorderflicsingest
chart_version: 25.1.266234-feature-238229flics
chart_values:
hull:
config:
general:
globalImageRegistryToFirstRegistrySecretServer: true
fullnameOverride: recorderflicsingest
data:
installation:
config:
customCaCertificates:
{% for key, value in vpms3.global.system.ssl.custom_ca_certs.items() %}
{{ key }}: "{{ (value | singleline) + '\n' }}"
{% endfor %}
specific:
ingress:
controllerClass: "{{ vpms3.global.system.ingress.controllerClass }}"
recorderflicsingest:
tag: "25.2.266234-feature-244cflicsrecorder"
devicesettings:
FlicsIngestUrl: http://13.56.223.50/
DefaultTemplateId: fa18fe20-2744-4d71-8d22-5b8d4e0a6a6f
DefaultSource: SRT
RecorderPassword: k0ZXTVeIQrL0DuXV7sYAj1d9hGMZLlZlYxDLo+J1nDBZ4AqxAQYAFJ+IHYLWLm9XiVLaqiGUctFyBI0lOUCJ1NaFrVKyte+3HklvOvrGRZLKe1XGY5tAUK6FjnmTdsIqlJg37LpRneJ7TMEgZRhTbVyqaZC/0yyxkyBWaEjqnvH5s9Wlcy5RQ2KoZAG104Et:hrlvN0HE4w36DX8nnRhJfg==
database:
host: "{{ hostvars['sql-server']['host'] }}"
port: "{{ hostvars['sql-server']['port'] | default(1433) }}"
user: "{{ hostvars['sql-server']['admin_user'] }}"
type: postgres
names:
recorderflicsingest: "{{ vpms3.global.system.name | regex_replace('-', '_') }}_vidicontrol_recorderflicsingest"
connectionstrings:
recorderflicsingest: "User ID = {{ hostvars['sql-server']['admin_user'] }};Server={{ hostvars['sql-server']['host'] }};Port={{ hostvars['sql-server']['port'] | default(1433) }};Database={{ vpms3.global.system.name | regex_replace('-', '_') }}_vidicontrol_recorderflicsingest;Pooling=true;"
objects:
registry:
vpms3:
server: "{{ vpms3.global.docker.registry.endpoint }}"
username: "{{ vpms3.global.docker.registry.user }}"
password: "{{ vpms3.global.docker.registry.pass }}"
The versions of the Helm chart and the Docker image must be updated to the currently used versions. Additionally, the device settings must be adapted, mainly the FlicsIngestUrl and the RecorderPassword.
For installing the recorder, the preferred installation method with the tag “flics” can be used, i.e.
./prepared.sh --log=vvv --tags=flics
Customize config after installation
Workflow
When a recording is started a VidiFlow workflow will be triggered.
This workflow must be created, named 'WF_FlicsIngestStartRecording' and have 'ItemId' and 'Clipname' as parameters (type string).
Workflow name and version can be changed via the VidiControl Configuration Tool.
The version of the workflow must correspond to the version listed in the event 'RecorderFlicsIngest.recordingStarted'.
The module executes a periodic status check of the FLICS cluster and, if necessary, sets the VidiControl device status to online or offline.
Capability
Source and Template are read from the FLICS cluster on module start. When available in the front end the input can be switched to the DynamicEnumValue entries Template and Source
Example:
"input": {
"Source": {
"defaultValue": null,
"externalDataIdentifier": "",
"hint": "[{\"Lang\":\"en_US\",\"Text\":\"The SRT Source\"},{\"Lang\":\"de_DE\",\"Text\":\"Die SRT Quelle\"}]",
"items": {
"item0": {
"default": true,
"label": "SRT1",
"value": "SRT1"
},
"item1": {
"default": false,
"label": "Zuspieler2",
"value": "Zuspieler2"
},
"item2": {
"default": false,
"label": "SRT",
"value": "SRT"
},
"item3": {
"default": false,
"label": "DJSRT",
"value": "DJSRT"
}
},
"label": "[{\"Lang\":\"en_US\",\"Text\":\"SRT Source\"},{\"Lang\":\"de_DE\",\"Text\":\"SRT Quelle\"}]",
"optional": null,
"type": "enum"
},
"Template": {
"defaultValue": null,
"externalDataIdentifier": "",
"hint": "[{\"Lang\":\"en_US\",\"Text\":\"The Target Template\"},{\"Lang\":\"de_DE\",\"Text\":\"Das Ziel Template\"}]",
"items": {
"item0": {
"default": true,
"label": "Live XDCAM GROWING",
"value": "586a2314-34f9-4d76-b268-d5873a611695"
},
"item1": {
"default": false,
"label": "Live XDCAM GROWING HISCALE",
"value": "ebecb908-f9a6-4f2c-9a77-92132e37dcfe"
},
"item2": {
"default": false,
"label": "Live XRDD25 GROWING",
"value": "f12a8bab-2b0f-41cf-9d71-90ee599c6848"
},
"item3": {
"default": false,
"label": "LiveSD Template",
"value": "fa18fe20-2744-4d71-8d22-5b8d4e0a6a6f"
},
"item4": {
"default": false,
"label": "RDD25 50p",
"value": "e3725ca1-b2ce-4c3e-82ad-1a2b9029cab2"
},
"item5": {
"default": false,
"label": "RDD25 Growing",
"value": "f63f598c-3517-4c63-add8-d3882df7f46f"
}
},
"label": "[{\"Lang\":\"en_US\",\"Text\":\"Target Template\"},{\"Lang\":\"de_DE\",\"Text\":\"Ziel Template\"}]",
"optional": null,
"type": "enum"
}
}
Configuration
Config value | Type | Comment |
|---|---|---|
VIDICONTROL_DATABASE_CONNECTION_STRING | string |
|
VIDICONTROL_DATABASE_PASSWORD | string |
|
VIDICONTROL_IDSALT | string | |
VIDICONTROL_SITEID | string | site id (alphanumeric) |
RECORDER_FLICS_INGEST_DATABASE_CONNECTION_STRING | string |
|
RECORDER_FLICS_INGEST_DATABASE_PASSWORD | string |
|
FlicsIngestUrl | string | (DeviceConfiguration:DeviceSettings) |
RecorderPassword | string | (DeviceConfiguration:DeviceSettings) |
DefaultTemplateId | string | (DeviceConfiguration:DeviceSettings) |
DefaultSourceUrl | string | (DeviceConfiguration:DeviceSettings) |
Config for VidiControl initialization (Device, Capabilities, Events)
values for Capabilities are partially generated by the FlicsIngestRecorder, values in DeviceConfiguration are system specific
"DeviceConfiguration": {
"DeviceName": "Recorder-FlicsIngest",
"Uri": "<http://localhost:8080>",
"DeviceSettings": "{\"FlicsIngestUrl\":\"<http://3.66.29.116/\>",\"DefaultTemplateId\":\"fa18fe20-2744-4d71-8d22-5b8d4e0a6a6f\",\"DefaultSource\":\"DJSRT\",\"RecorderPassword\":\"DLYuuXkpcIEGHLEVw31kvvprwmHHlISM1ZdWdxr6j0yWC76ZaIjw8JdkhLRxrtdC2W4YIAyFZfFVA3XNDXLdaRd4ixA4I1KQ19TG8ABVkno4DzH8qV4y8IcSJ3tDwBEbS7tJ2u9S+5H3ib/Tu3blS/i92q689ulh0OSDOlxhVzOA4iAK4erScSFvp7oZdjMr:WQ/1ZIFCp4TKsAVejxwN4A==\"}",
"CapabilityGroup": "RecorderFlicsIngestGroup"
},
"Capability": [
{
"Content": "{\"action\":\"Record\",\"events\":[\"RecorderFlicsIngest.recordingFailed\",\"RecorderFlicsIngest.recordingStarted\",\"RecorderFlicsIngest.recordingFinished\",\"RecorderFlicsIngest.recordingUpdateFailed\"],\"input\":{}}",
"NeedsStopCommand": true,
"CapabilityType": 0,
"DefaultConfig": "{\"blockingProvisioningTime\":10}"
}
],
"EventType": [
{
"Name": "RecorderFlicsIngest.recordingStarted",
"HandleCustomerSpecific": false,
"Description": "",
"Content": "[{\"action\":\"notifyClient\",\"input\":{\"TimeStamp\":\"{-{Placeholder_TimeStamp}-}\",\"ChunkId\":\"{-{Placeholder_ExternalChunkId}-}\",\"UpdateNeeded\":false,\"MessageType\":\"RecorderFlicsIngest.recordingStarted\",\"Emitter\":\"{-{Placeholder_Emitter}-}\",\"Severity\":\"Information\",\"Message\":[{\"Lang\":\"en_US\",\"Text\":\"Recording started.\"},{\"Lang\":\"de_DE\",\"Text\":\"Aufnahme gestartet.\"}]}},{\"action\":\"startWorkflow\",\"input\":{\"user\":\"{-{Placeholder_ActingUser}-}\",\"notificationData\":\"{\\\"Name\\\":\\\"WF_FlicsIngestStartRecording\\\",\\\"Version\\\":\\\"1.latest\\\",\\\"Data\\\":{\\\"Parameters\\\":[{\\\"Name\\\":\\\"Clipname\\\",\\\"Value\\\":\\\"{-{Placeholder_Clipname}-}\\\",\\\"Type\\\":\\\"string\\\"},{\\\"Name\\\":\\\"ItemId\\\",\\\"Value\\\":\\\"{-{Placeholder_VCItemId}-}\\\",\\\"Type\\\":\\\"string\\\"},{\\\"Name\\\":\\\"MediaDirector\\\",\\\"Value\\\":\\\"{-{Placeholder_MediaDirector}-}\\\",\\\"Type\\\":\\\"string\\\"}],\\\"Metadata\\\":null,\\\"Priority\\\":null}}\"}}]"
},
{
"Name": "RecorderFlicsIngest.recordingFinished",
"HandleCustomerSpecific": false,
"Description": "",
"Content": "[{\"action\":\"notifyClient\",\"input\":{\"TimeStamp\":\"{-{Placeholder_TimeStamp}-}\",\"ChunkId\":\"{-{Placeholder_ExternalChunkId}-}\",\"UpdateNeeded\":false,\"MessageType\":\"RecorderFlicsIngest.recordingFinished\",\"Emitter\":\"{-{Placeholder_Emitter}-}\",\"Severity\":\"Information\",\"Message\":[{\"Lang\":\"en_US\",\"Text\":\"Recording finished.\"},{\"Lang\":\"de_DE\",\"Text\":\"Aufnahme beendet.\"}]}}]"
},
{
"Name": "RecorderFlicsIngest.recordingFailed",
"HandleCustomerSpecific": false,
"Description": "",
"Content": "[{\"action\":\"notifyClient\",\"input\":{\"TimeStamp\":\"{-{Placeholder_TimeStamp}-}\",\"ChunkId\":\"{-{Placeholder_ExternalChunkId}-}\",\"UpdateNeeded\":false,\"MessageType\":\"RecorderFlicsIngest.recordingFailed\",\"Emitter\":\"{-{Placeholder_Emitter}-}\",\"Severity\":\"Error\",\"Message\":[{\"Lang\":\"en_US\",\"Text\":\"Recording failed.\"},{\"Lang\":\"de_DE\",\"Text\":\"Aufnahme gescheitert.\"}]}}]"
},
{
"Name": "RecorderFlicsIngest.recordingUpdateFailed",
"HandleCustomerSpecific": false,
"Description": "",
"Content": "[{\"action\":\"notifyClient\",\"input\":{\"TimeStamp\":\"{-{Placeholder_TimeStamp}-}\",\"ChunkId\":\"{-{Placeholder_ExternalChunkId}-}\",\"UpdateNeeded\":false,\"MessageType\":\"RecorderFlicsIngest.recordingUpdateFailed\",\"Emitter\":\"{-{Placeholder_Emitter}-}\",\"Severity\":\"Warning\",\"Message\":[{\"Lang\":\"en_US\",\"Text\":\"Recording update failed.\"},{\"Lang\":\"de_DE\",\"Text\":\"Update der Aufnahme fehlgeschlagen.\"}]}}]"
}
]
Device
Requires a ConnectionInfo with ServiceName and ServiceRoute, both are read from the FLICS cluster
{
"ServiceName": "flics.svc.2.local",
"ServiceRoute": "{470443f4-582e-43b3-874d-73fd538d420c}/{flics.svc.2.local}"
}
Capability
Requires a Content with an input parameters 'Source' and 'Template' which are read from the FLICS cluster. When supported by the front end 'DynamicEnumValue' entries shall be used
{
"action": "Record",
"events": [
"RecorderFlicsIngest.recordingFailed",
"RecorderFlicsIngest.recordingStarted",
"RecorderFlicsIngest.recordingFinished",
"RecorderFlicsIngest.recordingUpdateFailed"
],
"input": {
"Source": {
"defaultValue": null,
"externalDataIdentifier": "",
"hint": "[{\"Lang\":\"en_US\",\"Text\":\"The SRT Source\"},{\"Lang\":\"de_DE\",\"Text\":\"Die SRT Quelle\"}]",
"items": {
"item0": {
"default": true,
"label": "SRT1",
"value": "SRT1"
},
"item1": {
"default": false,
"label": "Zuspieler2",
"value": "Zuspieler2"
},
"item2": {
"default": false,
"label": "SRT",
"value": "SRT"
},
"item3": {
"default": false,
"label": "DJSRT",
"value": "DJSRT"
}
},
"label": "[{\"Lang\":\"en_US\",\"Text\":\"SRT Source\"},{\"Lang\":\"de_DE\",\"Text\":\"SRT Quelle\"}]",
"optional": null,
"type": "enum"
},
"Template": {
"defaultValue": null,
"externalDataIdentifier": "",
"hint": "[{\"Lang\":\"en_US\",\"Text\":\"The Target Template\"},{\"Lang\":\"de_DE\",\"Text\":\"Das Ziel Template\"}]",
"items": {
"item0": {
"default": true,
"label": "Live XDCAM GROWING",
"value": "586a2314-34f9-4d76-b268-d5873a611695"
},
"item1": {
"default": false,
"label": "Live XDCAM GROWING HISCALE",
"value": "ebecb908-f9a6-4f2c-9a77-92132e37dcfe"
},
"item2": {
"default": false,
"label": "Live XRDD25 GROWING",
"value": "f12a8bab-2b0f-41cf-9d71-90ee599c6848"
},
"item3": {
"default": false,
"label": "LiveSD Template",
"value": "fa18fe20-2744-4d71-8d22-5b8d4e0a6a6f"
},
"item4": {
"default": false,
"label": "RDD25 50p",
"value": "e3725ca1-b2ce-4c3e-82ad-1a2b9029cab2"
},
"item5": {
"default": false,
"label": "RDD25 Growing",
"value": "f63f598c-3517-4c63-add8-d3882df7f46f"
}
},
"label": "[{\"Lang\":\"en_US\",\"Text\":\"Target Template\"},{\"Lang\":\"de_DE\",\"Text\":\"Ziel Template\"}]",
"optional": null,
"type": "enum"
}
},
"output": {
},
"properties": {
}
}