diff --git a/common/lib/xmodule/xmodule/video_module/video_module.py b/common/lib/xmodule/xmodule/video_module/video_module.py index a02231318dcacabe1d6e2b896d5e8c4a214d942c..ad8a7533c4227df53ba8a8673ac0112bb273f1de 100644 --- a/common/lib/xmodule/xmodule/video_module/video_module.py +++ b/common/lib/xmodule/xmodule/video_module/video_module.py @@ -225,6 +225,7 @@ class VideoModule(VideoFields, VideoTranscriptsMixin, VideoStudentViewHandlers, branding_info = None youtube_streams = "" video_duration = None + video_status = None # Determine if there is an alternative source for this video # based on user locale. This exists to support cases where @@ -271,6 +272,7 @@ class VideoModule(VideoFields, VideoTranscriptsMixin, VideoStudentViewHandlers, # get video duration video_data = edxval_api.get_video_info(self.edx_video_id.strip()) video_duration = video_data.get('duration') + video_status = video_data.get('status') except (edxval_api.ValInternalError, edxval_api.ValVideoNotFoundError): # VAL raises this exception if it can't find data for the edx video ID. This can happen if the @@ -285,7 +287,7 @@ class VideoModule(VideoFields, VideoTranscriptsMixin, VideoStudentViewHandlers, if getattr(self, 'video_speed_optimizations', True) and cdn_url: branding_info = BrandingInfoConfig.get_config().get(self.system.user_location) - if self.edx_video_id and edxval_api: + if self.edx_video_id and edxval_api and video_status != u'external': for index, source_url in enumerate(sources): new_url = rewrite_video_url(cdn_url, source_url) if new_url: diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py index 1f215e4ae64455e8b08590b35aaa6d1b305ee8d8..3174dd115b2994f45f38f2362397d7c984444ced 100644 --- a/lms/djangoapps/courseware/tests/test_video_mongo.py +++ b/lms/djangoapps/courseware/tests/test_video_mongo.py @@ -903,6 +903,109 @@ class TestGetHtmlMethod(BaseTestXmodule): self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context) ) + # pylint: disable=invalid-name + def test_get_html_cdn_source_external_video(self): + """ + Test that video from an external source loads successfully. + + For a video from a third part, which has 'external' status + in the VAL, the url-rewrite will not happen and URL will + remain unchanged in the get_html() method. + """ + + source_xml = u""" + <video show_captions="true" + display_name="A Name" + sub="a_sub_file.srt.sjson" source="{source}" + download_video="{download_video}" + edx_video_id="{edx_video_id}" + start_time="01:00:03" end_time="01:00:10" + > + {sources} + </video> + """ + + case_data = { + 'download_video': 'true', + 'source': 'example_source.mp4', + 'sources': """ + <source src="http://example.com/example.mp4"/> + """, + 'result': { + 'download_video_link': u'example_source.mp4', + 'sources': [ + u'http://example.com/example.mp4', + ], + }, + } + + cases = [ + dict(case_data, edx_video_id="vid-v1:12345"), + ] + + initial_context = { + 'autoadvance_enabled': False, + 'branding_info': None, + 'license': None, + 'bumper_metadata': 'null', + 'cdn_eval': False, + 'cdn_exp_group': None, + 'display_name': u'A Name', + 'download_video_link': None, + 'handout': None, + 'id': None, + 'metadata': self.default_metadata_dict, + 'track': None, + 'transcript_download_format': u'srt', + 'transcript_download_formats_list': [ + {'display_name': 'SubRip (.srt) file', 'value': 'srt'}, + {'display_name': 'Text (.txt) file', 'value': 'txt'} + ], + 'poster': 'null', + } + initial_context['metadata']['duration'] = None + + for data in cases: + DATA = source_xml.format( + download_video=data['download_video'], + source=data['source'], + sources=data['sources'], + edx_video_id=data['edx_video_id'], + ) + self.initialize_module(data=DATA) + + # Mocking the edxval API call because if not done, + # the method throws exception as no VAL entry is found + # for the corresponding edx-video-id + with patch('edxval.api.get_video_info') as mock_get_video_info: + mock_get_video_info.return_value = { + 'url': 'http://example.com/example.mp4', + 'edx_video_id': u'vid-v1:12345', + 'status': u'external', + 'duration': None, + 'client_video_id': u'external video', + 'encoded_videos': {} + } + context = self.item_descriptor.render(STUDENT_VIEW).content + expected_context = dict(initial_context) + expected_context['metadata'].update({ + 'transcriptTranslationUrl': self.get_handler_url('transcript', 'translation/__lang__'), + 'transcriptAvailableTranslationsUrl': self.get_handler_url('transcript', 'available_translations'), + 'publishCompletionUrl': self.get_handler_url('publish_completion', ''), + 'saveStateUrl': self.item_descriptor.xmodule_runtime.ajax_url + '/save_user_state', + 'sources': data['result'].get('sources', []), + }) + expected_context.update({ + 'id': self.item_descriptor.location.html_id(), + 'download_video_link': data['result'].get('download_video_link'), + 'metadata': json.dumps(expected_context['metadata']) + }) + + self.assertEqual( + context, + self.item_descriptor.xmodule_runtime.render_template('video.html', expected_context) + ) + @ddt.data( (True, ['youtube', 'desktop_webm', 'desktop_mp4', 'hls']), (False, ['youtube', 'desktop_webm', 'desktop_mp4'])