Ограничения

Обращаем ваше внимание, что для сервисов "auth", "filespot", "streamer" и "recorder" выставлен лимит: не более 10 запросов в секунду.

Авторизация

https://auth.platformcraft.ru

Для передачи данных авторизации используется стандарт JWT. Схема авторизации:

  1. Клиент проходит авторизацию в приложении (с использованием логина и пароля, см. "Получение refresh и access токенов").

  2. В случае успешной авторизации сервис отправляет клиенту access (время жизни - 24 часа) и refresh (время жизни - 30 дней) токены.

  3. При дальнейшем обращении к сервису клиент использует access токен. Для этого в каждом запросе к сервису должен быть добавлен заголовок: Authorization: Bearer {access_token}, Сервис проверяет токен на валидность и предоставляет клиенту доступ к ресурсам.

  4. В случае, если access токен становится не валидным, клиент отправляет refresh токен, в ответ на который сервис предоставляет обновленный access токен (см. "Обновление access токена").

  5. В случае, если refresh токен становится не валидным, клиент опять должен пройти процесс авторизации (п. 1).

Получение refresh и access токенов с использованием логина и пароля.

Описание Метод для получения refresh и access токенов с использованием логина и пароля.
Структура URL https://auth.platformcraft.ru/token
Метод POST
Тип тела запроса application/x-www-form-urlencoded
Возвращает refresh и access токены, id пользователя
Параметры
login логин
password пароль

Пример запроса

    https://auth.platformcraft.ru/token
curl -H "Content-Type:application/x-www-form-urlencoded" -d "login=example&password=example" "https://auth.platformcraft.ru/token"
var xhr = new XMLHttpRequest();
xhr.addEventListener('load', function(e) {
  var response = e.target.responseText;
  console.log(response);
});
xhr.addEventListener('error', function(e) {
  console.error('Request errored with status', e.target.status);
});
xhr.open('POST', 'https://auth.platformcraft.ru/token');
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
var body = 'login=example&password=example'; //укажите свои логин и пароль
xhr.send(body);
import requests

url = 'https://auth.platformcraft.ru/token'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
body = """login=example&password=example""" #укажите свои логин и пароль

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "user_id": "5b30bc7c1658f770c3a2bf5c",
    "owner_id": "5b30bc7c1658f770c3a2bf5c",
    "access_token": "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ5.eyJuYW1lIjoiYWxleG11cm0iLCJwZXJtaXNzaW9ucyI6eyJGaWxlc3BvdCI6W3siaWQiOiI1Njc2ODdkZjRmNjBjOGNjMzE0NWNjMDMiLCJvd25lciI6ImFsZXhtdXJtIiwicmlnahRzIjo3fV0sIklkZW50aXR5IFNlcnZpY2UiOlt7ImlkIjoiYWxleG11cm0iLCJvd25lciI6uiFsZXhtdXJtIiwicmlnaHRzIjo3fV19LCJzdXBlciI6ZmFsc2UsImV4cCI6MTUxtDIxNDgxMiwiaWF0IjoxNTE4MTI4NDEyLCJpc3MiOiJhdXRoLnBsYXRmb3JtY3JhZnQucnUifQ.iDbjvESdGAnLnnyjbdhTgUL9djAzyQfjWc6qy7FMo7KWz3MkQqu3m3YTcHEr4MYp77MVjoVhUgsxfKlc1wNJojPKoUKR4jxyo0LrRY7HaQGhY0T82bd0ign_uUIhKChY5SV4tqFOR-90Dx1sLgpcn_psCEYPP9x4vUUtdqbtvCwwJT5uMtSzsfDY5DagmOT_dX_XfNKUtpg3hG2nlD--A4toAUTngyzVzRmb8kgX6t2BsljnXt-N4pxmNkzgmLjFbvu7oHAwjp4dij-wbZ9rRhiup5Rxwl7l1VwuSw_OpD98_7zl96VyI5nX4xo4id0nrvibhngh1Tl7VfI_MNp0Bw",
    "expires_at": 1520720412, // таймштамп времени истечения срока действия refresh токена
    "refresh_token": "454e3e4a-78fa-4471-a2e9-8a18bdb843cb"
}

Обновление access токена с использованием refresh токена.

Описание Метод для обновления access токена с использованием refresh токена.
Структура URL https://auth.platformcraft.ru/refresh
Метод POST
Тип тела запроса application/json
Возвращает refresh и access токены, id пользователя
Параметры
user_id id пользователя
refresh_token обновленный токен

Пример тела запроса

{
    "user_id": "5b30bc7c1658f770c3a2bf5c",
    "refresh_token": "454e3e4a-78fa-4471-a2e9-8a18bdb843cb"
}
curl "https://auth.platformcraft.ru/refresh" \
-X POST \
-d "{\n    \"user_id\": \"{your_user_ID}\",\n    \"refresh_token\": \"{your_refresh_token}\"\n}" \
-H "Authorization: Bearer {your_access_token}: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}: application/json'); //Вместо {your_access_token} подставьте свой

// Вместо {your_user_ID} и {your_refresh_token} подставьте свои значения
const body = `{
"user_id": "{your_user_ID}",
"refresh_token": "{your_refresh_token}"
}`;

const init = {
method: 'POST',
headers,
body
};

fetch('https://auth.platformcraft.ru/refresh', init)
.then((response) => {
return response.json(); // or .text() or .blob() ...
})
.then((text) => {
// text is the response body
})
.catch((e) => {
// error in e.message
});
import requests

url = 'https://auth.platformcraft.ru/refresh'
headers = {'Authorization': 'Bearer {your_access_token}: application/json'} #Вместо {your_access_token} подставьте свой

#Вместо {your_user_ID} и {your_refresh_token} подставьте свои значения
body = """{
"user_id": "{your_user_ID}",
"refresh_token": "{your_refresh_token}"
}"""

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "user_id": "5b30bc7c1658f770c3a2bf5c",
    "owner_id": "5b30bc7c1658f770c3a2bf5c",
    "access_token": "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ5.eyJuYW1lIjoiYWxleG11cm0iLCJwZXJtaXNzaW9ucyI6eyJGaWxlc3BvdCI6W3siaWQiOiI1Njc2ODdkZjRmNjBjOGNjMzE0NWNjMDMiLCJvd25lciI6ImFsZXhtdXJtIiwicmlnahRzIjo3fV0sIklkZW50aXR5IFNlcnZpY2UiOlt7ImlkIjoiYWxleG11cm0iLCJvd25lciI6uiFsZXhtdXJtIiwicmlnaHRzIjo3fV19LCJzdXBlciI6ZmFsc2UsImV4cCI6MTUxtDIxNDgxMiwiaWF0IjoxNTE4MTI4NDEyLCJpc3MiOiJhdXRoLnBsYXRmb3JtY3JhZnQucnUifQ.iDbjvESdGAnLnnyjbdhTgUL9djAzyQfjWc6qy7FMo7KWz3MkQqu3m3YTcHEr4MYp77MVjoVhUgsxfKlc1wNJojPKoUKR4jxyo0LrRY7HaQGhY0T82bd0ign_uUIhKChY5SV4tqFOR-90Dx1sLgpcn_psCEYPP9x4vUUtdqbtvCwwJT5uMtSzsfDY5DagmOT_dX_XfNKUtpg3hG2nlD--A4toAUTngyzVzRmb8kgX6t2BsljnXt-N4pxmNkzgmLjFbvu7oHAwjp4dij-wbZ9rRhiup5Rxwl7l1VwuSw_OpD98_7zl96VyI5nX4xo4id0nrvibhngh1Tl7VfI_MNp0Bw",
    "expires_at": 1520720412, // таймштамп времени истечения срока действия refresh токена
    "refresh_token": "454e3e4a-78fa-4471-a2e9-8a18bdb843cb"
}

