def embed_media_url(self, job_id):
        """
        Create cielo24 add media url.

        Arguments:
            job_id (str): cielo24 job id

        Returns:
            cielo24 task id
        """
        media_url = build_url(self.cielo24_api_base_url,
                              self.cielo24_add_media,
                              v=CIELO24_API_VERSION,
                              job_id=job_id,
                              api_token=self.api_key,
                              media_url=self.s3_video_url)
        response = requests.get(media_url)

        if not response.ok:
            raise Cielo24AddMediaError(
                '[ADD MEDIA ERROR] url={} -- status={} -- text={}'.format(
                    scrub_query_params(media_url, ['api_token']),
                    response.status_code, response.text))

        task_id = ast.literal_eval(response.text)['TaskId']
        LOGGER.info(
            '[CIELO24] Media url created for video=%s with job_id=%s and task_id=%s',
            self.video.studio_id, job_id, task_id)
        return task_id
    def create_job(self):
        """
        Create new job for transcription.

        Returns:
            cielo24 job id
        """
        create_job_url = build_url(self.cielo24_api_base_url,
                                   self.cielo24_new_job,
                                   v=CIELO24_API_VERSION,
                                   language=self.video.source_language,
                                   api_token=self.api_key,
                                   job_name=self.video.studio_id)
        response = requests.get(create_job_url)

        if not response.ok:
            raise Cielo24CreateJobError(
                '[CREATE JOB ERROR] url={} -- status={} -- text={}'.format(
                    scrub_query_params(create_job_url, ['api_token']),
                    response.status_code,
                    response.text,
                ))

        job_id = ast.literal_eval(response.text)['JobId']
        LOGGER.info('[CIELO24] New job created for video=%s with job_id=%s',
                    self.video.studio_id, job_id)
        return job_id
    def get_available_languages(self):
        """
        Gets all the 3Play Media supported languages
        """
        available_languages_url = build_url(self.base_url,
                                            self.available_languages_url,
                                            apikey=self.api_key)
        response = requests.get(url=available_languages_url)
        if not response.ok:
            raise ThreePlayMediaLanguagesRetrievalError(
                'Error while retrieving available languages: url={url} -- {response} -- {status}'
                .format(url=scrub_query_params(available_languages_url,
                                               ['apikey']),
                        response=response.text,
                        status=response.status_code))

        # A normal response should be a list containing 3Play Media supported languages and if we're getting a dict,
        # there must be an error: https://support.3playmedia.com/hc/en-us/articles/227729968-Captions-Imports-API
        available_languages = json.loads(response.text)
        if isinstance(available_languages, dict):
            raise ThreePlayMediaLanguagesRetrievalError(
                'Expected 3Play Media Supported languages but got: {response}'.
                format(response=response.text))

        return available_languages
    def perform_transcript(self, job_id, lang_code):
        """
        Request cielo24 to generate transcripts for a video.
        """
        callback_url = '{}?job_id={}&iwp_name={}&lang_code={}&org={}&video_id={}'.format(
            self.callback_base_url, job_id, '{iwp_name}', lang_code, self.org,
            self.video.studio_id)

        perform_transcript_url = build_url(
            self.cielo24_api_base_url,
            self.cielo24_perform_transcription,
            v=CIELO24_API_VERSION,
            job_id=job_id,
            target_language=lang_code,
            callback_url=callback_url,
            api_token=self.api_key,
            priority=self.turnaround,
            transcription_fidelity=self.fidelity,
            options=json.dumps({"return_iwp": ["FINAL"]}))
        response = requests.get(perform_transcript_url)

        if not response.ok:
            raise Cielo24PerformTranscriptError(
                '[PERFORM TRANSCRIPT ERROR] url={} -- status={} -- text={}'.
                format(
                    scrub_query_params(perform_transcript_url, ['api_token']),
                    response.status_code, response.text))

        task_id = ast.literal_eval(response.text)['TaskId']
        LOGGER.info(
            '[CIELO24] Perform transcript request successful for video=%s with job_id=%s and task_id=%s',
            self.video.studio_id, job_id, task_id)
        return job_id
