mimoLive® - Gebruikershandleiding

Automatisering

Inhoudsopgave

Stroomlijn uw productie met de automatiseringslaag van mimoLive

U bekijkt momenteel inhoud van een plaatshouder van YouTube. Klik hieronder op de knop om de volledige inhoud te bekijken. Houd er rekening mee dat u op deze manier gegevens deelt met providers van derden.

Meer informatie

De mimoLive Automation Layer werd oorspronkelijk ontwikkeld als proof of concept, maar heeft sindsdien bewezen een ongelooflijk nuttig hulpmiddel te zijn voor gebruikers. Deze laag kan worden gebruikt om het in- en uitschakelen van lagen in een specifieke volgorde of op vooraf bepaalde tijden te automatiseren, informatie van de ene laag naar de andere te transporteren, te starten en te stoppen Uitvoer Bestemmingenen nog veel meer!

Het kan vooral handig zijn voor het maken van complexe producties met meerdere lagen en ingangen, omdat het handmatig schakelen en timen overbodig maakt. Met deze laag kunnen gebruikers zich richten op het maken van boeiende inhoud, terwijl de software de timing en opeenvolging van hun productie afhandelt. Nu, in versie 2 van deze laag, hebben we de commando's uitgebreid om automatisering in mimoLive naar een geheel nieuw niveau te brengen.

Voorbeeld: Automatiseringslaag

Automatisering

Automatiseringsscripts in mimoLive worden niet in realtime uitgevoerd

Houd er rekening mee dat de timing van automatiseringsscripts in mimoLive mogelijk niet nauwkeurig is vanwege de asynchrone aard van HTTP-verzoeken die door de video rendering engine worden opgeroepen. Deze scripts zijn afhankelijk van HTTP-verzoeken aan de API en de lengte van deze verzoeken kan niet nauwkeurig worden bepaald, wat resulteert in potentiële verschillen in timing. Houd hier rekening mee bij het gebruik van automatiseringsscripts in uw productieworkflow.

Voorwaarde

Om deze laag te laten werken moet je de HTTP Server in mimoLive om de afstandsbediening in te schakelen API. Ga naar mimoLive -> Voorkeuren -> Afstandsbediening: Vink de optie "Toegang op afstand toestaan" aan. (Momenteel werkt Automation layer in mimoLive alleen zonder wachtwoord)

6102d04e 4eb3 4600 b410 0d2b2aef0767

De automatiseringslaag instellen

Er zijn twee opties over hoe de laag zich moet gedragen na het live schakelen:

OptieGedrag
Laag automatisch uitschakelenVoor deze optie is slechts één script beschikbaar. Zodra dit script is verwerkt, schakelt de laag zichzelf uit. Deze optie kan worden gebruikt als een sequentie één keer moet worden uitgevoerd.
Laag handmatig uitschakelen (bijv. door operator)In dit geval zijn er drie scripts beschikbaar. Wanneer de laag live wordt geschakeld wordt het "On Live" script verwerkt. Zodra dit is gebeurd wordt het "While Live" script verwerkt in een eindeloze lus. Zodra de laag wordt uitgeschakeld wordt het "Turned Off" script verwerkt.
Als je een bepaalde fase niet nodig hebt, kun je het bijbehorende script leeg laten.

Broncode Opmerkingen

Om u te helpen de functie van uw script te onthouden, raden wij u aan gebruik te maken van commentaar in uw script:

// First sleep for 5 seconds...
sleep(5)

// ...then start the stopwatch layer:
layerOn("7C4665C4-0E17-4F63-BCFF-B59D68D75956")

Opmerkingen moeten op een aparte regel staan.

Scriptingopdrachten

De scripttaal is eigen en bevat verschillende opdrachten. Deze commando's staan in een spiekbriefje in het lagenvoorbeeld aan de rechterkant. Omdat de lijst misschien een beetje klein is om te lezen, kunt u het afdrukvoorbeeld uitbreiden met de knop boven en rechts van het afdrukvoorbeeldgebied.

layerOn()

Met dit commando kunt u een laag of een laagvariant inschakelen.