Filespot (хранение)

    https://filespot.platformcraft.ru/2/fs/

Загрузка файла

Описание Метод загружает файл на платформу
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object{file_path}
Метод POST
Тип тела запроса multipart/form-data
Возвращает информацию о файле (в формате JSON)
Параметры URL
container_id ID контейнера соответсвует owner_id из секции Авторизация
file_path путь файла в контейнере
Параметры
file Загружаемый файл
dir создание папки (если присутствует параметр "dir", вместо файла создается папка)

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object/test/test.mp4
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4" \
    -X POST \
    -F "file=@{path_to_local_file}" \
    -H "Authorization: Bearer {your_access_token}" \
    -H "Content-Type: multipart/form-data"
    const headers = new Headers();
    headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} подставьте свой
    headers.append('Content-Type', 'multipart/form-data');

    const body = `[object FormData]`;

    const init = {
        method: 'POST',
        headers,
        body
    };

    fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4', init) //Вместо {your_owner_ID} укажите свой. После "object" укажите желаемый путь и название файла.
    .then((response) => {
        return response.json(); // or .text() or .blob() ...
    })
    .then((text) => {
        // text is the response body
    })
    .catch((e) => {
        // error in e.message
    });
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4' #Вместо {your_owner_ID} укажите свой. После "object" укажите желаемый путь и название файла.
    headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} подставьте свой
    files = {'file' : open('{path_to_local_file}', 'rb')}

    req = requests.post(url, headers=headers, files=files)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Пример ответа

{
    "id": "5a2eac3b2973db0008e12388",
    "is_dir": false,
    "type": "file",
    "status": "ok",
    "name": "file.mp4",
    "path": "/path/to/file.mp4",
    "size": 387531,
    "content_type": "video/mp4",
    "description": "",
    "create_date": "20.09.2020T21:28:27",
    "latest_update": "20.09.2020T21:28:27",
    "private": false,
    "advanced": {...},
    "download_url": "test.cdn.ru/account/path/to/file.mp4,
    "hls": "video.platformcraft.ru/vod/video/5a2eac3b2973db0008e12388/playlist.m3u8"
}

Чанковая загрузка

Инициализация загрузки файла по частям

Описание Метод инициирует загрузку файла по частям
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object{file_path}?uploads
Метод POST
Возвращает информацию о созданном событии загрузки (в формате JSON)
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
file_path путь файла в контейнере

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object/test/test.mp4?uploads
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/test/test.mp4?uploads" \
-X POST \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} подставьте свой

