INTEGRITY Документация

Скачивание видео или аудио

При загрузке видео в Stream его можно транслировать через HLS/DASH. Однако для некоторых сценариев может понадобиться скачать файл MP4 или M4A. Например, для просмотра в офлайн-режиме удобнее скачать файл MP4. А для последующих задач, например для создания краткого содержания с помощью ИИ, если нужно извлечь только аудио, полезнее скачать файл M4A.

Создание файлов MP4 для скачивания

Вы можете включить поддержку MP4 для отдельных видео, выполнив следующие шаги:

  1. Включите поддержку MP4, отправив POST-запрос к /downloads или /downloads/default конечная точка.
  2. Сохраните URL-адрес MP4-файла, который возвращает эндпоинт в ответе. Этот URL-адрес станет рабочим, когда MP4-файл будет готов на следующем шаге.
  3. Опрашивайте /downloads эндпоинт, пока status поле имеет значение ready чтобы сообщить о готовности MP4. Теперь вы можете использовать URL MP4 из шага 2.

Вы можете включить загрузку для загруженного видео, как только оно будет готово к просмотру, отправив HTTP-запрос к /downloads или /downloads/default конечная точка.

Чтобы получать уведомления о готовности видео к просмотру, см. Использование webhooks.

curl -X POST \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads
const client = new Cloudflare({
	apiEmail: process.env['CLOUDFLARE_EMAIL'],
	apiKey: process.env['CLOUDFLARE_API_KEY'],
});

const download = await client.stream.downloads.create({
	account_id: '<ACCOUNT_ID>',
	identifier: '<VIDEO_UID>',
});

Ответ включает тип загрузки, URL и статус обработки:

{
	"result": {
    "default": {
			"status": "inprogress",
			"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4",
			"percentComplete": 75.0
		}
	},
	"success": true,
	"errors": [],
	"messages": []
}

Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.

export default {
	async fetch(request, env) {
		const videoHandle = env.STREAM.video("VIDEO_ID");
		const downloads = await videoHandle.downloads.generate();
		return Response.json(downloads);
	},
};
{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "<ENTER_WORKER_NAME>",
	"main": "src/index.ts",
	"compatibility_date": "$today",
	"observability": {
		"enabled": true
	},
	"stream": {
		"binding": "STREAM"
	}
}

Ознакомьтесь с полным Справочник API привязки Workers Stream.

Создание файлов M4A для скачивания

Чтобы включить поддержку M4A для отдельного видео, выполните действия, похожие на генерацию загрузки MP4, но отправьте запрос POST на /downloads/audio конечная точка.

curl -X POST \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads/audio
const client = new Cloudflare({
	apiEmail: process.env['CLOUDFLARE_EMAIL'],
	apiKey: process.env['CLOUDFLARE_API_KEY'],
});

const download = await client.stream.downloads.audio.create({
	account_id: '<ACCOUNT_ID>',
	identifier: '<VIDEO_UID>',
});

Ответ включает тип загрузки, URL и статус обработки:

{
	"result": {
    "audio": {
			"status": "inprogress",
			"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/audio.m4a",
			"percentComplete": 75.0
		}
	},
	"success": true,
	"errors": [],
	"messages": []
}

Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.

export default {
	async fetch(request, env) {
		const videoHandle = env.STREAM.video("VIDEO_ID");
		const downloads = await videoHandle.downloads.generate("audio");
		return Response.json(downloads);
	},
};
{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "<ENTER_WORKER_NAME>",
	"main": "src/index.ts",
	"compatibility_date": "$today",
	"observability": {
		"enabled": true
	},
	"stream": {
		"binding": "STREAM"
	}
}

Ознакомьтесь с полным Справочник API привязки Workers Stream.

Вы можете просмотреть все доступные загрузки для видео, выполнив GET HTTP-запрос к API загрузок.

curl -X GET \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads
const client = new Cloudflare({
	apiEmail: process.env['CLOUDFLARE_EMAIL'],
	apiKey: process.env['CLOUDFLARE_API_KEY'],
});

const downloads = await client.stream.downloads.get({
	account_id: '<ACCOUNT_ID>',
	identifier: '<VIDEO_UID>',
});
Ответ
{
	"result": {
    "audio": {
			"status": "ready",
			"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/audio.m4a",
			"percentComplete": 100.0
		}
		"default": {
			"status": "ready",
			"url": "https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4",
			"percentComplete": 100.0
		}
	},
	"success": true,
	"errors": [],
	"messages": []
}

Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.

