Добавить обработку исключений регулирования - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно добавить некоторый код для обработки превышения лимита регулирования, превышающего исключения, которые будут реализовывать время ожидания между попытками повторения. Например, 60 секунд ожидания перед повторной попыткой запустить задание транскрипции.

Я пытался увеличить количество попыток повторных попыток, но не уверен, как изменить время попытки повторной попытки.

import logging
import os
import re
import urllib.parse

import boto3
from botocore.config import Config

SUPPORTED_MEDIA_FORMATS = {"flac", "mp3", "mp4", "wav"}

# Logger setup
formatter = logging.Formatter('%(asctime)-15s %(message)s')

log = logging.getLogger()
log.setLevel(logging.DEBUG)

# Console log handler
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)
log.addHandler(console)

log.info('Loading the handler')

# AWS setup
region = boto3.session.Session().region_name
transcribe = boto3.client('transcribe', config=Config(retries={"max_attempts": 2}))


class ThrottlingException(Exception):
    pass


class UnsupportedMediaFormat(ValueError):
    pass


def handler(event, context):
    # Gets ENV variables
    output_bucket = os.environ['TRANSCRIPTION_BUCKET']

    # Get the object from the event and show its content type
    s3obj = event['Records'][0]['s3']
    source_bucket = s3obj['bucket']['name']
    source_file = urllib.parse.unquote_plus(s3obj['object']['key'], encoding='utf-8')
    source_file_format = re.search('\\.(\\w{3,4})$', source_file).group(1)

    # Raises UnsupportedMediaFormat error if the format is unsupported by AWS Transcribe
    __check_media_format_supported(source_file_format)

    # Formats S3 url
    source_url = __build_s3url(bucket=source_bucket, key=source_file)

    # Formats the output key
    output_key = re.sub(r'\s', '.', source_file)

    # Starts transcription job
    __start_transcription_job(source_url, source_file_format, output_bucket, output_key)


def __build_s3url(region: str = region, bucket: str = None, key: str = ''):
    """
    Formats URL to download the file from S3 by provided bucket and the key
    :param region:
    :param bucket:
    :param key:
    :return:
    """
    return f"https://s3-{region}.amazonaws.com/{bucket}/{key}"


def __check_media_format_supported(media_format):
    """
    Ensures provided media_format is supported by Transcribe, throws UnsupportedMediaFormat otherwise

    :param media_format:
    :return:
    """
    if media_format not in SUPPORTED_MEDIA_FORMATS:
        raise UnsupportedMediaFormat(f"{media_format} is not supported audio type.")


def raises_throttling_exception(decorable):
    """
    Decorates transcribe exceptions with the ThrottlingException

    :param decorable:
    :return:
    """

    def decorator(**kwargs):
        value = None
        try:
            value = decorable(kwargs)
        except (transcribe.exceptions.BadRequestException,
                transcribe.exceptions.LimitExceededException,
                transcribe.exceptions.ClientError) as e:
            raise ThrottlingException(e)
        return value

    return decorator


# Throttling exception wrapper is optional
@raises_throttling_exception
def __start_transcription_job(source_url: str, source_format: str, to_bucket: str, to_key: str, lang='en-US') -> str:
    """
    Starts transcription job

    :param source_url:
    :param source_format:
    :param to_bucket:
    :param lang:
    :return:
    """

    # Requests transcription job.
    response = transcribe.start_transcription_job(
        TranscriptionJobName=to_key,
        LanguageCode=lang,
        OutputBucketName=to_bucket,
        MediaFormat=source_format,
        Media={
            'MediaFileUri': source_url
        },
        Settings={
            'ShowSpeakerLabels': True,
            'MaxSpeakerLabels': 10,
            'ChannelIdentification': False
        }
    )

    return response['TranscriptionJob']['TranscriptionJobName']

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

...