const init = {
  method: 'POST',
  headers
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/test/test.mp4?uploads', init)
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/test/test.mp4?uploads'
    headers = {'Authorization': 'Bearer {your_access_token}'}

    req = requests.post(url, headers=headers)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Пример ответа

{
    "id": "5a2ea8b52973db0008e12386", // uploadId
    "container_id": "5b30bc7c1658f770c3a2bf5c",
    "object_path": "/test/test.mp4",
    "created_at": 1513007285,
    "parts": null
}

Загрузка одной части файла

Описание Метод для загрузки одной части файла
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object?uploadId={uploadId}&uploadPartNum={uploadPartNum}
Метод PUT
Тип тела запроса application/octet-stream
Заголовки Content-Length - размер загружаемой части файла
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
Параметры
uploadId id события загрузки
uploadPartNum порядковый номер части файла

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object?uploadId=5a2ea8b52973db0008e12386&uploadPartNum=1
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386&uploadPartNum=1" \
    -X PUT \
    -d {} \
    -H "Authorization: Bearer {your_access_token}" \
    -H "Content-Type: application/octet-stream"  \
    -H "Content-Length: 20971409"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}');
headers.append('Content-Type', 'application/octet-stream');
headers.append('Content-Length', '20971409');

const body = `[object File]`;

const init = {
  method: 'PUT',
  headers,
  body
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386&uploadPartNum=1', init)
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386&uploadPartNum=1'
    headers = {
        'Authorization': 'Bearer {your_access_token}',
        'Content-Type': 'application/octet-stream',
        'Content-Length': '20971409'
    }

    with open('/local/file/chunk1','rb') as body:
        req = requests.put(url, headers=headers, data=body)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Завершение загрузки файла по частям

Описание Метод для завершения загрузки файла по частям
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object?uploadId={uploadId}
Метод POST
Тип тела запроса application/json
Возвращает информацию о файле
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
Параметры
uploadId id события загрузки

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object?uploadId=5a2ea8b52973db0008e12386

Пример тела запроса

{
    "sha256": "679b2bbb21fed73103b22d99e5ce4103f3bdce0dd492e9dea54ec30269113bc0" // хеш-сумма файла (sha256)
}
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386 \
    -X POST \
    -d "{\"sha256\": \"4c0e8fd63af9a3fdd397aa1ed561f560cbfb34e7da66426ad1aaa139fe22a9d3\"}" \
    -H "Authorization: Bearer {your_access_token}" \
    -H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}');
headers.append('Content-Type', 'application/json');

const body = `{
  "sha256": "4c0e8fd63af9a3fdd397aa1ed561f560cbfb34e7da66426ad1aaa139fe22a9d3"
}`;

const init = {
  method: 'POST',
  headers,
  body
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386', init)
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386'
    headers = {
        'Authorization': 'Bearer {your_access_token}',
        'Content-Type': 'application/json',
    }


    body = """{
        "sha256": "4c0e8fd63af9a3fdd397aa1ed561f560cbfb34e7da66426ad1aaa139fe22a9d3"
    }"""

    req = requests.post(url, headers=headers, data=body)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Пример ответа

{
    "id": "5a2eac3b2973db0008e12388",
    "is_dir": false,
    "type": "file",
    "status": "ok",
    "name": "test.mp4",
    "path": "/test/test.mp4",
    "size": 387531,
    "content_type": "video/mp4",
    "description": "",
    "create_date": "20.09.2020T21:28:27",
    "latest_update": "20.09.2020T21:28:27",
    "private": false,
    "advanced": {...},
    "download_url": "test.cdn.ru/account/test/test.mp4,
    "hls": "video.platformcraft.ru/vod/video/5a2eac3b2973db0008e12388/playlist.m3u8"
}

Отмена загрузки файла по частям

Описание Отмена загрузки файла по частям
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object?uploadId={uploadId}
Метод DELETE
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
Параметры
uploadId id события загрузки

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object?uploadId=5a2ea8b52973db0008e12386
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386 \
    -X DELETE \
    -H "Authorization: Bearer {your_access_token}" \
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}');

const init = {
  method: 'DELETE',
  headers
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386', init)
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386'
    headers = {
        'Authorization': 'Bearer {your_access_token}',
    }

    req = requests.delete(url, headers=headers)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Получение информации о событии загрузки файла по частям

Описание Метод для получения информации о событии загрузки файла по частям
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object?uploaId={uploadId}
Метод GET
Возвращает информацию о событии загрузки (в формате JSON)
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
file_path путь файла в контейнере
Параметры
uploadId id события загрузки

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object?uploadId=5a2ea8b52973db0008e12386
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386 \
    -X GET \
    -H "Authorization: Bearer {your_access_token}" \
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}');

const init = {
  method: 'GET',
  headers
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386', init)
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
    import requests

    url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object?uploadId=5a2ea8b52973db0008e12386'
    headers = {
        'Authorization': 'Bearer {your_access_token}',
    }

    req = requests.get(url, headers=headers)

    print(req.status_code)
    print(req.headers)
    print(req.text)

Пример ответа

{
    "id": "5a2ea8b52973db0008e12386",
    "container_id": "5b30bc7c1658f770c3a2bf5c",
    "object_path": "/test/test.mp4",
    "created_at": 1513007285,
    "parts": [
    {
        "id": 0,
        "src": "5a2eaeb12973db0008e1238d_0",
        "size": 100000
    },
    {
        "id": 1,
        "src": "5a2eaeb12973db0008e1238d_1",
        "size": 100000
    }
}

Получение информации о файле или папке

Описание Метод для получения информации о файле или папке
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object{file_path}
Метод GET
Тип тела запроса application/json
Возвращает информацию о файле или папке в формате JSON
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
file_path путь файла в контейнере
Параметры пагинации
sort Параметр сортировки (необязательный). Возможные значения:
"name" - сортировка по имени (по возрастанию).
"-name" - сортировка по имени (по убыванию).
"time" - сортировка по времени (по возрастанию).
"-time" - сортировка по времени (по убыванию).
"size" - сортировка по размеру (по возрастанию).
"-size" - сортировка по размеру (по убыванию).
При любом значении параметра "sort" папки в листинге располагаются впереди файлов. Значение по умолчанию - "name".
limit Количество объектов на одной странице (необязательный). Значение по умолчанию - 5000. Макс. значение - 100000.
from Маркер начала следующей страницы (необязательный). Параметр "from" генерируется сервером автоматически в поле ответа "paging.next".
files_only При наличии параметра "files_only" в качестве содержимого папки будут возвращены только файлы.
dirs_only При наличии параметра "dirs_only" в качестве содержимого папки будут возвращены только папки.

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object/test?sort=-time&limit=1&files_only
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'GET',
    headers
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4', init) //Укажите свой {your_owner_ID} и путь к файлу после "/object/"
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4' #Укажите свой {your_owner_ID} и путь к файлу после "/object/"
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5accd99b1658f770c3a274ce",
    "status": "",
    "name": "test",
    "path": "/test",
    "size": 0,
    "content_type": "",
    "create_date": "",
    "latest_update": "",
    "private": false,
    "preview_url": "",
    "download_url": "",
    "contents": [
        {
            "id": "5accda6edc96bf0a90d8a0a5",
            "status": "ok",
            "name": "test.mp4",
            "path": "/test/test.mp4",
            "size": 2372804,
            "content_type": "video/mp4",
            "create_date": "10.04.2018T18:38:22",
            "latest_update": "10.04.2018T18:38:23",
            "private": false,
            "advanced": {
                "audio_streams": [
                    {
                        "bit_rate": 79473,
                        "channel_layout": "stereo",
                        "channels": 2,
                        "codec_long_name": "AAC (Advanced Audio Coding)",
                        "codec_name": "aac",
                        "codec_type": "audio",
                        "duration": 15.041,
                        "index": 1,
                        "language": "eng",
                        "sample_rate": 48000
                    }
                ],
                "format": {
                    "bit_rate": 1263810,
                    "duration": 15.02,
                    "format_long_name": "QuickTime / MOV",
                    "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
                    "nb_streams": 3
                },
                "video_streams": [
                    {
                        "bit_rate": 1417636,
                        "codec_name": "h264",
                        "codec_type": "video",
                        "codeclongname": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
                        "display_aspect_ratio": "0:1",
                        "duration": 15.05,
                        "fps": 23.97884755652808,
                        "height": 544,
                        "index": 0,
                        "width": 960
                    }
                ],
            },
            "preview_url": "originstack.cdnvideo.ru/5accda6edc96bf0a90d8a0a9",
            "download_url": "originstack.cdnvideo.ru/alexmurm/test/test.mp4"
        }
    ],
    "paging": {
        "count": 20,
        "count_on_page": 1,
        "next": "https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object?sort=-time&limit=1&from=f5accda6edc96bf0a90d8a0a5&files_only"
    }
}

Удаление файла или папки

Описание Метод удаляет файл или папку
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object{file_path}
Метод DELETE
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
file_path путь файла в контейнере

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object/test/test.mp4
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4" \
-X DELETE \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'DELETE',
    headers
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4', init) //Укажите свой {your_owner_ID} и путь к файлу после "/object/"
.then((response) => {
return response.json(); // or .text() or .blob() ...
})
.then((text) => {
// text is the response body
})
.catch((e) => {
// error in e.message
});
import requests

url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4' #Укажите свой {your_owner_ID} и путь к файлу после "/object/"
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.delete(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Изменение файла или папки

Описание Метод изменяет файл или папку
Структура URL https://filespot.platformcraft.ru/2/fs/container/{container_id}/object{file_path}
Метод PUT
Тип тела запроса application/json
Параметры URL
container_id ID контейнера соответсвует owner_ID из секции Авторизация
file_path путь файла в контейнере
Параметры
name имя
dir директория
description описание
private частный или нет
max_height максимальная высота
max_width максимальная ширина

Пример запроса

https://filespot.platformcraft.ru/2/fs/container/5b30bc7c1658f770c3a2bf5c/object/test/test.mp4

Пример тела запроса

{
    "name": "test_1.mp4"
}
curl "https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4" \
-X PUT \
-d "{\n  \"name\": \"test_name\",\n  \"description\": \"test description\",\n  \"private\": true\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
    headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой
    headers.append('Content-Type', 'application/json');

const body = `{
    "name": "test_name",
    "description": "test description",
    "private": true
}`;
/*
name - изменение имени файла/папки
dir - перемещение файла/папки
description - добавление описания к файлу
private - false/true закрывает и делает файлым доступным
max_height и max_width - задают максимально доступные значения изображения при ресайзе на лету
*/

const init = {
    method: 'PUT',
    headers,
    body
};

fetch('https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4', init) //Укажите свой {your_owner_ID} и путь к файлу после "/object/"
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://filespot.platformcraft.ru/2/fs/container/{your_owner_ID}/object/path/to/file.mp4' #Укажите свой {your_owner_ID} и путь к файлу после "/object/"
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свой
body = """{
    "name": "test_name",
    "description": "test description",
    "private": true
}"""
#name - изменение имени файла/папки
#dir - перемещение файла/папки
#description - добавление описания к файлу
#private - false/true закрывает и делает файлым доступным
#max_height и max_width - задают максимально доступные значения изображения при ресайзе на лету

req = requests.put(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Recorder (запись потоков)

    https://rec.platformcraft.ru

Создание потока

Описание Метод создания hls потока
Структура URL https://rec.platformcraft.ru/{owner_ID}
Метод POST
Тип тела запроса application/json
Возвращает Информацию о созданном потоке
Параметры
name имя потока
qualities словарь вида {"src": "quality"}, где src - источник потока, quality - качество потока.
src источник потока. Устаревший параметр, используйте qualities
parse_master если указан единственный источник потока (в параметре qualities или src), и это мастер-плейлист, разобрать его на составляющие медиа-плейлисты

Пример запроса с указанием каждого качества

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3

Пример тела запроса

{
    "name": "stream_name",
    "qualities": {
        "https://example.com/360p.m3u8": "360p",
        "https://example.com/480p.m3u8": "480p"
    }
}

Пример запроса с указанием мастер-плейлиста

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3

Пример тела запроса

{
    "name": "stream_name",
    "src": "https://example.com/playlist.m3u8",
    "parse_master": true

}
curl "https://rec.platformcraft.ru/{your_owner_ID}" \
    -X POST \
    -d "{\r\n    \"name\": \"stream_name\",\r\n    \"qualities\": {\r\n        \"https://example.com/360p.m3u8\": \"360p\",\r\n        \"https://example.com/480p.m3u8\": \"480p\"\r\n    }\r\n}" \
    -H "content-type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой
headers.append('Content-Type', 'application/json');

//Укажите имя и ссылку на поток. Добавлять можно только .m3u8 (HLS) потоки
const body = `{
"name": "stream_name",
"qualities": {
    "https://example.com/360p.m3u8": "360p",
    "https://example.com/480p.m3u8": "480p"
}
}`;

const init = {
    method: 'POST',
    headers,
    body
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}', init) //Укажите свой {your_owner_ID}
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}' #Укажите свой {your_owner_ID}
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свой

#Укажите имя и ссылку на поток. Добавлять можно только .m3u8 (HLS) потоки
body = """{
"name": "stream_name",
"qualities": {
    "https://example.com/360p.m3u8": "360p",
    "https://example.com/480p.m3u8": "480p"
}
}"""

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
   "id": "5c8d5174534b4427730ebf7f",
   "name": "stream_name",
   "qualities": {
        "https://example.com/360p.m3u8": "360p",
        "https://example.com/480p.m3u8": "480p",
   },
   "src": "https://example.com/360p.m3u8": "360p",
   "instant_record_id": "" // id мгновенной записи потока
}

Примечание

Существует 2 вида записи потока:

а. Мгновенная запись. Запускается с помощью метода "Старт мгновенной записи потока". Одновременно для одного потока может существовать только одна мгновенная запись.
б. Запись по расписанию. Создается с помощью метода "Создание записи по расписанию".

Изменение потока

Описание Метод изменения hls потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}
Метод PUT
Тип тела запроса application/json
Возвращает Информацию о потоке

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f

Пример тела запроса

{
    "name": "new_stream_name",
    "qualities": {
        "https://example.com/360p.m3u8": "good",
        "https://example.com/480p.m3u8": "excellent",
    }
}

Примечание

При изменении параметра qualities можно изменять только название качества потока. Источники потока неизменны.
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}" \
-X PUT \
-d "{\n  \"name\": \"aplemakh\"\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой
headers.append('Content-Type', 'application/json');

//Задайте новое название для потока
const body = `{
    "name": "new_name"
}`;

const init = {
    method: 'PUT',
    headers,
    body
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}', init) //Вместо {your_owner_ID} и {stream_id} укажите свои параметры
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
// error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}' #Вместо {your_owner_ID} и {stream_id} укажите свои параметры
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свой
#Задайте новое название для потока
body = """{
    "name": "new name"
}"""

req = requests.put(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5c8d5174534b4427730ebf7f",
    "name": "new_stream_name",
    "src": "https://example.com/playlist.m3u8",
    "instant_record_id": ""
}

Получение списка потоков

Описание Метод получения списка hls потоков
Структура URL https://rec.platformcraft.ru/{owner_ID}
Метод GET
Тип тела запроса -
Возвращает Информацию о потоках

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3
curl "https://rec.platformcraft.ru/{your_owner_ID}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'GET',
    headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}', init) //Вместо {your_owner_ID} укажите свой
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}' #Вместо {your_owner_ID} укажите свой
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