// switching on a layer by its id
layerOn("4E38A868-DCB5-4E9C-AC75-231764229BFA")

// switching on a layer variant by its id
layerOn("4E38A868-DCB5-4E9C-AC75-231764229BFA/variants/5F18C566-F59F-45B4-8D40-27EF289D47B1")

// switching on a layer by its long API Endpoint URL
layerOn("/api/v1/documents/863743527/layers/4E38A868-DCB5-4E9C-AC75-231764229BFA")

// switching on a layer with a defined variable
setVariable($myLayerID, "4E38A868-DCB5-4E9C-AC75-231764229BFA")
layerOn($myLayerID)

layerOff(<API Laag-ID als string Expressie>)

Met dit commando kunt u een laag of een laagvariant uitschakelen.

// switching off a layer by its id
layerOff("4E38A868-DCB5-4E9C-AC75-231764229BFA")

// switching off a layer variant by its id
layerOff("4E38A868-DCB5-4E9C-AC75-231764229BFA/variants/5F18C566-F59F-45B4-8D40-27EF289D47B1")

// switching off a layer by its long API Endpoint URL
layerOff("/api/v1/documents/863743527/layers/4E38A868-DCB5-4E9C-AC75-231764229BFA")

// switching off a layer with a defined variable
setVariable($myLayerID, "4E38A868-DCB5-4E9C-AC75-231764229BFA")
layerOff($myLayerID)

layerSetRecall(<API-laag ID als tekenreeks instellen Uitdrukking>)

Dit commando kan worden gebruikt om het terugroepen van een bepaalde Laag Set.

// recall a Layer Set by its id
layerSetRecall("E6950B7A-7457-44C5-81F7-972D9B04DBC3")

// recall a Layer Set by its long API Endpoint URL
layerSetRecall("/api/v1/documents/863743527/layer-sets/E6950B7A-7457-44C5-81F7-972D9B04DBC3")

// recall a Layer Set with a defined variable
setVariable($myLayerSetID, "E6950B7A-7457-44C5-81F7-972D9B04DBC3")
layerSetRecall($myLayerSetID)

outputOn(<API uitvoer Bestemming ID als string expressie>)

Gebruik dit commando om een uitvoerbestemming in te schakelen.

// een uitvoerbestemming starten met zijn id
outputOn("1953186E-4176-4849-A8ED-5B47EE1627BD")

// een uitvoerbestemming starten met zijn lange API Endpoint URL
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")

// een uitvoerbestemming starten met een gedefinieerde variabele
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOn($myOutputDestinationtID)

outputOff(<API uitvoer Bestemming ID als string expressie>)

Gebruik dit commando om een uitvoerbestemming uit te schakelen.

// een uitvoerbestemming stoppen met zijn id
outputOff("1953186E-4176-4849-A8ED-5B47EE1627BD")

// een uitvoerbestemming stoppen met zijn lange API Endpoint URL
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")

// een uitvoerbestemming met een gedefinieerde variabele stoppen
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOff($myOutputDestinationtID)

getLayerData($resultVariableName, , )

Deze opdracht combineert meerdere opdrachten in één scriptstap: Het leest de laaginformatie van de HTTP-server en slaat een specifiek gegevensveld uit de JSON-respons op in een variabele. U hebt het exacte pad nodig naar de waarde die u wilt lezen. Voor invoerparameters van lagen begint dit pad meestal met "data.attributes.input-values".

// set up useful variables
setVariable($myScoreboardLayerID, "36FA76B4-11FE-4879-8DE1-307222512712")
setVariable($pathToHomeScore, "data.attributes.input-values.tvGroup_Control__Score_Home")

// read the score for the home team from the Basketball layer
getLayerData($currentHomeScore, $myScoreboardLayerID, $pathToHomeScore)

// The variable $currentHomeScore now contains the Home Score input value of the Basketball Score layer

getObjectIDByName($resultVariableName, , )

