mimoLive® - Посібник користувача

Загальні селектори
Тільки точні збіги
Пошук за назвою
Пошук за змістом
Перемикачі типів дописів

Автоматизація

Зміст

Оптимізуйте своє виробництво за допомогою рівня автоматизації mimoLive

Рівень автоматизації mimoLive спочатку був розроблений як перевірка концепції, але з тих пір виявився неймовірно корисним інструментом для користувачів. За допомогою цього шару можна автоматизувати вмикання та вимикання шарів у певній послідовності або в заздалегідь визначений час, передачу інформації з одного шару на інший, запуск та зупинку Пункти призначення на виходіта багато іншого!

Він може бути особливо корисним для створення складних продакшнів з кількома шарами та входами, оскільки усуває необхідність ручного перемикання та синхронізації. Завдяки цьому шару користувачі можуть зосередитися на створенні цікавого контенту, поки програма керує хронометражем і послідовністю їхнього виробництва. У версії 2 цього шару ми розширили команди, щоб вивести автоматизацію в mimoLive на абсолютно новий рівень.

Приклад: Рівень автоматизації

Автоматизація

Скрипти автоматизації в mimoLive не виконуються в режимі реального часу

Зверніть увагу, що час роботи скриптів автоматизації в mimoLive може бути неточним через асинхронну природу HTTP-запитів, що викликаються механізмом рендерингу відео. Ці скрипти покладаються на HTTP-запити до API, а тривалість цих запитів не може бути точно визначена, що призводить до потенційних розбіжностей у часі. Будь ласка, майте це на увазі, коли використовуєте скрипти автоматизації у своєму робочому процесі.

Обов'язкова умова

Для того, щоб цей шар працював, вам потрібно увімкнути HTTP Сервер у mimoLive, щоб увімкнути пульт дистанційного керування API. Перейдіть до mimoLive -> Уподобання -> Пульти дистанційного керування: Позначте опцію "Дозволити доступ до віддаленого керування". (Наразі рівень автоматизації у mimoLive працює лише без пароля)

6102d04e 4eb3 4600 b410 0d2b2aef0767

Налаштування рівня автоматизації

Існує два варіанти поведінки шару після увімкнення наживо:

ВаріантПоводиться
Автоматичне вимкнення шаруДля цієї опції доступний лише один скрипт. Після того, як цей сценарій буде оброблено, шар буде вимкнено. Ця опція може бути використана, якщо послідовність має бути виконана один раз.
Вимкнення шару вручну (наприклад, оператором)У цьому випадку доступні три сценарії. Коли шар увімкнено наживо, виконується сценарій "On Live". Після цього в нескінченному циклі виконується сценарій "While Live". Коли шар вимикається, виконується сценарій "Turned Off".
Якщо вам не потрібен певний етап, ви можете залишити відповідний скрипт порожнім.

Коментарі до вихідного коду

Щоб допомогти вам запам'ятати функцію вашого скрипта, ми рекомендуємо використовувати коментарі у вашому скрипті:

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

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

Коментарі повинні бути в окремому рядку.

Команди сценаріїв

Мова сценаріїв є пропрієтарною і включає кілька команд. Ці команди перераховані у шпаргалці в області попереднього перегляду шарів праворуч. Оскільки список може бути замалим для читання, ви можете розгорнути попередній перегляд за допомогою кнопки, розташованої вище і праворуч від області попереднього перегляду.

layerOn()

Ця команда дозволяє увімкнути шар або варіант шару.

// 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 Ідентифікатор шару як рядковий вираз>> Ідентифікатор шару як рядковий вираз)

Ця команда дозволяє вимкнути шар або варіант шару.

// 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 як рядковий вираз>)

Ця команда може бути використана для запуску відкликання для певного Набір шарів.

// 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 виводить ідентифікатор пункту призначення як рядковий вираз>)

Використовуйте цю команду, щоб увімкнути пункт призначення виводу.

// запустити Output Destination за його ідентифікатором
outputOn("1953186E-4176-4849-A8ED-5B47EE1627BD")

// запустити Output Destination за довгою URL-адресою кінцевої точки API
outputOn("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")

// запустити Output Destination з визначеною змінною
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOn($myOutputDestinationtID)

outputOff(<API виводить ідентифікатор пункту призначення як рядковий вираз>)