export default {
	async fetch(request, env) {
		const videoHandle = env.STREAM.video("VIDEO_ID");
		const downloads = await videoHandle.downloads.get();
		return Response.json(downloads);
	},
};
{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "<ENTER_WORKER_NAME>",
	"main": "src/index.ts",
	"compatibility_date": "$today",
	"observability": {
		"enabled": true
	},
	"stream": {
		"binding": "STREAM"
	}
}

Ознакомьтесь с полным Справочник API привязки Workers Stream.

Настройка имени файла загрузки

Вы можете задать имя загружаемых файлов, добавив filename параметр строки запроса в конце URL.

В примере ниже добавление ?filename=MY_VIDEO.mp4 к URL изменит имя файла на MY_VIDEO.mp4.

https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4?filename=MY_VIDEO.mp4

filename может содержать не более 120 символов и состоять из abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ символов. Расширение (.mp4) добавляется автоматически.

Получение загрузок

Сформированные файлы MP4 для скачивания можно получить по ссылке в ответе download API.

curl -L https://customer-<CODE>.cloudflarestream.com/<VIDEO_UID>/downloads/default.mp4 > download.mp4

Удаление загрузок

Вы можете удалить загрузку для видео. Доступные типы: default и audio. По умолчанию используется default если не указано.

curl -X DELETE \
-H "Authorization: Bearer <API_TOKEN>" \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/<VIDEO_UID>/downloads/default
const client = new Cloudflare({
	apiEmail: process.env['CLOUDFLARE_EMAIL'],
	apiKey: process.env['CLOUDFLARE_API_KEY'],
});

await client.stream.downloads.default.delete({
	account_id: '<ACCOUNT_ID>',
	identifier: '<VIDEO_UID>',
});

Ознакомьтесь с полным Stream Справочник REST API и SDK для получения сведений об использовании REST API из внешних приложений: для TypeScript, Python и Go предусмотрены готовые SDK.

export default {
	async fetch(request, env) {
		const videoHandle = env.STREAM.video("VIDEO_ID");
		await videoHandle.downloads.delete();
		return new Response("Download deleted", { status: 200 });
	},
};
{
	"$schema": "node_modules/wrangler/config-schema.json",
	"name": "<ENTER_WORKER_NAME>",
	"main": "src/index.ts",
	"compatibility_date": "$today",
	"observability": {
		"enabled": true
	},
	"stream": {
		"binding": "STREAM"
	}
}

Ознакомьтесь с полным Справочник API привязки Workers Stream.

Защищённая загрузка видео

Если ваше видео публичное, MP4-файл также будет общедоступен. Если видео приватное и требует подписанного URL для просмотра, MP4-файл не будет общедоступен. Чтобы получить доступ к MP4-файлу приватного видео, можно создать подписанный URL так же, как для обычного просмотра, добавив дополнительный флаг downloadable имеет значение true.

Вы можете создать подписанный токен с помощью Stream binding:

export default {
	async fetch(request, env) {
		const token = await env.STREAM.video("VIDEO_ID").generateToken();
		return Response.json({ token });
	},
};

Ссылки для скачивания не будут работать для видео, которые уже требуют подписанных URL, если downloadable флаг отсутствует в токене.

Подробнее об использовании подписанных URL-адресов для видео см. в Защита Stream.

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

{
    "sub": <VIDEO_UID>,
    "kid": <KEY_ID>,
    "exp": 1537460365,
    "nbf": 1537453165,
    "downloadable": true,
    "accessRules": [
      {
        "type": "ip.geoip.country",
        "action": "allow",
        "country": [
          "GB"
        ]
      },
      {
        "type": "any",
        "action": "block"
      }
    ]
  }

Тарификация загрузки MP4

Загрузки MP4 оплачиваются так же, как и показ видео. За каждую загрузку MP4-файла видео взимается плата за его продолжительность. Например, если у вас есть 10-минутное видео, которое за месяц скачали 100 раз, эти загрузки будут учтены как 1000 минут по показателю «minutes served».

При включении MP4 дополнительная плата за хранение не взимается.