def test_get_transcript_content_store_exceptions(self, exception_to_raise, mock_Transcript): """ Verify that `get_transcript_from_contentstore` function raises `NotFoundError` when specified exceptions raised. """ mock_Transcript.asset.side_effect = exception_to_raise transcripts_info = self.video.get_transcripts_info() lang = self.video.get_default_transcript_language(transcripts_info) with self.assertRaises(NotFoundError): transcripts_utils.get_transcript_from_contentstore( self.video, language=lang, output_format=transcripts_utils.Transcript.SRT, transcripts_info=transcripts_info)
def test_get_transcript_content_store_exceptions(self, exception_to_raise, mock_Transcript): """ Verify that `get_transcript_from_contentstore` function raises `NotFoundError` when specified exceptions raised. """ mock_Transcript.asset.side_effect = exception_to_raise transcripts_info = self.video.get_transcripts_info() lang = self.video.get_default_transcript_language(transcripts_info) with self.assertRaises(NotFoundError): transcripts_utils.get_transcript_from_contentstore( self.video, language=lang, output_format=transcripts_utils.Transcript.SRT, transcripts_info=transcripts_info )
def async_migrate_transcript_subtask(self, *args, **kwargs): #pylint: disable=unused-argument """ Migrates a transcript of a given video in a course as a new celery task. """ video, language_code, force_update = args commit = kwargs['commit'] result = None if commit is not True: return 'Language {0} transcript of video {1} will be migrated'.format( language_code, video.edx_video_id ) LOGGER.info("[Transcript migration] process for %s transcript started", language_code) try: transcript_info = video.get_transcripts_info() transcript_content, _, _ = get_transcript_from_contentstore( video, language_code, Transcript.SJSON, transcript_info) edx_video_id = clean_video_id(video.edx_video_id) if not edx_video_id: video.edx_video_id = create_external_video('external-video') video.save_with_metadata(user=User.objects.get(username='******')) if edx_video_id: result = save_transcript_to_storage( edx_video_id, language_code, transcript_content, Transcript.SJSON, force_update ) except (NotFoundError, TranscriptsGenerationException, ValCannotCreateError) as exc: LOGGER.exception('[Transcript migration] Exception: %r', text_type(exc)) return 'Failed: language {language} of video {video} with exception {exception}'.format( language=language_code, video=video.edx_video_id, exception=text_type(exc) ) LOGGER.info("[Transcript migration] process for %s transcript ended", language_code) if result is not None: return 'Success: language {0} of video {1}'.format(language_code, video.edx_video_id) else: return 'Failed: language {0} of video {1}'.format(language_code, video.edx_video_id)
def async_migrate_transcript_subtask(self, *args, **kwargs): #pylint: disable=unused-argument """ Migrates a transcript of a given video in a course as a new celery task. """ video, language_code, force_update = args commit = kwargs['commit'] result = None if commit is not True: return 'Language {0} transcript of video {1} will be migrated'.format( language_code, video.edx_video_id) LOGGER.info("[Transcript migration] process for %s transcript started", language_code) try: transcript_info = video.get_transcripts_info() transcript_content, _, _ = get_transcript_from_contentstore( video, language_code, Transcript.SJSON, transcript_info) edx_video_id = clean_video_id(video.edx_video_id) if not edx_video_id: video.edx_video_id = create_external_video('external-video') video.save_with_metadata(user=User.objects.get(username='******')) if edx_video_id: result = save_transcript_to_storage(edx_video_id, language_code, transcript_content, Transcript.SJSON, force_update) except (NotFoundError, TranscriptsGenerationException, ValCannotCreateError) as exc: LOGGER.exception('[Transcript migration] Exception: %r', text_type(exc)) return 'Failed: language {language} of video {video} with exception {exception}'.format( language=language_code, video=video.edx_video_id, exception=text_type(exc)) LOGGER.info("[Transcript migration] process for %s transcript ended", language_code) if result is not None: return 'Success: language {0} of video {1}'.format( language_code, video.edx_video_id) else: return 'Failed: language {0} of video {1}'.format( language_code, video.edx_video_id)
def async_migrate_transcript_subtask(self, *args, **kwargs): # pylint: disable=unused-argument """ Migrates a transcript of a given video in a course as a new celery task. """ success, failure = 'Success', 'Failure' video_location, revision, language_code, force_update = args command_run = kwargs['command_run'] store = modulestore() video = store.get_item( usage_key=BlockUsageLocator.from_string(video_location), revision=revision) edx_video_id = clean_video_id(video.edx_video_id) if not kwargs['commit']: LOGGER.info( ('[%s] [run=%s] [video-transcript-will-be-migrated] ' '[revision=%s] [video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) return success LOGGER.info(( '[%s] [run=%s] [transcripts-migration-process-started-for-video-transcript] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) try: transcripts_info = video.get_transcripts_info() transcript_content, _, _ = get_transcript_from_contentstore( video=video, language=language_code, output_format=Transcript.SJSON, transcripts_info=transcripts_info, ) is_video_valid = edx_video_id and is_video_available(edx_video_id) if not is_video_valid: edx_video_id = create_external_video('external-video') video.edx_video_id = edx_video_id # determine branch published/draft branch_setting = (ModuleStoreEnum.Branch.published_only if revision == ModuleStoreEnum.RevisionOption.published_only else ModuleStoreEnum.Branch.draft_preferred) with store.branch_setting(branch_setting): store.update_item(video, ModuleStoreEnum.UserID.mgmt_command) LOGGER.info( '[%s] [run=%s] [generated-edx-video-id] [revision=%s] [video=%s] [edx_video_id=%s] [language_code=%s]', MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) save_transcript_to_storage( command_run=command_run, edx_video_id=edx_video_id, language_code=language_code, transcript_content=transcript_content, file_format=Transcript.SJSON, force_update=force_update, ) except (NotFoundError, TranscriptsGenerationException, ValCannotCreateError): LOGGER.exception(( '[%s] [run=%s] [video-transcript-migration-failed-with-known-exc] [revision=%s] [video=%s] ' '[edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) return failure except Exception: LOGGER.exception(( '[%s] [run=%s] [video-transcript-migration-failed-with-unknown-exc] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) raise LOGGER.info(( '[%s] [run=%s] [video-transcript-migration-succeeded-for-a-video] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code) return success
def async_migrate_transcript_subtask(self, *args, **kwargs): # pylint: disable=unused-argument """ Migrates a transcript of a given video in a course as a new celery task. """ success, failure = 'Success', 'Failure' video_location, revision, language_code, force_update = args command_run = kwargs['command_run'] store = modulestore() video = store.get_item(usage_key=BlockUsageLocator.from_string(video_location), revision=revision) edx_video_id = clean_video_id(video.edx_video_id) if not kwargs['commit']: LOGGER.info( ('[%s] [run=%s] [video-transcript-will-be-migrated] ' '[revision=%s] [video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) return success LOGGER.info( ('[%s] [run=%s] [transcripts-migration-process-started-for-video-transcript] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) try: transcripts_info = video.get_transcripts_info() transcript_content, _, _ = get_transcript_from_contentstore( video=video, language=language_code, output_format=Transcript.SJSON, transcripts_info=transcripts_info, ) is_video_valid = edx_video_id and is_video_available(edx_video_id) if not is_video_valid: edx_video_id = create_external_video('external-video') video.edx_video_id = edx_video_id # determine branch published/draft branch_setting = ( ModuleStoreEnum.Branch.published_only if revision == ModuleStoreEnum.RevisionOption.published_only else ModuleStoreEnum.Branch.draft_preferred ) with store.branch_setting(branch_setting): store.update_item(video, ModuleStoreEnum.UserID.mgmt_command) LOGGER.info( '[%s] [run=%s] [generated-edx-video-id] [revision=%s] [video=%s] [edx_video_id=%s] [language_code=%s]', MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) save_transcript_to_storage( command_run=command_run, edx_video_id=edx_video_id, language_code=language_code, transcript_content=transcript_content, file_format=Transcript.SJSON, force_update=force_update, ) except (NotFoundError, TranscriptsGenerationException, ValCannotCreateError): LOGGER.exception( ('[%s] [run=%s] [video-transcript-migration-failed-with-known-exc] [revision=%s] [video=%s] ' '[edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) return failure except Exception: LOGGER.exception( ('[%s] [run=%s] [video-transcript-migration-failed-with-unknown-exc] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) raise LOGGER.info( ('[%s] [run=%s] [video-transcript-migration-succeeded-for-a-video] [revision=%s] ' '[video=%s] [edx_video_id=%s] [language_code=%s]'), MIGRATION_LOGS_PREFIX, command_run, revision, video_location, edx_video_id, language_code ) return success
def async_migrate_transcript_subtask(self, *args, **kwargs): # pylint: disable=unused-argument """ Migrates a transcript of a given video in a course as a new celery task. """ video_location, language_code, force_update = args store = modulestore() video = store.get_item(usage_key=BlockUsageLocator.from_string(video_location)) commit = kwargs['commit'] if not commit: return 'Language {language_code} transcript of video {edx_video_id} will be migrated'.format( language_code=language_code, edx_video_id=video.edx_video_id ) # Start transcript's migration edx_video_id = clean_video_id(video.edx_video_id) LOGGER.info( "[Transcript migration] migration process is started for video [%s] language [%s].", edx_video_id, language_code ) try: transcripts_info = video.get_transcripts_info() transcript_content, _, _ = get_transcript_from_contentstore( video=video, language=language_code, output_format=Transcript.SJSON, transcripts_info=transcripts_info, ) if not edx_video_id: edx_video_id = create_external_video('external-video') video.edx_video_id = edx_video_id store.update_item(video, ModuleStoreEnum.UserID.mgmt_command) save_transcript_to_storage( edx_video_id=edx_video_id, language_code=language_code, transcript_content=transcript_content, file_format=Transcript.SJSON, force_update=force_update, ) except (NotFoundError, TranscriptsGenerationException, ValCannotCreateError) as exc: LOGGER.exception( '[Transcript migration] transcript migration failed for video [%s] and language [%s].', edx_video_id, language_code ) message = 'Failed: language {language} of video {video} with exception {exception}'.format( language=language_code, video=video.edx_video_id, exception=text_type(exc) ) except Exception: LOGGER.exception( '[Transcript migration] transcript migration failed for video [%s] and language [%s].', edx_video_id, language_code ) raise else: message = ( 'Success: transcript (language: {language_code}, edx_video_id: {edx_video_id}) has been migrated ' 'for video [{location}].' ).format(edx_video_id=edx_video_id, language_code=language_code, location=unicode(video.location)) return message