Використовуйте цю команду, щоб вимкнути пункт призначення виводу.

// зупинити Output Destination за його ідентифікатором
outputOff("1953186E-4176-4849-A8ED-5B47EE1627BD")

// зупинити пункт призначення виводу за довгою URL-адресою кінцевої точки API
outputOff("/api/v1/documents/1677022440/output-destinations/1953186E-4176-4849-A8ED-5B47EE1627BD")

// зупинити місце виводу з визначеною змінною
setVariable($myOutputDestinationtID, "1953186E-4176-4849-A8ED-5B47EE1627BD")
outputOff($myOutputDestinationtID)

getLayerData()1TP11Ім'я змінної результату, , )

Ця команда поєднує кілька команд в одному кроці скрипта: Вона зчитує інформацію про шар з HTTP-сервера і зберігає певне поле даних з JSON-відповіді у змінну. Вам потрібен точний шлях до значення, яке ви хочете прочитати. Для вхідних параметрів шарів цей шлях зазвичай починається з "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(1TP11Ім'я змінної результату, , )

Ця команда отримує кінцеву точку API для конкретного об'єкта mimoLive за його іменем відображення. Зауважте, що ім'я відображення може бути легко змінено оператором mimoLive у користувацькому інтерфейсі mimoLive, що, у свою чергу, призведе до зупинки сценарію автоматизації, якщо він не зможе знайти певний об'єкт. З іншого боку, цю команду можна використовувати для програмного пошуку кінцевих точок API без необхідності жорсткого кодування кінцевих точок API у скрипті.

Допустимими варіантами для є "source", "layer", "layer-set", "output-destination"

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

// switch this layer on
layerOn($myBasketballScoreLayerID)
Скріншот 2024 06 11 о 15.20.42

спати.<Секунди> як число)

Команда sleep() призупинить виконання скрипта на заданий інтервал часу, виражений у секундах.

// 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(<Час як рядковий вираз>)

Команда sleepUntil() дозволяє скрипту призупинити роботу до досягнення вказаного часу. Якщо час вже минув, скрипт чекає до наступного дня. Формат часу - ГГ:ММ або ГГ:ММ:СС у 24-годинному періоді.

// 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()

Ця команда призупиняє виконання скрипта до досягнення наступної "похвилинної" частки години.

// 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)

setVariable()1TP11Ім'я змінної, <значення>)

Щоб визначити локальну змінну, використовуйте setVariable команду. Вам потрібно вказати ім'я змінної (починаючи з $) і значення, яке має зберігати ця змінна. Значення може бути числом, текстом (взятим у лапки) або булевими значеннями правда і фальшивий.

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

setGlobal(1TP11Ім'я змінної, <значення>)

Глобальну змінну можна використовувати як у поточному шарі, так і в будь-якому шарі автоматизації над ним. Ця функція особливо корисна для спільного використання однієї і тієї ж інформації в декількох шарах автоматизації, наприклад, кінцевих точок API певного шару. Для значення змінної застосовуються ті самі правила, що й для змінної setVariable команда.

Зверніть увагу, що глобальні змінні доступні для інших шарів автоматизації, доки активний початковий шар. Це дає змогу перемикати глобальні змінні, активувавши інший шар з окремими визначеннями глобальних змінних. Найкращою практикою у цьому випадку є встановлення опції "Вимкнути шар" шару автоматизації на "Вручну" і визначення глобальних змінних у сценарії "Ввімкнути наживо".

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

concat($resultVariableName, )

Ця команда скрипта об'єднує рядки разом і зберігає результат у вигляді рядка.

// 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(1TP11Ім'яЗмінноїРезультату, )

Ця команда виконує прості математичні обчислення, зокрема додавання (+), віднімання (-), множення (*) і ділення (/). Зверніть увагу, що обчислення виконуються в тому порядку, в якому вони з'являються, і НЕ дотримуються правила PEMDAS/BODMAS.

// 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

Це якщо порівнює два числові вирази за допомогою вказаного компаратора. Якщо порівняння істинне, то виконується наступна команда (команди). В іншому випадку наступні команди пропускаються, доки не буде досягнуто значення інакше або endif досягнуто.

Достовірними компараторами є:

“==”дорівнює
“!=”не рівні
“>”більше, ніж
"<"менше, ніж
“>=”більше або дорівнює
"<="менше або більше, ніж
// 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

Це ifString порівнює два рядкові вирази за допомогою вказаного компаратора. Порівняння базується на ASCII коді кожної літери у рядках. Якщо порівняння істинне, то виконуються наступні команди. В іншому випадку наступні команди пропускаються до тих пір, поки не буде досягнуто значення інакше або endif досягнуто.

Допустимі компаратори див. у команді if.

// 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 Ідентифікатор шару як рядковий вираз>> Ідентифікатор шару як рядковий вираз) - ifLayerIsOff(<API Ідентифікатор шару як рядковий вираз>> Ідентифікатор шару як рядковий вираз) [else] endif

Ці якщо перевіряють, чи є певний шар в даний момент живим чи ні. Якщо вказана умова виконується (шар увімкнений або вимкнений), то обробляються наступні команди. В іншому випадку, наступні команди пропускаються, доки не буде виконано оператор інакше або endif досягнуто.

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 Ідентифікатор шару як рядковий вираз>> Ідентифікатор шару як рядковий вираз) - ifLayerSetIsInactive(<API Ідентифікатор шару як рядковий вираз>> Ідентифікатор шару як рядковий вираз) [else] endif