Dit commando verkrijgt het API Endpoint voor een specifiek mimoLive object door zijn weergavenaam. Houd er rekening mee dat de weergavenaam gemakkelijk veranderd kan worden door de mimoLive operator in de mimoLive gebruikersinterface, wat op zijn beurt het automatiseringsscript zal breken als het het specifieke object niet meer kan vinden. Aan de andere kant kan dit commando gebruikt worden om API-eindpunten programmatisch te vinden, zonder dat het nodig is om de API-eindpunten hard te coderen in het script.

Geldige opties voor zijn: "bron", "laag", "laag-set", "uitvoer-bestemming".

// Get the API Endpoint for the Basketball Score layer
getObjectIDByName($myBasketballScoreLayerID, "layer", "My Basketball Score Keeper")

// switch this layer on
layerOn($myBasketballScoreLayerID)
Screenshot 2024 06 11 om 15.20.42

slaap(<seconden> als getal)

De opdracht sleep() onderbreekt de uitvoering van het script gedurende het opgegeven tijdsinterval, uitgedrukt in seconden.

// pause the script execution for 12 seconds
sleep(12)

// pause the script execution for 35.6 seconds
sleep(35.6)

// pause the script execution for a time interval specified by a variable
setVariable($mySleepInterval, 17)
sleep($mySleepInterval)

sleepUntil(<Tijd als tekenreeksuitdrukking>)

De opdracht sleepUntil() laat het script pauzeren totdat de opgegeven tijd is bereikt. Als de tijd al verstreken is, wacht het script tot de volgende dag. Het formaat voor de tijd is HH:MM of HH:MM:SS in een periode van 24 uur.

// sleep until 5:15pm
sleepUntil("17:15:00")

// sleep until 9:12am
sleepUntil("9:12")

// sleep until a time specified by a variable
setVariable($myWakeUpTime, "9:41")
sleepUntil($myWakeUpTime)

sleepOnTheMinute()

Dit scriptcommando pauzeert het script totdat de volgende 'op de minuut'-fractie van een uur is bereikt.

// go on every 20 minutes: on the hour, 20 and 40 minutes past the hour:
sleepOnTheMinute(20)

// go on "on the hour"
sleepOnTheMinute(60)

// go on every 10 minutes past the hour (specified by a variable)
setVariable($myWakeUpMinute, 10)
sleepOnTheMinute($myWakeUpMinute)

setVariabele($variableName, <waarde>)

Om een lokale variabele te definiëren, gebruikt u de setVariabele commando. U moet een variabelenaam opgeven (beginnend met een $) en de waarde die deze variabele moet bevatten. De waarde kan een getal, tekst (tussen aanhalingstekens) of de booleaanse waarden Echt en vals.

setVariable($myText, "This is a text")
setVariable($myNumber, 15.73)
setVariable($myBoolValue, false)

setGlobal($variableName, <waarde>)

Een globale variabele kan zowel in de huidige laag als in bovenliggende Automation lagen gebruikt worden. Deze functionaliteit is met name handig voor het delen van dezelfde informatie over meerdere Automatiseringslagen, zoals de API-eindpunten van een bepaalde laag. Voor de waarde van de variabele gelden dezelfde regels als voor de setVariabele commando.

Merk op dat globale variabelen toegankelijk zijn voor andere Automation-lagen zolang de oorspronkelijke laag live is. Hierdoor kunt u globale variabelen omschakelen door een andere laag met verschillende definities van globale variabelen te activeren. De beste werkwijze in dit scenario is om de optie "Laag uitschakelen" van de automatiseringslaag in te stellen op "Handmatig" en de globale variabelen in het script "Aan live" te definiëren.

setGlobal($myGlobalText, "This is a text")
setGlobal($myGlobalNumber, 15.73)
setGlobal($myGlobalBoolValue, false)

concat($resultVariableName, )

Dit scriptcommando voegt tekenreeksen samen en slaat het resultaat op als een tekenreeks.

// define some variables
setVariable($myVariableA, "This is")
setVariable($myVariableB, "text.")

// concatenate those variables and store the result into a new one
concat($myResultVariable, $myVariableA + " a " + $myVariableB)

// The variable $myResultVariable contains "This is a text.".

math($resultVariableName, )

