Ограничения
Обращаем ваше внимание, что для сервисов "auth", "filespot", "streamer" и "recorder" выставлен лимит: не более 10 запросов в секунду.
Авторизация
https://auth.platformcraft.ru
Для передачи данных авторизации используется стандарт JWT. Схема авторизации:
-
Клиент проходит авторизацию в приложении (с использованием логина и пароля, см. "Получение refresh и access токенов").
-
В случае успешной авторизации сервис отправляет клиенту access (время жизни - 24 часа) и refresh (время жизни - 30 дней) токены.
-
При дальнейшем обращении к сервису клиент использует access токен. Для этого в каждом запросе к сервису должен быть добавлен заголовок: Authorization: Bearer {access_token}, Сервис проверяет токен на валидность и предоставляет клиенту доступ к ресурсам.
-
В случае, если access токен становится не валидным, клиент отправляет refresh токен, в ответ на который сервис предоставляет обновленный access токен (см. "Обновление access токена").
-
В случае, если 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", вместо файла создается папка, возвращается null) |
Пример запроса
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) |
Ограничение на размер файла | 100 Гб |
Грейды RPS | по умолчанию: 10, по запросу: 20, 40, 50, 70, 100 |
Параметры URL | |
container_id | ID контейнера соответсвует owner_ID из секции Авторизация |
Пример запроса
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, на него будут приходить уведомительные письма о состоянии записи (только в случае проблем с потоком) | |
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, на него будут приходить уведомительные письма о состоянии записи (только в случае проблем с потоком) | |
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 клиента |
Пример запроса
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 # таймштамп окончания медиаблока
}
]