[
    {
        "id": "5c8d5174534b4427730ebf7f",
        "name": "new_stream_name",
        "qualities": {
            "https://example.com/360p.m3u8": "360p",
            "https://example.com/480p.m3u8": "480p",
        },
        "src": "https://example.com/playlist.m3u8", // устаревший параметр, соответствует одному из источников потока в qualities или мастер-плейлисту
        "instant_record_id": ""
    }
]

Получение информации о потоке

Описание Метод получения информации об одном hls потоке
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}
Метод GET
Тип тела запроса -
Возвращает Информацию о потоке

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'GET',
    headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}', init) //Вместо {your_owner_ID} и {stream_id} укажите свои значения
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}' #Вместо {your_owner_ID} и {stream_id} укажите свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5c8d5174534b4427730ebf7f",
    "name": "new_stream_name",
    "qualities": {
        "https://example.com/360p.m3u8": "360p",
        "https://example.com/480p.m3u8": "480p",
    },
    "src": "https://example.com/playlist.m3u8", // устаревший параметр, соответствует одному из источников потока в qualities
    "instant_record_id": ""
}

Удаление потока

Описание Метод удаления hls потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}
Метод DELETE
Тип тела запроса -
Возвращает -
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}" \
-X DELETE \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'DELETE',
    headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}', init) //Вместо {your_owner_ID} и {stream_id} укажите свои значения
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}' #Вместо {your_owner_ID} и {stream_id} укажите свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.delete(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Старт мгновенной записи потока

Описание Метод старта мгновенной записи hls потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/start
Метод POST
Тип тела запроса application/json
Возращает Информацию о потоке
Параметры
Обязательные:
path путь создаваемого видеофайла в формате "/container/{owner_ID}/object{object_path}
Необязательные:
email email клиента. Если указан email, на него будут приходить уведомительные письма о состоянии записи (только в случае проблем с потоком)
max_dur максимальная длительность записанного видеофайла в секундах (по умолчанию max_dur=2592000, т.е. 30 дней). Если продолжительность записи превышает max_dur, то в видеофайл будут записаны только последние max_dur секунд записи. Например: max_dur = 3600, продолжительность записи составила 7200 секунд (2 часа). Видеофайл будет содержать только последний час записи.
stop_timeout таймаут остановки записи в секундах (по умолчанию 1800, т.е. 30 минут). Если motion_record = true, то запись в видеофайл будет осуществляться в течение stop_timeout секунд после получения последней картинки через ftp сервер (см. параметр motion_record). Если motion_record = false, в случае, если поток не будет доступен для записи в течение stop_timeout секунд, запись будет остановлена (если events_record=false) или будет остановлена запись в видеофайл события (если events_record=true)
motion_record параметр логического типа (по умолчанию false). Запись по движению. Имеет приоритет над параметром events_record. Для записи по движению необходимо подключить программное обеспечение камеры к серверу ftp на rec.platformcraft.ru. Если true, то запись потока будет начата в момент, когда на сервер ftp будет отправлена картинка. Запись во вновь созданный файл прекратится по истечении stop_timeout секунд после получения последней картинки. Как только придет новая картинка по ftp, создастся новый видеофайл и запись продолжится.
events_record параметр логического типа (по умолчанию false). Событийная запись потока. Если false, то в случае проблем с записью в течение stop_timeout секунд, запись будет отключена совсем. Если true, то в случае проблем с записью в течение stop_timeout секунд, закончится запись потока в видеофайл, далее запись продолжится, ожидая возобновление потока. Как только поток станет вновь доступен, создастся новый видеофайл события. И т.д.

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/start

Пример тела запроса

