diff --git a/common/lib/xmodule/xmodule/video_module/video_module.py b/common/lib/xmodule/xmodule/video_module/video_module.py
index a02231318d..ad8a7533c4 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 1f215e4ae6..3174dd115b 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"""
+
+ """
+
+ case_data = {
+ 'download_video': 'true',
+ 'source': 'example_source.mp4',
+ 'sources': """
+
+ """,
+ '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'])