Dit commando voert eenvoudige wiskundige berekeningen uit, waaronder optellen (+), aftrekken (-), vermenigvuldigen (*) en delen (/). Let op: berekeningen worden uitgevoerd in de volgorde waarin ze verschijnen en volgen NIET de PEMDAS/BODMAS-regel.

// define some variables
setVariable($myVariableA, 3)
setVariable($myVariableB, 5)

// perform the calculation
math($myResult, $myVariableA + 2 * $myVariableB)

// The result in $myResult is 25 (!) and not 13

if(, , ) [else] endif

Deze als De instructie vergelijkt twee numerieke uitdrukkingen met behulp van een gespecificeerde comparator. Als de vergelijking waar is, worden de volgende opdracht(en) uitgevoerd. Anders worden de volgende opdrachten overgeslagen totdat een anders of endif is bereikt.

Geldige vergelijkers zijn:

“==”is gelijk aan
“!=”niet gelijk aan
">"groter dan
"<"minder dan
">="groter of gelijk aan
"<="minder of beter dan
// define a variable
setVariable($myVariable, 3)

// test if the variable is bigger than 10
if($myVariable, ">", 10)
   setVariable($text, "is bigger than 10")
else
   setVariable($text, "is less or equal 10")
endif

// The result in $text is "is less or equal 10"

ifString(, , ) [else] endif

Deze ifString De instructie vergelijkt twee tekenreeksexpressies met behulp van een gespecificeerde comparator. De vergelijking is gebaseerd op de ASCII-tekencode van elke letter in de tekenreeksen. Als de vergelijking waar is, dan worden de volgende opdrachten uitgevoerd. Anders worden de volgende opdrachten overgeslagen totdat een anders of endif is bereikt.

Voor geldige vergelijkers, zie het if-commando.

// define a variable
setVariable($myVariable, "mimoLive")

// test if the variable is "mimoLive"
if($myVariable, "==", "mimoLive")
   setVariable($text, "yes")
else
   setVariable($text, "no")
endif

// The result in $text is "yes"

ifLayerIsOn(<API Laag-ID als string Expressie>) - ifLayerIsOff(<API Laag-ID als string Expressie>) [else] endif

Deze als statements testen of een bepaalde laag momenteel live is of niet. Als aan de opgegeven voorwaarde is voldaan (de laag is aan of uit), dan worden de volgende opdrachten verwerkt. Anders worden de volgende opdrachten overgeslagen totdat een anders of endif is bereikt.

setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")
setVariable($myLayerB, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")

ifLayerIsOn($myLayerA)
   // the layer is live, switch it off
   layerOff($myLayerA)
else
   // the layer is currently off, switch it on
   layerOn($myLayerA)
endif

ifLayerIsOff($myLayerB)
   // the layer is currently off, switch it on
   layerOn($myLayerB)
endif

ifLayerSetIsActive(<API Laag-ID als string Expressie>) - ifLayerSetIsInactive(<API Laag-ID als string Expressie>) [else] endif

Deze als verklaringen testen of een bepaalde Laag Set momenteel live is of niet. Zo ja, dan worden de volgende opdrachten verwerkt. Anders worden de volgende opdrachten overgeslagen totdat een anders of endif is bereikt.

setVariable($myLayerSetA, "CEF07AFA-B552-40F8-821C-CF424EB93500")
setVariable($myLayerSetB, "E4B15B8B-EE34-4CCE-BDE7-58120A65E83A")
setVariable($myLayer, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")


ifLayerSetIsActive($myLayerSetA)
   // the layer set A is active, switch layer on
   layerOn($myLayer)
else
   // the layer set A is currently inactive, switch the layer off
   layerOff($myLayer)
endif

ifLayerSetIsInactive($myLayerSetB)
   // the layer set B is currently inactive, switch the layer off
   layerOn($myLayer)
endif

ifLayerData(, , , ) [else] endif

Met dit complexe commando kunt u elke parameter van een laag testen die de HTTP API biedt. U moet een laag specificeren met zijn API ID, het sleutelpad binnen de JSON-gegevens die door de HTTP API worden geretourneerd, een vergelijker (als een tekenreeks tussen aanhalingstekens, bijv.=="), en een waarde.

Geldige vergelijkingswaarden zijn:

“==”is gelijk aan
“!=”niet gelijk aan
">"groter dan
"<"minder dan
">="groter of gelijk aan
"<="minder of beter dan
// Example: Testing if the audio volume is turned up on a layer

setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")
setVariable($myLayerB, "8C58DEA7-CCBE-44CB-A60F-97C5BD456C68")

ifLayerData($myLayerA,"data.attributes.volume",">",0.5)
   // The audio volume is bigger than 0.5 so turn layer B on
   layerOn($myLayerB)
else
   // The volume is lower than 0.5, lets turn layer B off
   layerOff($myLayerB)
endif

loop([]) [break] endloop

De lus kunt u code meerdere keren uitvoeren. Als u het aantal iteraties niet opgeeft, wordt de lus oneindig uitgevoerd. De break kunt u de lus op elk moment verlaten. endloop is nodig om het einde van het opdrachtblok te markeren dat doorgelust moet worden.

setVariable($myLayerA, "D6A326CA-72E6-45E5-836D-9795F8F534F4")

// blink layer A 4 times
loop(4)
   layerOn(setVariable(myLayerA)
   sleep(1)
   layerOff(setVariable(myLayerA)
   sleep(1)
endloop

// wait for volume of layer A will be bigger than 0.5
loop()
   ifLayerData($myLayerA,"data.attributes.volume",">",0.5)
      // The audio volume is bigger than 0.5 exit the loop now
      break
   endif
   sleep(1)
endloop

httpRequest()

De httpRequest() commando de gegeven URL activeert. Dit biedt veel flexibiliteit in hoe u dit scriptcommando kunt gebruiken. In mimoLiveHet kan zelfs acties in andere documenten of externe scripts activeren. Voor meer informatie over mimoLiveHTTP API-opdrachten, raadpleeg de HTTP API documentatie om alle mogelijke API-aanroepen te onderzoeken.

// een laag inschakelen
httpRequest("http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B/setLive")

httpRequestJSON($resultVariableName, )

Deze opdracht leest het antwoord van de HTTP-oproep als JSON en slaat de gegevens op in de opgegeven resultaatvariabele. Hierna hebt u toegang tot de gegevens via de getJSONData() commando.

getJSONData($resultVariableName, $jsonDataVariable, )

Dit commando haalt een specifieke gegevenswaarde op uit een JSON-structuur die in een variabele is opgeslagen. U moet de variabele specificeren die de JSON-gegevens bevat ($jsonDataVariabele), het pad naar de gegevens binnen de JSON-structuur (), en de variabele waar het resultaat moet worden opgeslagen ($resultVariableName). Hierdoor kunnen gegevens nauwkeurig worden geëxtraheerd voor verdere verwerking of gebruik in uw script.

// alle gegevens van een laag krijgen
httpRequestJSON($myLayerData, "http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B")

// de waarde van de volumeknop krijgen
getJSONData($volumenDial, $myLayerData, "data.attributes.volume")

// Nu zal de variabele $volumenDial een waarde tussen 0 en 1 bevatten.

> Debugger afbreekpunt

Als de scriptdebugger ingeschakeld is en de debugmodus ingesteld is op 'Continu', zal de uitvoering van het script bij deze markering pauzeren en wachten totdat de mimoLive-operator op de knop 'Volgende stap' klikt. Zie 'Beste Praktijken - Scripts debuggen' voor meer informatie over de debugmogelijkheden.

Gegevenstypen

API Eindpunten

De parameter moet een API Endpoint zijn voor een Layer, een Layer Variant, een Layer Set, een Source of een Output Destination. U kunt deze API Endpoints verkrijgen door rechts te klikken op het object in het mimoLive-document. Er zou een contextmenu moeten verschijnen met een menu-item 'Copy API Endpoint to Clipboard'.

Deze actie kopieert het API Endpoint voor dit object naar het klembord. Als u het ergens anders plakt, ziet het er ongeveer zo uit:

/api/v1/documents/863743527/layers/D6A326CA-72E6-45E5-836D-9795F8F534F4

/api/v1/documents/863743527/layers/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922

/api/v1/documents/863743527/layer-sets/E6950B7A-7457-44C5-81F7-972D9B04DBC3

Voor laaggerelateerde opdrachten kunt u de API Eindpunten naar het belangrijke deel alleen door het voorvoegsel "/api/v1/documents//layers/" te verwijderen. Dit maakt uw script korter, zoals hier te zien is:

// switching on a layer:
layerOn("/api/v1/documents/863743527/layers/D6A326CA-72E6-45E5-836D-9795F8F534F4")
// OR
layerOn("D6A326CA-72E6-45E5-836D-9795F8F534F4")

// switching on a variant:
layerOn("/api/v1/documents/863743527/layers/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922")
// OR
layerOn("68F63C8F-2376-4CA3-9764-CC17CBFC5F8D/variants/3FF72CC3-AF80-4252-A879-F8AFD68DB922")

 

Beste praktijk

API Eindpunten

Hoe API-eindpunten verkrijgen

  • Door met de rechtermuisknop op de laag te klikken en "Copy API Endpoint" te selecteren
  • door de opdracht getAPIEndpoint() te gebruiken (zie documentatie)

API-eindpunten adresseren

U kunt het volledige API eindpunt gebruiken of het gedeelte "/api/v1/documents//" verwijderen om ervoor te zorgen dat uw script ook werkt als het naar een ander document gekopieerd wordt. Het document ID is echter belangrijk als u een API punt in een ander mimoLive document wilt adresseren.

Scripts debuggen

Er is een scriptdebugger ingebouwd in de Automatiseringslaag. U kunt de laag in de Debugmodus zetten door de laagparameter "Debug" aan te zetten.

TBD.

Scripting ideeën

Draai elke 10 minuten een advertentie

In combinatie met een "PIP Window" laag een "Media Playlist bron" met meerdere korte reclamefilmpjes kunt u elke 10 minuten een reclame afspelen. Zorg ervoor dat u de optie "Non-Stop" in de Media Playlist-bron uitschakelt. Zo wordt elke keer dat de PIP Het venster wordt ingesteld op live en speelt één advertentie van de Playlist-bron af en schakelt zichzelf uit. Na 10 minuten wordt de volgende advertentie afgespeeld.

Voer een stinger uit voordat je naar een bepaalde laag overschakelt.

Je moet een korte stinger video voorbereiden die een In-transitie heeft totdat het het hele scherm bedekt (bijv. na 1 sec). Na 1 seconde schakel je live de laag die je wilt onthullen. Plaats deze laag onder de laag die de stinger video afspeelt. Nu de stinger video het scherm bedekt is het schakelen van de laag eronder niet te zien. De stinger video moet doorgaan met het onthullen van de laag eronder. Zorg ervoor dat de stinger video is gerenderd in ProRes4444 video codec zodat het de transparantie draagt die nodig is voor de overgang ermee.

Maak een complexe showopener

Omdat je lagen na elkaar kunt aan- en uitschakelen over een langere periode, kun je meerdere tekst- of annotatielagen, plaatsingslagen met afbeeldingen of zelfs onderlagen die het scherm vullen hebben om je eigen geanimeerde showopener te maken. Ga creatief aan de slag!

Een afstandsbediening activeren HTTP URL door een tik op het afstandsbedieningsoppervlak

Als u een HTTP Verzoek door een knop op uw Afstandsbedieningsoppervlak kun je een Automatiseringslaag toevoegen aan je lagenstapel en de optie "Laag uitschakelen" van die laag op "Automatisch" zetten. Nu kun je een enkel httpRequest() commando in het "On Live" scriptveld zetten. Voeg op je Remote Control Surface de Live-knop van deze laag toe aan de lay-out. Zodra u op deze knop op uw Remote Control Surface drukt, wordt de HTTP verzoek zal worden uitgevoerd.

Verwante softwareversie van dit artikel:

n.v.t.

Uw feedback

Hoe beoordeelt u uw ervaring met deze functie van mimoLive?

Gebruikershandleiding: Recente updates

Kies taal