{
    "path": "/container/567687df4f60c8cc3145cc03/object/test/test.m3u8",
    "email": "test@test.te",
    "max_dur": 3600,
    "stop_timeout": 600,
    "events_record": true
}
    curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/start" \
  -X POST \
  -d "{\n    \"path\": \"/container/{your_owner_ID}/object/path/to/file.m3u8\",\n     \"email\": \"your@email.com\",\n     \"max_dur\": 3600,\n     \"stop_timeout\": 600,\n     \"events_record\": false\n}" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const body = `{
    "path": "/container/{your_owner_ID}/object/path/to/file.m3u8",
     "email": "your@email.com",
     "max_dur": 3600,
     "stop_timeout": 600,
     "events_record": false
}`;
//Вместо {your_owner_ID} укажите свой. После "object" укажите желаемый путь и название файла.
//Название файла должно заканчиваться на .m3u8!

const init = {
  method: 'POST',
  headers,
  body
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/start', init) //Вместо {your_owner_ID} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/start' #Вместо {your_owner_ID} и {stream_id} укажите свои данные
headers = {'Content-Type': 'application/json','Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой
body = """{
    "path": "/container/{your_owner_ID}/object/path/to/file.m3u8",
     "email": "your@email.com",
     "max_dur": 3600,
     "stop_timeout": 600,
     "events_record": false
}"""
#Вместо {your_owner_ID} укажите свой. После "object" укажите желаемый путь и название файла.
#Название файла должно заканчиваться на .m3u8!

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5c8d5174534b4427730ebf7f",
    "name": "new_stream_name",
    "src": "https://example.com/playlist.m3u8",
    "instant_record_id": "5c8fbca0c1d1150001f7db76"
}

Остановка мгновенной записи потока

Описание Метод остановки мгновенной записи hls потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/stop
Метод POST
Тип тела запроса -
Возращает Информацию о записи

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/stop
    curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/stop" \
  -X POST \
  -H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const init = {
    method: 'POST',
    headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/stop', init) //Вместо {your_owner_ID} и {stream_id} укажите свои данные
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/stop' #Вместо {your_owner_ID} и {stream_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой

req = requests.post(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5c8fbca0c1d1150001f7db76",
    "src": "https://example.com/playlist.m3u8",
    "files": ["5c8fbca0d2901f0007ccfbe3"], // id записанных видеофайлов
    "start": 1552923808, // таймштамп старта записи
    "stop": 1552925156, // таймштамп остановки записи
    "max_dur": 3600,
    "status": "finish", // статус записи
    "msg": "", // информация об ошибке (только в случае ошибок в записи)
    "email": "test@test.te",
    "is_instant": true, // мгновенная запись или нет
    "stop_timeout": 600,
    "events_record": true // запись событий или нет (см. описание параметра events_record в п. "Старт мгновенной записи потока")
}

Создание записи по расписанию

Описание Метод создания записи hls потока по расписанию
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record
Метод POST
Тип тела запроса application/json
Возращает Информацию о записи потока
Параметры
Обязательные:
path путь создаваемого видеофайла в формате "/container/{owner_ID}/object{object_path}
start таймштамп времени начала записи
stop таймштамп времени окончания записи
Необязательные:
email email клиента. Если указан email, на него будут приходить уведомительные письма о состоянии записи (только в случае проблем с потоком)
max_dur максимальная длительность записанного видеофайла в секундах (по умолчанию max_dur=2592000, т.е. 30 дней). Если продолжительность записи превышает max_dur, то в видеофайл будут записаны только последние max_dur секунд записи. Например: max_dur = 3600, продолжительность записи составила 7200 секунд (2 часа). Видеофайл будет содержать только последний час записи.
stop_timeout таймаут остановки записи в секундах (по умолчанию 1800, т.е. 30 минут). Если motion_record = true, то запись в видеофайл будет осуществляться в течение stop_timeout секунд после получения последней картинки через ftp сервер (см. параметр motion_record). Если motion_record = false, в случае, если поток не будет доступен для записи в течение stop_timeout секунд, запись будет остановлена (если events_record=false) или будет остановлена запись в видеофайл события (если events_record=true)
motion_record параметр логического типа (по умолчанию false). Запись по движению. Имеет приоритет над параметром events_record. Для записи по движению необходимо подключить программное обеспечение камеры к серверу ftp на rec.platformcraft.ru. Если true, то запись потока будет начата в момент, когда на сервер ftp будет отправлена картинка. Запись во вновь созданный файл прекратится по истечении stop_timeout секунд после получения последней картинки. Как только придет новая картинка по ftp, создастся новый видеофайл и запись продолжится.
events_record параметр логического типа (по умолчанию false). Событийная запись потока. Если false, то в случае проблем с записью в течение stop_timeout секунд, запись будет отключена совсем. Если true, то в случае проблем с записью в течение stop_timeout секунд, закончится запись потока в видеофайл, далее запись продолжится, ожидая возобновление потока. Как только поток станет вновь доступен, создастся новый видеофайл события. И т.д.

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/record

{
    "path": "/container/567687df4f60c8cc3145cc03/object/test/test.m3u8",
    "start": 1600000000,
    "stop": 1600001000,
    "email": "test@test.te",
    "max_dur": 3600,
    "stop_timeout": 600,
    "events_record": true
}
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record" \
-X POST \
-d "{\n    \"path\": \"/container/{your_owner_ID}/object/path/to/file.m3u8\",\n    \"start\": {unix_start_time},\n    \"stop\":  {unix_stop_time}\n}" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свой

const body = `{
    "path": "/container/{your_owner_ID}/object/path/to/file.m3u8",
    "start": {unix_start_time},
    "stop":  {unix_stop_time}
}`;
//Дополнительные параметры:
//email - для отправки уведомлений, в случае проблем с потоком.
//max_dur - поток будет постоянно записываться в рамках указанного временного окна (DVR). Время указывается в секундах.
//stop_timeout - окно, в течение которого recorder ожидает устранение проблем с потоком. По истечении запись останавливается. Значение по умолчанию: 30 минут. Время указывается в секундах.
//events_record - используется для событийной записи, т.е. когда начинается публикация потока. Запись останавливается после окончания трансляции и истечении stop_timeout.

const init = {
    method: 'POST',
    headers,
    body
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record', init) //Вместо {your_owner_ID} и {stream_id} укажите свои данные
.then((response) => {
    return response.json(); // or .text() or .blob() ...
})
.then((text) => {
    // text is the response body
})
.catch((e) => {
    // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record' #Вместо {your_owner_ID} и {stream_id} укажите свои данные
headers = {'Content-Type': 'application/json','Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свой
body = """{
    "path": "/container/{your_owner_ID}/object/path/to/file.m3u8",
    "start": {unix_start_time},
    "stop":  {unix_stop_time}
}"""
#Дополнительные параметры:
#email - для отправки уведомлений, в случае проблем с потоком.
#max_dur - поток будет постоянно записываться в рамках указанного временного окна (DVR). Время указывается в секундах.
#stop_timeout - окно, в течение которого recorder ожидает устранение проблем с потоком. По истечении запись останавливается. Значение по умолчанию: 30 минут. Время указывается в секундах.
#events_record - используется для событийной записи, т.е. когда начинается публикация потока. Запись останавливается после окончания трансляции и истечении stop_timeout.

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5cc440f0534b4412ae69d6e3",
    "src": "https://example.com/playlist.m3u8",
    "files": null, // массив id созданных видеофайлов
    "start": 1556304586,
    "stop": 1556305586,
    "max_dur": 3600,
    "status": "wait", // статус записи (wait - ожидание, progress - выполнение, finish - запись завершена, error - произошла ошибка)
    "msg": "", // сообщение сервиса записи (в случае ошибки)
    "email": "test@test.te",
    "is_instant": false, // is_instant = true - мгновенная запись, is_instant = false - запись по расписанию
    "stop_timeout": 600,
    "motion_record": true,
    "events_record": false
}

Изменение записи по расписанию

Описание Метод изменения записи hls потока по расписанию
Структура URL URL: https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record/{record_id}
Метод PUT
Тип тела запроса application/json
Возвращает Информацию о записи потока
Примечание Изменять разрешено только записи, имеющие статус "wait"
Параметры тела запроса (все необязательные)
start таймштамп времени начала записи
stop таймштамп времени окончания записи
max_dur максимальная длительность записанного видеофайла в секундах
email email клиента

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/record/5cc440f0534b4412ae69d6e3

Пример тела запроса

{
    "path": "/container/567687df4f60c8cc3145cc03/object/test/test_2.m3u8",
    "start": 1556305586,
    "stop":  1556306586
}
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}" \
-X PUT \
-d "{\n    \"path\": \"/container/{your_owner_ID}/path/to/file.m3u8\",\n    \"start\": {unix_start_time},\n    \"stop\":  {unix_stop_time},\n    \"email\": \"test@test.ru\"\n}" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Authorization', 'Bearer {your_access_token}');

const body = `{
    "path": "/container/{your_owner_ID}/path/to/file.m3u8",
    "start": {unix_start_time},
    "stop":  {unix_stop_time},
    "email": "test@test.ru"
}`;
//Дополнительные параметры:
//max_dur - поток будет постоянно записываться в рамках указанного временного окна (DVR). Время указывается в секундах.
//stop_timeout - окно, в течение которого recorder ожидает устранение проблем с потоком. По истечении запись останавливается. Значение по умолчанию: 30 минут. Время указывается в секундах.
//events_record - используется для событийной записи, т.е. когда начинается публикация потока. Запись останавливается после окончания трансляции и истечении stop_timeout.

const init = {
  method: 'PUT',
  headers,
  body
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}', init) //Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}' #Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
headers = {'Content-Type': 'application/json','Authorization': 'Bearer {your_access_token}'}
body = """{
    "path": "/container/{your_owner_ID}/path/to/file.m3u8",
    "start": {unix_start_time},
    "stop":  {unix_stop_time},
    "email": "test@test.ru"
}"""
#Дополнительные параметры:
#max_dur - поток будет постоянно записываться в рамках указанного временного окна (DVR). Время указывается в секундах.
#stop_timeout - окно, в течение которого recorder ожидает устранение проблем с потоком. По истечении запись останавливается. Значение по умолчанию: 30 минут. Время указывается в секундах.
#events_record - используется для событийной записи, т.е. когда начинается публикация потока. Запись останавливается после окончания трансляции и истечении stop_timeout.

req = requests.put(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5cc440f0534b4412ae69d6e3",
    "src": "https://example.com/playlist.m3u8",
    "files": null, // массив id созданных видеофайлов
    "start": 1556305586,
    "stop": 1556306586,
    "max_dur": 3600,
    "status": "wait", // статус записи (wait - ожидание, progress - выполнение, finish - запись завершена, error - произошла ошибка)
    "msg": "", // сообщение сервиса записи (в случае ошибки)
    "email": "test@test.te",
    "is_instant": false, // is_instant = true - мгновенная запись, is_instant = false - запись по расписанию
    "stop_timeout": 600,
    "motion_record": true,
    "events_record": false
}

Получение списка записей потока

Описание Метод получения списка записей потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record
Метод GET
Тип тела запроса -
Возвращает Список записей потока

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/record
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите своё значение

const init = {
  method: 'GET',
  headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}', init) //Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}' #Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите своё значение

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

[
    {
        "id": "5cc440f0534b4412ae69d6e3",
        "src": "https://example.com/playlist.m3u8",
        "files": null, // массив id созданных видеофайлов
        "start": 1556305586,
        "stop": 1556306586,
        "max_dur": 3600,
        "status": "wait", // статус записи (wait - ожидание, progress - выполнение, finish - запись завершена, error - произошла ошибка)
        "msg": "", // сообщение сервиса записи (в случае ошибки)
        "email": "test@test.te",
        "is_instant": false, // is_instant = true - мгновенная запись, is_instant = false - запись по расписанию
        "stop_timeout": 600,
        "motion_record": true,
        "events_record": false
    }
]

Получение информации о записи

Описание Метод получения информации о записи по id
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record/{record_id}
Метод GET
Тип тела запроса -
Возвращает Информацию о записи потока

Пример запроса

https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/record/5cc440f0534b4412ae69d6e3
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите своё значение

const init = {
  method: 'GET',
  headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}', init) //Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}' #Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите своё значение

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5cc440f0534b4412ae69d6e3",
    "src": "https://example.com/playlist.m3u8",
    "files": null, // массив id созданных видеофайлов
    "start": 1556305586,
    "stop": 1556306586,
    "max_dur": 3600,
    "status": "wait", // статус записи (wait - ожидание, progress - выполнение, finish - запись завершена, error - произошла ошибка)
    "msg": "", // сообщение сервиса записи (в случае ошибки)
    "email": "test@test.te",
    "is_instant": false, // is_instant = true - мгновенная запись, is_instant = false - запись по расписанию
    "stop_timeout": 600,
    "motion_record": true,
    "events_record": false
}

Удаление записи потока

Описание Mетод удаления записи потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record/5cc440f0534b4412ae69d6e3
Метод DELETE
Тип тела запроса -
Возвращает -
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}" \
-X DELETE \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите своё значение

const init = {
  method: 'DELETE',
  headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}', init) //Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}' #Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите своё значение

req = requests.delete(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Остановка записи потока

Описание Метод остановки записи потока
Структура URL https://rec.platformcraft.ru/{owner_ID}/{stream_id}/record/{record_id}/stop
Метод POST
Тип тела запроса -
Возвращает Информацию о записи

Пример запроса

    https://rec.platformcraft.ru/56bdf4a53f4f716301b09ba3/5c8d5174534b4427730ebf7f/record/5cc440f0534b4412ae69d6e3/stop
curl "https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}/stop" \
-X POST \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите своё значение

const init = {
  method: 'POST',
  headers
};

fetch('https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}/stop', init) //Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://rec.platformcraft.ru/{your_owner_ID}/{stream_id}/record/{record_id}/stop' #Вместо {your_owner_ID}, {stream_id} и {stream_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите своё значение

req = requests.post(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5cc440f0534b4412ae69d6e3",
    "src": "https://example.com/playlist.m3u8",
    "files": ["5c8fbca0d2901f0007ccfbe3"],
    "start": 1556305586,
    "stop": 1556306586,
    "max_dur": 3600,
    "status": "finish",
    "msg": "",
    "email": "test@test.te",
    "is_instant": false,
    "stop_timeout": 600,
    "motion_record": true,
    "events_record": false
}

Streamer (вещание)

    https://streamer.platformcraft.ru/2/streams/

Создание канала

Описание Метод создания канала
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}
Метод POST
Тип тела запроса application/json
Возвращает Информацию о созданном канале

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3

Пример тела запроса

{
    "name":      "channel_name",                   # название канала (обязательный параметр)
    "qualities": ["360p", "480p"],                 # массив качеств канала (обязательный параметр). Возможные значения: "360p", "480p", "720p", "1080p", "2160p".
    "gag": {                                       # заглушка (необязательный параметр). Массивы id файлов необходимо указывать для каждого качества. Форматы файлов в заглушке должны соответствовать качествам канала.
        "360p": ["5e37d3ef534b444004244ebc"],
        "480p": ["5d5450de534b447a006cb748"]
    },
    "rtmp_publish": {                              # параметры rtmp-publish (необязательный параметр)
        "stream_name": "stream_name",              # название потока (обязательный параметр)
        "url":         "rtmp://test1.publish.com", # URL основного сервера публицка (обязательный параметр)
        "url_backup":  "rtmp://test2.publish.com", # URL резервного сервера публицка (необязательный параметр)
        "active":      true                        # активировать (true)/деактивировать (false) rtmp-publish
    }
}
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}" \
-X POST \
-d "{\n    \"name\":      \"{playlist_name}\",                   \n    \"qualities\": [\"360p\", \"480p\"]                \n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}');
headers.append('Content-Type', 'application/json');

const body = `{
    "name":      "{playlist_name}",
    "qualities": ["360p", "480p"]
}`;
//При необходимости добавьте параметры заглушки и URL принимающего RTMP-сервера

const init = {
  method: 'POST',
  headers,
  body
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}', init) //Вместо {your_owner_ID} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}' #Вместо {your_owner_ID} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свои данные
body = """{
    "name":      "{channel_name}",
    "qualities": ["360p", "480p"]
}"""
#При необходимости добавьте параметры заглушки и URL принимающего RTMP-сервера

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5ebbeb54534b447a810c52db",             # id канала
    "name": "channel_name",                       # имя канала
    "qualities": ["360p","480p"],                 # качества канала
    "gag": {                                      # заглушка
        "duration": 9,                            # продолжительность заглушки
        "items": {                                # файлы заглушки
            "360p": ["5e37d3ef534b444004244ebc"],
            "480p": ["5d5450de534b447a006cb748"]
        }
    },
    "rtmp_publish": {                             # настройки rtmp-publish
        "url": "rtmp://test1.publish.com",        # url основного сервера публикации
        "url_backup": "rtmp://test2.publish.com", # url резервного сервера публикации
        "stream_name": "stream_name",             # имя потока
        "active": true                            # активирован/деактивирован
    }
}

Получение списка каналов

Описание Метод получения списка каналов
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}
Метод GET
Тип тела запроса -
Возвращает Информацию о каналах

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'GET',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}', init) //Вместо {your_owner_ID} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}' #Вместо {your_owner_ID} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

[
    {
        "id": "5ebbeb54534b447a810c52db",             # id канала
        "name": "channel_name",                       # имя канала
        "qualities": ["360p","480p"],                 # качества канала
        "gag": {                                      # заглушка
            "duration": 9,                            # продолжительность заглушки
            "items": {                                # файлы заглушки
                "360p": ["5e37d3ef534b444004244ebc"],
                "480p": ["5d5450de534b447a006cb748"]
            }
        },
        "rtmp_publish": {                             # настройки rtmp-publish
            "url": "rtmp://test1.publish.com",        # url основного сервера публикации
            "url_backup": "rtmp://test2.publish.com", # url резервного сервера публикации
            "stream_name": "stream_name",             # имя потока
            "active": true                            # активирован/деактивирован
        }
    }
]

Получение информации о канале

Описание Метод получения информации об одном канале
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}
Метод GET
Тип тела запроса -
Возвращает Информацию о канале

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'GET',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}', init) //Вместо {your_owner_ID} и {channel_id} укажите свои данные
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}' #Вместо {your_owner_ID} и {channel_id} укажите свои данные
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5ebbeb54534b447a810c52db",             # id канала
    "name": "channel_name",                       # имя канала
    "qualities": ["360p","480p"],                 # качества канала
    "gag": {                                      # заглушка
        "duration": 9,                            # продолжительность заглушки
        "items": {                                # файлы заглушки
            "360p": ["5e37d3ef534b444004244ebc"],
            "480p": ["5d5450de534b447a006cb748"]
        }
    },
    "rtmp_publish": {                             # настройки rtmp-publish
        "url": "rtmp://test1.publish.com",        # url основного сервера публикации
        "url_backup": "rtmp://test2.publish.com", # url резервного сервера публикации
        "stream_name": "stream_name",             # имя потока
        "active": true                            # активирован/деактивирован
    }
}