def get_translation_services(api_key):
    """
    GET available 3Play Media Translation services

    Arguments:
        api_key(unicode): api key which is required to make an authentic call to 3Play Media

    Returns:
        Available 3Play Media Translation services.
    """
    get_translation_services_url = build_url(
        THREE_PLAY_TRANSLATION_SERVICES_URL, apikey=api_key)
    response = requests.get(get_translation_services_url)
    if not response.ok:
        raise TranscriptTranslationError(
            u'[3PlayMedia Callback] Error fetching the translation services -- url={url}, {status}, {response}'
            .format(
                url=scrub_query_params(get_translation_services_url,
                                       ['apikey']),
                status=response.status_code,
                response=response.text,
            ))

    # Response should be a list containing services, details:
    # http://support.3playmedia.com/hc/en-us/articles/227729988-Translations-API-Methods
    available_services = json.loads(response.text)
    if not isinstance(available_services, list):
        raise TranscriptTranslationError(
            u'[3PlayMedia Callback] Expected list but got: -- {response}.'.
            format(response=response.text, ))

    return available_services
def get_translations_metadata(api_key, file_id, edx_video_id):
    """
    Get translations metadata from 3Play Media for a given file id.

    Arguments:
        api_key(unicode): api key
        file_id(unicode): file identifier or process identifier
        edx_video_id(unicode): video studio identifier

    Returns:
        A List containing the translations metadata for a file id or None
        in case of a faulty response.
        Example:
        [
            {
                "id": 1234,
                "translation_service_id": 12,
                "source_language_name": "English",
                "source_language_iso_639_1_code": "en",
                "target_language_name": "French (Canada)",
                "target_language_iso_639_1_code": "fr",
                "state": "complete"
            },
            {
                "id": 1345,
                "translation_service_id": 32,
                "source_language_name": "English",
                "source_language_iso_639_1_code": "en",
                "target_language_name": "German",
                "target_language_iso_639_1_code": "de",
                "state": "in_progress"
            }
        ]
    """
    translations_metadata_url = build_url(
        THREE_PLAY_TRANSLATIONS_METADATA_URL.format(file_id=file_id, ),
        apikey=api_key)
    translations_metadata_response = requests.get(translations_metadata_url)
    if not translations_metadata_response.ok:
        LOGGER.error(
            u'[3PlayMedia Task] Translations metadata request failed, url=%s -- video=%s -- process_id=%s -- status=%s',
            scrub_query_params(translations_metadata_url, ['apikey']),
            edx_video_id,
            file_id,
            translations_metadata_response.status_code,
        )
        return

    translations = json.loads(translations_metadata_response.text)
    if not isinstance(translations, list):
        LOGGER.error(
            u'[3PlayMedia Task] unable to get translations metadata for video=%s -- process_id=%s -- response=%s',
            edx_video_id,
            file_id,
            translations_metadata_response.text,
        )
        return

    return translations
 def test_scrub_query_params(self, url, params_to_scrub, expected_url):
     """
     Tests that utils.scrub_query_params works as expected.
     """
     self.assertEqual(
         utils.scrub_query_params(url, params_to_scrub),
         expected_url
     )
 def test_scrub_query_params(self, url, params_to_scrub,
                             expected_scrubbed_value):
     """
     Tests that utils.scrub_query_params works as expected.
     """
     scrubed_url = utils.scrub_query_params(url, params_to_scrub)
     if expected_scrubbed_value:
         self.assertIn(expected_scrubbed_value, scrubed_url)
def fetch_srt_data(url, **request_params):
    """
    Fetch srt data from transcript provider.
    """
    # return TRANSCRIPT_SRT_DATA
    fetch_srt_data_url = build_url(url, **request_params)
    response = requests.get(fetch_srt_data_url)

    if not response.ok:
        raise TranscriptFetchError(
            '[TRANSCRIPT FETCH ERROR] url={} -- status={} -- text={}'.format(
                scrub_query_params(fetch_srt_data_url,
                                   ['apikey', 'api_token']),
                response.status_code, response.text))

    return response.text