Измените файл .m3u8, чтобы подписать каждый URL-адрес с помощью Cloudfront

Я изо всех сил пытаюсь прочитать файл .m3u8 в Javascript и изменить его сегменты, чтобы они были подписаны Cloudfront для потоковой передачи содержимого hls.

const s3ObjectKey = `${folderName}/${folderName}.m3u8`;
    const url = `${process.env.CLOUDFRONT_DOMAIN}/${s3ObjectKey}`;
    const privateKey = fs.readFileSync(
      new URL("../private_key.pem", import.meta.url),
      {
        encoding: "utf8",
      }
    );
    const keyPairId = process.env.CLOUDFRONT_KEY_PAIR_ID;
    const dateLessThan = new Date(new Date().getTime() + 60 * 60000);
    const m3u8Url = cloudfrontSignedUrl({
      url,
      keyPairId,
      dateLessThan,
      privateKey,
    });

После того, как я получу подписанный m3u8Url, мне нужно изменить его сегменты, чтобы они были подписаны.

Любая помощь будет оценена.

Пробовали Шака Плеер?

ashraf minhaj 07.01.2023 18:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Форма ответа Блог AWS пост

import boto3
import os


KEY_PREFIX = os.environ.get('KEY_PREFIX')
S3_BUCKET = os.environ.get('S3_BUCKET')
SEGMENT_FILE_EXT = os.environ.get('SEGMENT_FILE_EXT', '.ts')

required_vars = [KEY_PREFIX, S3_BUCKET]
if not all(required_vars):
    raise KeyError(f'Missing required environment variable/s. Required vars {required_vars}.')


s3 = boto3.client('s3')


def lambda_handler(event, context):
    try:
        s3_key = event['pathParameters']['proxy']
        obj = s3.get_object(Bucket=S3_BUCKET, Key=s3_key)

        body = obj['Body'].read().decode('utf-8')
        qp = event['queryStringParameters']

        params = ['?']
        # reconstruct query param uri
        [(params.append(p.replace(KEY_PREFIX, '') + '=' + qp[p] + "&")) for p in qp if KEY_PREFIX in p]
        sign_params = ''.join(params).rstrip("&")

        # append query params to each segment
        resp_body = body.replace(SEGMENT_FILE_EXT, ''.join([SEGMENT_FILE_EXT, sign_params]))

        return {
            'statusCode': 200,
            'body': resp_body
        }
    except Exception as e:
        print(e)

    return {'statusCode': 500, 'body': ''}

Давайте рассмотрим ключевые области в коде Python:

  • KEY_PREFIX переменная среды — это шаблон префикса, который Lambda использует для идентификации параметров запроса CloudFront. В моем примере это -ПРЕФИКС.
  • S3_BUCKET переменная окружения имя корзины S3, к которой Lambda будет отправлять запрос на получение основного манифеста.

Примечание. Для иллюстрации я использовал переменную среды, которая устанавливается, например, при создании лямбда-функции. Ты можешь измените эту часть, чтобы иметь логику поиска, что особенно полезно если у вас есть разные корзины S3, которые используются для хранения мультимедиа содержание.

Эта функция Lambda получает файл манифеста в его исходной форме из вашей корзины S3 и изменяет его таким образом, что когда проигрыватель отправляет запрос на получение следующего сегмента, запрос уже включает подписанные CloudFront параметры запроса URL-адреса. Это позволяет ограничить доступ к видеоконтенту на основе разрешений пользователя для каждого видео. Рисунок 6 иллюстрирует манифест до и после модификации.

Другие вопросы по теме