Изменение канала

Описание Метод изменения канала
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}
Метод PUT
Тип тела запроса application/json
Возвращает Информацию о канале
Примечание В теле запроса нужно указывать только изменяемые поля

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db

Пример тела запроса

{
    "name": "new_channel_name",                    # имя канала
    "gag": {                                       # заглушка
        "360p": ["5e37d3ef534b444004244ebc"],
        "480p": ["5d5450de534b447a006cb748"]
    },
    "rtmp_publish": {                              # параметры rtmp-publish
        "stream_name": "stream_name",
        "url":         "rtmp://test1.publish.com",
        "url_backup":  "rtmp://test2.publish.com",
        "active":      true
    }
}
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}" \
-X PUT \
-d "{\n    \"name\": \"new_channel_name\"\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные
headers.append('Content-Type', 'application/json');

const body = `{
    "name": "new_channel_name"
}`;
//При необходимости добавьте параметры заглушки и URL принимающего RTMP-сервера

const init = {
  method: 'PUT',
  headers,
  body
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}', init) //Вместо {your_owner_ID} и {channel_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}' #Вместо {your_owner_ID} и {channel_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свои данные
body = """{
    "name": "new_channel_name"
}"""
#При необходимости добавьте параметры заглушки и URL принимающего RTMP-сервера

req = requests.put(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    "id": "5ebbeb54534b447a810c52db",             # id канала
    "name": "channel_name",                       # имя канала
    "qualities": ["360p","480p"],                 # качества канала
    "gag": {                                      # заглушка
        "duration": 9,                            # продолжительность заглушки
        "items": {                                # файлы заглушки
            "360p": ["5e37d3ef534b444004244ebc"],
            "480p": ["5d5450de534b447a006cb748"]
        }
    },
    "rtmp_publish": {                             # настройки rtmp-publish
        "url": "rtmp://test1.publish.com",        # url основного сервера публикации
        "url_backup": "rtmp://test2.publish.com", # url резервного сервера публикации
        "stream_name": "stream_name",             # имя потока
        "active": true                            # активирован/деактивирован
    }
}

Удаление канала

Описание Метод удаления канала
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}
Метод DELETE
Тип тела запроса -
Возвращает -
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}" \
-X DELETE \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'DELETE',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}', init) //Вместо {your_owner_ID} и {channel_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}' #Вместо {your_owner_ID} и {channel_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.delete(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Медиаблоки