Ці якщо оператори перевіряють, чи є певний Набір шарів знаходиться у прямому ефірі чи ні. Якщо так, то обробляються наступні команди. В іншому випадку, наступні команди пропускаються, доки не буде отримано команду інакше або endif досягнуто.

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

Ця комплексна команда дозволяє протестувати будь-який параметр шару, який HTTP API надає. Вам потрібно вказати шар за його API ID, ключовий шлях у JSON-даних, що повертаються HTTP API, компаратор (у вигляді рядка в лапках, наприклад, "=="), і значення.

Допустимими значеннями компаратора є

“==”дорівнює
“!=”не рівні
“>”більше, ніж
"<"менше, ніж
“>=”більше або дорівнює
"<="менше або більше, ніж
// 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

У "The цикл дозволяє виконати код декілька разів. Якщо не вказати кількість ітерацій, то цикл буде виконуватися нескінченно. Команда перерва дозволяє вийти з циклу в будь-який момент. кінцева петля необхідна для позначення кінця блоку команд, який потрібно зациклити.

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()

У "The httpRequest() запускає команду за вказаною URL-адресою. Це забезпечує велику гнучкість у використанні цієї команди скрипта. У рядку mimoLiveвін навіть може запускати дії в інших документах або віддалених скриптах. Докладні відомості про mimoLiveКоманди HTTP API, будь ласка, зверніться до розділу HTTP API документацію, щоб вивчити всі можливі виклики API.

// увімкнути шар
httpRequest("http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B/setLive")

httpRequestJSON($resultVariableName, )

Ця команда зчитує відповідь HTTP-виклику у форматі JSON і зберігає дані у вказаній змінній результату. Після цього ви можете отримати доступ до даних за допомогою методу getJSONData() команда.

getJSONData($resultVariableName, $jsonDataVariable, )