Создание медиаблока

Описание Метод создания медиаблока (без публикации в эфир)
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block
Метод POST
Тип тела запроса application/json
Возвращает Информацию о созданном медиаблоке

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db/block

Пример тела запроса

{
    "name": "block_name",    # название медиаблока
    "timestamp": 1589407535, # таймштамп начала медиаблока (обязательный параметр)
    "loop": true,            # проигрывать медиаблок по кругу
    "items": {               # файлы (обязательный параметр). Словарь вида {"качество": [массив id видеофайлов]}. Файлы должны быть указаны для каждого качества канала. Длительности видеофайлов с одинковым порядковым номером в массивах должны совпадать.
        "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
        "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
    },
    "status": "ready"        # статус медиаблока. Возможные значения: "ready" (блок готов к публикации и будет проверен на корректность данных) и "not ready" (блок не готов к публикации и не будет проверен на корректность данных).
}
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block" \
-X POST \
-d "{\n    \"name\": \"block_name\",    \n    \"timestamp\": 1589407535, \n    \"loop\": true,            \n    \"items\": {               \n        \"360p\": [\"5e37d3ef534b444004244ebc\",\"5e37d3ef534b444004244ebd\"],\n        \"480p\": [\"5d5450de534b447a006cb748\",\"5d5450de534b447a006cb749\"]\n    },\n    \"status\": \"ready\"\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные
headers.append('Content-Type', 'application/json');

const body = `{
    "name": "{block_name}",
    "timestamp": {unix_start_time},
    "loop": true,
    "items": {
        "360p": ["{video_id_1}","{video_id_2}"],
        "480p": ["{video_id_1}","{video_id_2}"]
    },
    "status": "ready"
}`;
//Подставьте свои значения вместо значений, указанных в фигурных скобках

const init = {
  method: 'POST',
  headers,
  body
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block', init) //Вместо {your_owner_ID} и {channel_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block' #Вместо {your_owner_ID} и {channel_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свои данные
body = """{
    "name": "block_name",
    "timestamp": {unix_start_time},
    "loop": true,
    "items": {
        "360p": ["{video_id_1}","{video_id_2}"],
        "480p": ["{video_id_1}","{video_id_2}"]
    },
    "status": "ready"
}"""
#Подставьте свои значения вместо значений, указанных в фигурных скобках

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    id: "5ebc6f3d534b44024f51d456",         # id медиаблока
    name: "block_name",
    channel_id: "5ebbedf6534b44024f51d453", # id канала
    duration: 235,                          # длительность медиаблока (высчитывается только для блока со статусом "ready")
    items: {                                # файлы
        "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
        "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
    },
    loop: true,                             # зацикленность
    status: "ready",                        # статус
    timestamp: 1589407535,                  # таймштамп начала медиаблока
    stop_ts: 1589407770                     # таймштамп окончания медиаблока
}

Изменение медиаблока

Описание Метод для изменения медиаблока
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}
Метод PUT
Тип тела запроса application/json
Возвращает Информацию об измененном медиаблоке
Примечание Запрещено изменять медиаблоки со статусами "start" или "wait". В теле запроса нужно указывать только изменяемые поля.

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db/block/5ebc6f3d534b44024f51d456

Пример тела запроса

{
    "name": "new_block_name",    # название медиаблока
    "timestamp": 1589407536,     # таймштамп начала медиаблока (обязательный параметр)
    "loop": true,                # проигрывать медиаблок по кругу
    "items": {                   # файлы (обязательный параметр). Словарь вида {"качество": [массив id видеофайлов]}. Файлы должны быть указаны для каждого качества канала. Длительности видеофайлов с одинковым порядковым номером в массивах должны совпадать.
        "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
        "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
    },
    "status": "ready"            # статус медиаблока. Возможные значения: "ready" (блок готов к публикации и будет проверен на корректность данных) и "not ready" (блок не готов к публикации и не будет проверен на корректность данных).
}
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}" \
-X PUT \
-d "{\n    \"name\": \"new_block_name\"\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные
headers.append('Content-Type', 'application/json');

const body = `{
    "name": "new_block_name"
}`;
//При необходимости добавьте другие параметры

const init = {
  method: 'PUT',
  headers,
  body
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} укажите свои данные
body = """{
    "name": "new_block_name"
}"""
#При необходимости добавьте другие параметры

req = requests.put(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    id: "5ebc6f3d534b44024f51d456",         # id медиаблока
    name: "new_block_name",
    channel_id: "5ebbedf6534b44024f51d453", # id канала
    duration: 235,                          # длительность медиаблока (высчитывается только для блока со статусом "ready")
    items: {                                # файлы
        "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
        "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
    },
    loop: true,                             # зацикленность
    status: "ready",                        # статус
    timestamp: 1589407536,                  # таймштамп начала медиаблока
    stop_ts: 1589407770                     # таймштамп окончания медиаблока
}

Получение списка медиаблоков

Описание Метод для получения списка медиаблоков
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block
Метод GET
Тип тела запроса -
Возвращает Список медиаблоков канала

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db/block
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'GET',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block', init) //Вместо {your_owner_ID} и {channel_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block' #Вместо {your_owner_ID} и {channel_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

[
    {
        id: "5ebc6f3d534b44024f51d456",         # id медиаблока
        name: "block_name",
        channel_id: "5ebbedf6534b44024f51d453", # id канала
        duration: 235,                          # длительность медиаблока (высчитывается только для блока со статусом "ready")
        items: {                                # файлы
            "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
            "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
        },
        loop: true,                             # зацикленность
        status: "ready",                        # статус
        timestamp: 1589407536,                  # таймштамп начала медиаблока
        stop_ts: 1589407770                     # таймштамп окончания медиаблока
    }
]

Получение информации о медиаблоке

Описание Метод для получения информации о медиаблоке
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}
Метод GET
Тип тела запроса -
Возвращает Информацию о медиаблоке

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db/block/5ebc6f3d534b44024f51d456
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}" \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'GET',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.get(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

{
    id: "5ebc6f3d534b44024f51d456",         # id медиаблока
    name: "block_name",
    channel_id: "5ebbedf6534b44024f51d453", # id канала
    duration: 235,                          # длительность медиаблока (высчитывается только для блока со статусом "ready")
    items: {                                # файлы
        "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
        "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
    },
    loop: true,                             # зацикленность
    status: "ready",                        # статус
    timestamp: 1589407536,                  # таймштамп начала медиаблока
    stop_ts: 1589407770                     # таймштамп окончания медиаблока
}

Удаление медиаблока

Описание Метод для удаления медиаблока
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}
Метод DELETE
Тип тела запроса -
Возвращает -
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}" \
-X DELETE \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'DELETE',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.delete(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Мгновенный старт медиаблока

Описание Метод мгновенного старта вещания медиаблока
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}/start
Метод POST
Тип тела запроса -
Возвращает -
Примечание Медиаблок должен быть готов к публикации (status != "not ready"). Если в момент мгновенного старта медиаблока в эфире уже находится какой-либо медиаблок, то стартуемый медиаблок вытеснит старый из эфира.
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/start" \
-X POST \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', '{your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'POST',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/start', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/start' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.post(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Остановка медиаблока

Описание Метод для принудительной остановки медиаблока в эфире
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}/stop
Метод POST
Тип тела запроса -
Возвращает -
Примечание Если медиаблок находится в эфире (status = "start") или в режиме ожидания (status = "wait"), то он будет снят с эфира, а его статус изменится на "finish". Для других значений статуса медиаблока ("not ready", "ready", "finish") метод игнорируется.
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/stop" \
-X POST \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'POST',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/stop', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/stop' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.post(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Публикация медиаблока

Описание Метод для публикации медиаблока в эфире
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}/schedule
Метод POST
Тип тела запроса -
Возвращает -
Примечание Медиаблок должен быть готов к публикации (status != "not ready").
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/schedule" \
-X POST \
-H "Authorization: Bearer {your_access_token}"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} укажите свои данные

const init = {
  method: 'POST',
  headers
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/schedule', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/schedule' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}'} #Вместо {your_access_token} укажите свои данные

req = requests.post(url, headers=headers)

print(req.status_code)
print(req.headers)
print(req.text)

Копирование медиаблока

Описание Метод для создания копий медиаблока
Структура URL https://streamer.platformcraft.ru/2/streams/{owner_ID}/{channel_id}/block/{block_id}/copy
Метод POST
Тип тела запроса application/json
Возвращает Список скопированных медиаблоков

Пример запроса

https://streamer.platformcraft.ru/2/streams/56bdf4a53f4f716301b09ba3/5ebbeb54534b447a810c52db/block/5ebc6f3d534b44024f51d456/copy

Пример тела запроса

{
    "name": "copy_block_name",  # имя скопированных медиаблоков
    "timestamps": [1589539452], # список таймштампов, соответствующих началу скопированных медиаблоков
    "publish": false            # публиковать или нет скопированные медиаблоки
}
curl "https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/copy" \
-X POST \
-d "{\n    \"name\": \"{copy_block_name}\",\n    \"timestamps\": [{unix_start_time}],\n    \"publish\": false\n}" \
-H "Authorization: Bearer {your_access_token}" \
-H "Content-Type: application/json"
const headers = new Headers();
headers.append('Authorization', 'Bearer {your_access_token}'); //Вместо {your_access_token} подставьте своё значение
headers.append('Content-Type', 'application/json');

const body = `{
    "name": "{copy_block_name}",
    "timestamps": [{unix_start_time}],
    "publish": false
}`;
//Подставьте свои значения вместо значений, указанных в фигурных скобках

const init = {
  method: 'POST',
  headers,
  body
};

fetch('https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/copy', init) //Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
.then((response) => {
  return response.json(); // or .text() or .blob() ...
})
.then((text) => {
  // text is the response body
})
.catch((e) => {
  // error in e.message
});
import requests

url = 'https://streamer.platformcraft.ru/2/streams/{your_owner_ID}/{channel_id}/block/{block_id}/copy' #Вместо {your_owner_ID}, {channel_id} и {block_id} подставьте свои значения
headers = {'Authorization': 'Bearer {your_access_token}','Content-Type': 'application/json'} #Вместо {your_access_token} подставьте своё значение
body = """{
    "name": "{copy_block_name}",
    "timestamps": [{unix_start_time}],
    "publish": false
}"""
#Подставьте свои значения вместо значений, указанных в фигурных скобках

req = requests.post(url, headers=headers, data=body)

print(req.status_code)
print(req.headers)
print(req.text)

Пример ответа

[
    {
        id: "5ebc6f3d534b44024f51d457",         # id медиаблока
        name: "new_block_name",
        channel_id: "5ebbedf6534b44024f51d453", # id канала
        duration: 235,                          # длительность медиаблока (высчитывается только для блока со статусом "ready")
        items: {                                # файлы
            "360p": ["5e37d3ef534b444004244ebc","5e37d3ef534b444004244ebd"],
            "480p": ["5d5450de534b447a006cb748","5d5450de534b447a006cb749"]
        },
        loop: true,                             # зацикленность
        status: "ready",                        # статус
        timestamp: 1589539452,                  # таймштамп начала медиаблока
        stop_ts: 1589539687                     # таймштамп окончания медиаблока
    }
]