Ця команда отримує певне значення даних зі структури JSON, що зберігається у змінній. Вам потрібно вказати змінну, що містить JSON-дані ($jsonDataVariable), шлях до даних у структурі JSON (<Шлях до ключа як рядковий вираз), і змінну, в якій має зберігатися результат (1TP11Ім'я змінної результату). Це дозволяє точно витягувати дані для подальшої обробки або використання у вашому скрипті.

// отримати всі дані шару
httpRequestJSON($myLayerData, "http://127.0.0.1:8989/api/v1/documents/188462841/layers/BA868701-8131-49CB-8EDD-8C7E6E7CD60B")

// отримати значення регулятора гучності
getJSONData($volumenDial, $myLayerData, "data.attributes.volume")

// Тепер змінна $volumenDial буде мати значення від 0 до 1.

> Точка зупинки налагоджувача

Якщо увімкнено налагоджувач скриптів і встановлено режим налагодження "Безперервно", виконання скрипта призупиниться на цьому маркері і чекатиме, доки оператор mimoLive не натисне кнопку "Наступний крок". Будь ласка, зверніться до розділу "Кращі практики - Налагодження скриптів" для отримання додаткової інформації про можливості налагодження.

Типи даних

API Кінцеві точки

Параметр має бути кінцевою точкою API для шару, варіанту шару, набору шарів, джерела або призначення виводу. Ви можете отримати ці кінцеві точки API, клацнувши правою кнопкою миші на об'єкті у документі mimoLive. Має з'явитися контекстне меню з пунктом "Копіювати кінцеву точку API до буфера обміну".

Ця дія скопіює кінцеву точку API для цього об'єкта до буфера обміну. Якщо ви вставите його в інше місце, він виглядатиме приблизно так:

/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

Для команд, пов'язаних з шарами, ви можете зменшити API Кінцеві точки до важливої частини, тільки видаливши префікс "/api/v1/documents//layers/" . Це зробить ваш скрипт коротшим, як показано тут:

// 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")

 

Найкращі практики

Кінцеві точки API

Як отримати кінцеві точки API

  • Клацнувши правою кнопкою миші на шарі та вибравши "Копіювати кінцеву точку API"
  • за допомогою команди getAPIEndpoint() (див. документацію)

Звернення до кінцевих точок API

Ви можете використовувати повну кінцеву точку API або видалити частину "/api/v1/documents//", щоб переконатися, що ваш скрипт буде працювати і при копіюванні в інший документ. Однак ідентифікатор документа важливий, якщо ви хочете звернутися до точки API в іншому документі mimoLive.

Налагодження скриптів

До шару автоматизації вбудовано налагоджувач скриптів. Ви можете перевести шар у режим налагодження, встановивши параметр шару "Налагодження" увімкненим.

НЕВІДОМО.

Ідеї для сценаріїв

Запускайте рекламу кожні 10 хвилин

У поєднанні з "PIP Вікно" шару "Джерело медіафайлів", що містить кілька коротких рекламних відеороликів, ви можете відтворювати один рекламний ролик кожні 10 хвилин. Переконайтеся, що ви зняли позначку з опції "Безперервний" у джерелі "Медіаплеєр". Таким чином, щоразу, коли ви натискатимете кнопку PIP Коли вікно буде налаштоване на відтворення, воно відтворить одне оголошення з джерела зі списку відтворення і вимкнеться. Через 10 хвилин буде відтворено наступне оголошення.

Запустіть стингер перед тим, як перейти на певний шар

Вам потрібно підготувати коротке стингер-відео, яке буде мати перехід до тих пір, поки воно не покриє весь екран (наприклад, через 1 секунду). Через 1 секунду ви перемикаєте в реальному часі той шар, який хочете розкрити. Розмістіть цей шар під шаром, на якому відтворюється відео-стингер. Тепер, коли відео-стингер покриває весь екран, перемикання шару, що знаходиться нижче, не буде видно. Відео-стингер має продовжувати показувати шар, що знаходиться нижче. Будь ласка, переконайтеся, що стингер-відео рендериться у відеокодеку ProRes4444, щоб воно містило необхідну для переходу прозорість.

Створіть складний вступ до шоу

Оскільки ви можете вмикати і вимикати шари один за одним протягом тривалого періоду часу, ви можете мати кілька шарів тексту або анотацій, шар розсипу, що показує графіку, або навіть нижню третину екрана, яка заповнює екран, щоб створити власну анімовану заставку для шоу. Проявіть творчість!

Запустіть пульт дистанційного керування HTTP URL дотиком до поверхні пульта дистанційного керування

Якщо вам потрібно запустити HTTP Запит за допомогою кнопки на вашому Поверхня для дистанційного керування ви можете додати шар автоматизації до стеку шарів і встановити опцію "Вимкнути шар" для цього шару на "Автоматично". Тепер ви можете ввести одну команду httpRequest() у поле сценарію "On Live". На поверхні пульта дистанційного керування додайте до макета кнопку Live цього шару. Щойно ви натиснете цю кнопку на поверхні пульта дистанційного керування, на екрані з'явиться кнопка HTTP запит буде виконано.

Ваш відгук

Як би ви оцінили свій досвід роботи з цією функцією mimoLive®?

Посібник користувача: Останні оновлення

Рішення

Інформаційний бюлетень по електронній пошті

Українська

Приєднуйтесь до цілодобової демонстрації Zoom® в реальному часі

*необхідно*

Вам потрібно завантажити контент з reCAPTCHA щоб надіслати форму. Будь ласка, зверніть увагу, що при цьому ви передаєте дані стороннім провайдерам.

Більше інформації