Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
626f2896
Commit
626f2896
authored
May 11, 2017
by
muhammad-ammar
Committed by
Mushtaq Ali
Jul 06, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add video poster support
EDUCATOR-44
parent
763f0051
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
177 additions
and
108 deletions
+177
-108
cms/djangoapps/contentstore/views/tests/test_videos.py
+1
-1
cms/static/js/views/video_thumbnail.js
+5
-2
cms/static/sass/views/_video-upload.scss
+5
-0
common/lib/xmodule/xmodule/js/fixtures/video_hls.html
+1
-1
common/lib/xmodule/xmodule/js/fixtures/video_html5.html
+1
-1
common/lib/xmodule/xmodule/js/spec/video/html5_video_spec.js
+33
-1
common/lib/xmodule/xmodule/js/src/video/02_html5_video.js
+9
-1
common/lib/xmodule/xmodule/js/src/video/03_video_player.js
+1
-0
common/lib/xmodule/xmodule/video_module/video_module.py
+4
-1
lms/djangoapps/courseware/tests/test_video_mongo.py
+117
-100
No files found.
cms/djangoapps/contentstore/views/tests/test_videos.py
View file @
626f2896
...
...
@@ -13,7 +13,7 @@ import ddt
import
pytz
from
django.conf
import
settings
from
django.test.utils
import
override_settings
from
edxval.api
import
create_profile
,
create_video
,
get_video_info
from
edxval.api
import
create_profile
,
create_video
,
get_video_info
,
get_course_video_image_url
from
mock
import
Mock
,
patch
from
contentstore.models
import
VideoUploadConfig
...
...
cms/static/js/views/video_thumbnail.js
View file @
626f2896
...
...
@@ -28,7 +28,7 @@ define(
icon
:
''
,
text
:
HtmlUtils
.
interpolateHtml
(
// Translators: This is a 3 part text which tells the image requirements.
gettext
(
'Image requirements
{lineBreak} 1280px by 720px {lineBreak} .jpg | .png |
.gif'
),
gettext
(
'Image requirements
: {lineBreak} 1280px by 720px {lineBreak} .jpg, .png, or
.gif'
),
{
lineBreak
:
HtmlUtils
.
HTML
(
'<br>'
)
}
...
...
@@ -208,7 +208,10 @@ define(
this
.
$
(
'.thumbnail-action .action-icon'
),
HtmlUtils
.
HTML
(
this
.
actionsInfo
[
action
].
icon
)
);
this
.
$
(
'.thumbnail-action .action-text'
).
html
(
this
.
actionsInfo
[
action
].
text
);
HtmlUtils
.
setHtml
(
this
.
$
(
'.thumbnail-action .action-text'
),
HtmlUtils
.
HTML
(
this
.
actionsInfo
[
action
].
text
)
);
this
.
$
(
'.thumbnail-action .action-text-sr'
).
text
(
additionalSRText
||
''
);
this
.
$
(
'.thumbnail-wrapper'
).
attr
(
'class'
,
'thumbnail-wrapper {action}'
.
replace
(
'{action}'
,
action
));
},
...
...
cms/static/sass/views/_video-upload.scss
View file @
626f2896
...
...
@@ -147,6 +147,11 @@
}
.assets-library
{
.js-table-body
.video-id-col
{
word-break
:
break-all
;
}
.assets-title
{
display
:
inline-block
;
width
:
flex-grid
(
5
,
9
);
...
...
common/lib/xmodule/xmodule/js/fixtures/video_hls.html
View file @
626f2896
...
...
@@ -4,7 +4,7 @@
<div
id=
"video_id"
class=
"video closed"
data-metadata=
'{"autohideHtml5": "true", "autoplay": "false", "captionDataDir": "", "endTime": "", "generalSpeed": "1.0", "saveStateUrl": "/save_user_state", "savedVideoPosition": "0", "showCaptions": "true", "sources": ["/base/fixtures/hls/hls.m3u8", "/base/fixtures/test.mp4","/base/fixtures/test.webm"], "speed": "1.5", "startTime": "", "streams": "", "sub": "Z5KLxerq05Y", "transcriptAvailableTranslationsUrl": "/transcript/available_translations", "transcriptLanguage": "en", "transcriptLanguages": {"en": "English", "de": "Deutsch", "zh": "普通话"}, "transcriptTranslationUrl": "/transcript/translation/__lang__", "ytApiUrl": "/base/fixtures/youtube_iframe_api.js", "ytImageUrl": "", "ytTestTimeout": "1500", "ytMetadataUrl": "www.googleapis.com/youtube/v3/videos/", "source": ""}'
data-metadata=
'{"autohideHtml5": "true", "autoplay": "false", "captionDataDir": "", "endTime": "", "generalSpeed": "1.0", "saveStateUrl": "/save_user_state", "savedVideoPosition": "0", "showCaptions": "true", "sources": ["/base/fixtures/hls/hls.m3u8", "/base/fixtures/test.mp4","/base/fixtures/test.webm"], "speed": "1.5", "startTime": "", "streams": "", "sub": "Z5KLxerq05Y", "transcriptAvailableTranslationsUrl": "/transcript/available_translations", "transcriptLanguage": "en", "transcriptLanguages": {"en": "English", "de": "Deutsch", "zh": "普通话"}, "transcriptTranslationUrl": "/transcript/translation/__lang__", "ytApiUrl": "/base/fixtures/youtube_iframe_api.js", "ytImageUrl": "", "ytTestTimeout": "1500", "ytMetadataUrl": "www.googleapis.com/youtube/v3/videos/", "source": ""
, "poster": "/media/video-images/poster.png"
}'
>
<div
class=
"focus_grabber first"
></div>
...
...
common/lib/xmodule/xmodule/js/fixtures/video_html5.html
View file @
626f2896
...
...
@@ -4,7 +4,7 @@
<div
id=
"video_id"
class=
"video closed"
data-metadata=
'{"autohideHtml5": "true", "autoplay": "false", "captionDataDir": "", "endTime": "", "generalSpeed": "1.0", "saveStateUrl": "/save_user_state", "savedVideoPosition": "0", "showCaptions": "true", "sources": ["/base/fixtures/test.mp4","/base/fixtures/test.webm","/base/fixtures/test.ogv"], "speed": "1.5", "startTime": "", "streams": "", "sub": "Z5KLxerq05Y", "transcriptAvailableTranslationsUrl": "/transcript/available_translations", "transcriptLanguage": "en", "transcriptLanguages": {"en": "English", "de": "Deutsch", "zh": "普通话"}, "transcriptTranslationUrl": "/transcript/translation/__lang__", "ytApiUrl": "/base/fixtures/youtube_iframe_api.js", "ytImageUrl": "", "ytTestTimeout": "1500", "ytMetadataUrl": "www.googleapis.com/youtube/v3/videos/", "source": "", "html5_sources": ["http://youtu.be/3_yD_cEKoCk.mp4"]}'
data-metadata=
'{"autohideHtml5": "true", "autoplay": "false", "captionDataDir": "", "endTime": "", "generalSpeed": "1.0", "saveStateUrl": "/save_user_state", "savedVideoPosition": "0", "showCaptions": "true", "sources": ["/base/fixtures/test.mp4","/base/fixtures/test.webm","/base/fixtures/test.ogv"], "speed": "1.5", "startTime": "", "streams": "", "sub": "Z5KLxerq05Y", "transcriptAvailableTranslationsUrl": "/transcript/available_translations", "transcriptLanguage": "en", "transcriptLanguages": {"en": "English", "de": "Deutsch", "zh": "普通话"}, "transcriptTranslationUrl": "/transcript/translation/__lang__", "ytApiUrl": "/base/fixtures/youtube_iframe_api.js", "ytImageUrl": "", "ytTestTimeout": "1500", "ytMetadataUrl": "www.googleapis.com/youtube/v3/videos/", "source": "", "html5_sources": ["http://youtu.be/3_yD_cEKoCk.mp4"]
, "poster": "/media/video-images/poster.png"
}'
>
<div
class=
"focus_grabber first"
></div>
...
...
common/lib/xmodule/xmodule/js/spec/video/html5_video_spec.js
View file @
626f2896
...
...
@@ -4,7 +4,8 @@
var
state
,
oldOTBD
,
playbackRates
=
[
0.75
,
1.0
,
1.25
,
1.5
],
describeInfo
;
describeInfo
,
POSTER_URL
=
'/media/video-images/poster.png'
;
beforeEach
(
function
()
{
oldOTBD
=
window
.
onTouchBasedDevice
;
...
...
@@ -320,6 +321,15 @@
}).
done
(
done
);
});
});
describe
(
'poster'
,
function
()
{
it
(
'has url in player config'
,
function
()
{
expect
(
state
.
videoPlayer
.
player
.
config
.
poster
).
toEqual
(
POSTER_URL
);
expect
(
state
.
videoPlayer
.
player
.
videoEl
).
toHaveAttrs
({
poster
:
POSTER_URL
});
});
});
});
describe
(
'non-hls encoding'
,
function
()
{
...
...
@@ -338,6 +348,28 @@
jasmine
.
getEnv
().
describe
(
describeInfo
.
description
,
describeInfo
.
specDefinitions
);
});
it
(
'does not show poster for html5 video if url is not present'
,
function
()
{
state
=
jasmine
.
initializePlayer
(
'video_html5.html'
,
{
poster
:
null
}
);
expect
(
state
.
videoPlayer
.
player
.
config
.
poster
).
toEqual
(
null
);
expect
(
state
.
videoPlayer
.
player
.
videoEl
).
not
.
toHaveAttr
(
'poster'
);
});
it
(
'does not show poster for hls video if url is not present'
,
function
()
{
state
=
jasmine
.
initializePlayer
(
'video_hls.html'
,
{
poster
:
null
}
);
expect
(
state
.
videoPlayer
.
player
.
config
.
poster
).
toEqual
(
null
);
expect
(
state
.
videoPlayer
.
player
.
videoEl
).
not
.
toHaveAttr
(
'poster'
);
});
it
(
'native controls are used on iPhone'
,
function
()
{
window
.
onTouchBasedDevice
.
and
.
returnValue
([
'iPhone'
]);
...
...
common/lib/xmodule/xmodule/js/src/video/02_html5_video.js
View file @
626f2896
...
...
@@ -44,8 +44,11 @@ function(_) {
* // video format of the source. Supported
* // video formats are: 'mp4', 'webm', and
* // 'ogg'.
* poster: Video poster URL
*
* events: { // Object's properties identify the
* browserIsSafari: Flag to tell if current browser is Safari
*
* events: { // Object's properties identify the
* // events that the API fires, and the
* // functions (event listeners) that the
* // API will call when those events occur.
...
...
@@ -320,6 +323,11 @@ function(_) {
this
.
videoEl
.
prop
(
'controls'
,
true
);
}
// Set video poster
if
(
this
.
config
.
poster
)
{
this
.
videoEl
.
prop
(
'poster'
,
this
.
config
.
poster
);
}
// Place the <video> element on the page.
this
.
videoEl
.
appendTo
(
el
.
find
(
'.video-player > div:first-child'
));
};
...
...
common/lib/xmodule/xmodule/js/src/video/03_video_player.js
View file @
626f2896
...
...
@@ -162,6 +162,7 @@ function(HTML5Video, HTML5HLSVideo, Resizer, HLS, _) {
commonPlayerConfig
=
{
playerVars
:
state
.
videoPlayer
.
playerVars
,
videoSources
:
state
.
config
.
sources
,
poster
:
state
.
config
.
poster
,
browserIsSafari
:
state
.
browserIsSafari
,
events
:
{
onReady
:
state
.
videoPlayer
.
onReady
,
...
...
common/lib/xmodule/xmodule/video_module/video_module.py
View file @
626f2896
...
...
@@ -310,7 +310,10 @@ class VideoModule(VideoFields, VideoTranscriptsMixin, VideoStudentViewHandlers,
'streams'
:
self
.
youtube_streams
,
'sub'
:
self
.
sub
,
'sources'
:
sources
,
'poster'
:
edxval_api
and
edxval_api
.
get_course_video_image_url
(
course_id
=
self
.
runtime
.
course_id
.
for_branch
(
None
),
edx_video_id
=
self
.
edx_video_id
.
strip
()
),
# This won't work when we move to data that
# isn't on the filesystem
'captionDataDir'
:
getattr
(
self
,
'data_dir'
,
None
),
...
...
lms/djangoapps/courseware/tests/test_video_mongo.py
View file @
626f2896
...
...
@@ -50,32 +50,33 @@ class TestVideoYouTube(TestVideo):
'handout'
:
None
,
'id'
:
self
.
item_descriptor
.
location
.
html_id
(),
'metadata'
:
json
.
dumps
(
OrderedDict
({
"saveStateUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
"/save_user_state"
,
"autoplay"
:
False
,
"streams"
:
"0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg"
,
"sub"
:
"a_sub_file.srt.sjson"
,
"sources"
:
sources
,
"captionDataDir"
:
None
,
"showCaptions"
:
"true"
,
"generalSpeed"
:
1.0
,
"speed"
:
None
,
"savedVideoPosition"
:
0.0
,
"start"
:
3603.0
,
"end"
:
3610.0
,
"transcriptLanguage"
:
"en"
,
"transcriptLanguages"
:
OrderedDict
({
"en"
:
"English"
,
"uk"
:
u"Українська"
}),
"ytTestTimeout"
:
1500
,
"ytApiUrl"
:
"https://www.youtube.com/iframe_api"
,
"ytMetadataUrl"
:
"https://www.googleapis.com/youtube/v3/videos/"
,
"ytKey"
:
None
,
"transcriptTranslationUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'saveStateUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
'/save_user_state'
,
'autoplay'
:
False
,
'streams'
:
'0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg'
,
'sub'
:
'a_sub_file.srt.sjson'
,
'sources'
:
sources
,
'poster'
:
None
,
'captionDataDir'
:
None
,
'showCaptions'
:
'true'
,
'generalSpeed'
:
1.0
,
'speed'
:
None
,
'savedVideoPosition'
:
0.0
,
'start'
:
3603.0
,
'end'
:
3610.0
,
'transcriptLanguage'
:
'en'
,
'transcriptLanguages'
:
OrderedDict
({
'en'
:
'English'
,
'uk'
:
u'Українська'
}),
'ytTestTimeout'
:
1500
,
'ytApiUrl'
:
'https://www.youtube.com/iframe_api'
,
'ytMetadataUrl'
:
'https://www.googleapis.com/youtube/v3/videos/'
,
'ytKey'
:
None
,
'transcriptTranslationUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'translation/__lang__'
)
.
rstrip
(
'/?'
),
"transcriptAvailableTranslationsUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'transcriptAvailableTranslationsUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'available_translations'
)
.
rstrip
(
'/?'
),
"autohideHtml5"
:
False
,
"recordedYoutubeIsAvailable"
:
True
,
'autohideHtml5'
:
False
,
'recordedYoutubeIsAvailable'
:
True
,
})),
'track'
:
None
,
'transcript_download_format'
:
u'srt'
,
...
...
@@ -129,32 +130,33 @@ class TestVideoNonYouTube(TestVideo):
'handout'
:
None
,
'id'
:
self
.
item_descriptor
.
location
.
html_id
(),
'metadata'
:
json
.
dumps
(
OrderedDict
({
"saveStateUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
"/save_user_state"
,
"autoplay"
:
False
,
"streams"
:
"1.00:3_yD_cEKoCk"
,
"sub"
:
"a_sub_file.srt.sjson"
,
"sources"
:
sources
,
"captionDataDir"
:
None
,
"showCaptions"
:
"true"
,
"generalSpeed"
:
1.0
,
"speed"
:
None
,
"savedVideoPosition"
:
0.0
,
"start"
:
3603.0
,
"end"
:
3610.0
,
"transcriptLanguage"
:
"en"
,
"transcriptLanguages"
:
OrderedDict
({
"en"
:
"English"
}),
"ytTestTimeout"
:
1500
,
"ytApiUrl"
:
"https://www.youtube.com/iframe_api"
,
"ytMetadataUrl"
:
"https://www.googleapis.com/youtube/v3/videos/"
,
"ytKey"
:
None
,
"transcriptTranslationUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'saveStateUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
'/save_user_state'
,
'autoplay'
:
False
,
'streams'
:
'1.00:3_yD_cEKoCk'
,
'sub'
:
'a_sub_file.srt.sjson'
,
'sources'
:
sources
,
'poster'
:
None
,
'captionDataDir'
:
None
,
'showCaptions'
:
'true'
,
'generalSpeed'
:
1.0
,
'speed'
:
None
,
'savedVideoPosition'
:
0.0
,
'start'
:
3603.0
,
'end'
:
3610.0
,
'transcriptLanguage'
:
'en'
,
'transcriptLanguages'
:
OrderedDict
({
'en'
:
'English'
}),
'ytTestTimeout'
:
1500
,
'ytApiUrl'
:
'https://www.youtube.com/iframe_api'
,
'ytMetadataUrl'
:
'https://www.googleapis.com/youtube/v3/videos/'
,
'ytKey'
:
None
,
'transcriptTranslationUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'translation/__lang__'
)
.
rstrip
(
'/?'
),
"transcriptAvailableTranslationsUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'transcriptAvailableTranslationsUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'available_translations'
)
.
rstrip
(
'/?'
),
"autohideHtml5"
:
False
,
"recordedYoutubeIsAvailable"
:
True
,
'autohideHtml5'
:
False
,
'recordedYoutubeIsAvailable'
:
True
,
})),
'track'
:
None
,
'transcript_download_format'
:
u'srt'
,
...
...
@@ -185,32 +187,33 @@ class TestGetHtmlMethod(BaseTestXmodule):
super
(
TestGetHtmlMethod
,
self
)
.
setUp
()
self
.
setup_course
()
self
.
default_metadata_dict
=
OrderedDict
({
"saveStateUrl"
:
""
,
"autoplay"
:
settings
.
FEATURES
.
get
(
'AUTOPLAY_VIDEOS'
,
True
),
"streams"
:
"1.00:3_yD_cEKoCk"
,
"sub"
:
"a_sub_file.srt.sjson"
,
"sources"
:
'[]'
,
"captionDataDir"
:
None
,
"showCaptions"
:
"true"
,
"generalSpeed"
:
1.0
,
"speed"
:
None
,
"savedVideoPosition"
:
0.0
,
"start"
:
3603.0
,
"end"
:
3610.0
,
"transcriptLanguage"
:
"en"
,
"transcriptLanguages"
:
OrderedDict
({
"en"
:
"English"
}),
"ytTestTimeout"
:
1500
,
"ytApiUrl"
:
"https://www.youtube.com/iframe_api"
,
"ytMetadataUrl"
:
"https://www.googleapis.com/youtube/v3/videos/"
,
"ytKey"
:
None
,
"transcriptTranslationUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'saveStateUrl'
:
''
,
'autoplay'
:
settings
.
FEATURES
.
get
(
'AUTOPLAY_VIDEOS'
,
True
),
'streams'
:
'1.00:3_yD_cEKoCk'
,
'sub'
:
'a_sub_file.srt.sjson'
,
'sources'
:
'[]'
,
'poster'
:
None
,
'captionDataDir'
:
None
,
'showCaptions'
:
'true'
,
'generalSpeed'
:
1.0
,
'speed'
:
None
,
'savedVideoPosition'
:
0.0
,
'start'
:
3603.0
,
'end'
:
3610.0
,
'transcriptLanguage'
:
'en'
,
'transcriptLanguages'
:
OrderedDict
({
'en'
:
'English'
}),
'ytTestTimeout'
:
1500
,
'ytApiUrl'
:
'https://www.youtube.com/iframe_api'
,
'ytMetadataUrl'
:
'https://www.googleapis.com/youtube/v3/videos/'
,
'ytKey'
:
None
,
'transcriptTranslationUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'translation/__lang__'
)
.
rstrip
(
'/?'
),
"transcriptAvailableTranslationsUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'transcriptAvailableTranslationsUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'available_translations'
)
.
rstrip
(
'/?'
),
"autohideHtml5"
:
False
,
"recordedYoutubeIsAvailable"
:
True
,
'autohideHtml5'
:
False
,
'recordedYoutubeIsAvailable'
:
True
,
})
def
test_get_html_track
(
self
):
...
...
@@ -918,6 +921,19 @@ class TestGetHtmlMethod(BaseTestXmodule):
context
=
self
.
item_descriptor
.
render
(
STUDENT_VIEW
)
.
content
self
.
assertIn
(
"'download_video_link': None"
,
context
)
@patch
(
'xmodule.video_module.video_module.edxval_api.get_course_video_image_url'
)
def
test_poster_image
(
self
,
get_course_video_image_url
):
"""
Verify that poster image functionality works as expected.
"""
video_xml
=
'<video display_name="Video" download_video="true" edx_video_id="12345-67890">[]</video>'
get_course_video_image_url
.
return_value
=
'/media/video-images/poster.png'
self
.
initialize_module
(
data
=
video_xml
)
context
=
self
.
item_descriptor
.
render
(
STUDENT_VIEW
)
.
content
self
.
assertIn
(
'"poster": "/media/video-images/poster.png"'
,
context
)
@attr
(
shard
=
1
)
class
TestVideoCDNRewriting
(
BaseTestXmodule
):
...
...
@@ -1539,13 +1555,13 @@ class TestVideoWithBumper(TestVideo):
Test content with rendered bumper metadata.
"""
get_url_for_profiles
.
return_value
=
{
"desktop_mp4"
:
"http://test_bumper.mp4"
,
"desktop_webm"
:
""
,
'desktop_mp4'
:
'http://test_bumper.mp4'
,
'desktop_webm'
:
''
,
}
get_bumper_settings
.
return_value
=
{
"video_id"
:
"edx_video_id"
,
"transcripts"
:
{},
'video_id'
:
'edx_video_id'
,
'transcripts'
:
{},
}
is_bumper_enabled
.
return_value
=
True
...
...
@@ -1557,17 +1573,17 @@ class TestVideoWithBumper(TestVideo):
'license'
:
None
,
'bumper_metadata'
:
json
.
dumps
(
OrderedDict
({
'saveStateUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
'/save_user_state'
,
"showCaptions"
:
"true"
,
"sources"
:
[
"http://test_bumper.mp4"
],
'showCaptions'
:
'true'
,
'sources'
:
[
'http://test_bumper.mp4'
],
'streams'
:
''
,
"transcriptLanguage"
:
"en"
,
"transcriptLanguages"
:
{
"en"
:
"English"
},
"transcriptTranslationUrl"
:
video_utils
.
set_query_parameter
(
'transcriptLanguage'
:
'en'
,
'transcriptLanguages'
:
{
'en'
:
'English'
},
'transcriptTranslationUrl'
:
video_utils
.
set_query_parameter
(
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'translation/__lang__'
)
.
rstrip
(
'/?'
),
'is_bumper'
,
1
),
"transcriptAvailableTranslationsUrl"
:
video_utils
.
set_query_parameter
(
'transcriptAvailableTranslationsUrl'
:
video_utils
.
set_query_parameter
(
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'available_translations'
)
.
rstrip
(
'/?'
),
'is_bumper'
,
1
...
...
@@ -1580,32 +1596,33 @@ class TestVideoWithBumper(TestVideo):
'handout'
:
None
,
'id'
:
self
.
item_descriptor
.
location
.
html_id
(),
'metadata'
:
json
.
dumps
(
OrderedDict
({
"saveStateUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
"/save_user_state"
,
"autoplay"
:
False
,
"streams"
:
"0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg"
,
"sub"
:
"a_sub_file.srt.sjson"
,
"sources"
:
sources
,
"captionDataDir"
:
None
,
"showCaptions"
:
"true"
,
"generalSpeed"
:
1.0
,
"speed"
:
None
,
"savedVideoPosition"
:
0.0
,
"start"
:
3603.0
,
"end"
:
3610.0
,
"transcriptLanguage"
:
"en"
,
"transcriptLanguages"
:
OrderedDict
({
"en"
:
"English"
,
"uk"
:
u"Українська"
}),
"ytTestTimeout"
:
1500
,
"ytApiUrl"
:
"https://www.youtube.com/iframe_api"
,
"ytMetadataUrl"
:
"https://www.googleapis.com/youtube/v3/videos/"
,
"ytKey"
:
None
,
"transcriptTranslationUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'saveStateUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
ajax_url
+
'/save_user_state'
,
'autoplay'
:
False
,
'streams'
:
'0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg'
,
'sub'
:
'a_sub_file.srt.sjson'
,
'sources'
:
sources
,
'poster'
:
None
,
'captionDataDir'
:
None
,
'showCaptions'
:
'true'
,
'generalSpeed'
:
1.0
,
'speed'
:
None
,
'savedVideoPosition'
:
0.0
,
'start'
:
3603.0
,
'end'
:
3610.0
,
'transcriptLanguage'
:
'en'
,
'transcriptLanguages'
:
OrderedDict
({
'en'
:
'English'
,
'uk'
:
u'Українська'
}),
'ytTestTimeout'
:
1500
,
'ytApiUrl'
:
'https://www.youtube.com/iframe_api'
,
'ytMetadataUrl'
:
'https://www.googleapis.com/youtube/v3/videos/'
,
'ytKey'
:
None
,
'transcriptTranslationUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'translation/__lang__'
)
.
rstrip
(
'/?'
),
"transcriptAvailableTranslationsUrl"
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
'transcriptAvailableTranslationsUrl'
:
self
.
item_descriptor
.
xmodule_runtime
.
handler_url
(
self
.
item_descriptor
,
'transcript'
,
'available_translations'
)
.
rstrip
(
'/?'
),
"autohideHtml5"
:
False
,
"recordedYoutubeIsAvailable"
:
True
,
'autohideHtml5'
:
False
,
'recordedYoutubeIsAvailable'
:
True
,
})),
'track'
:
None
,
'transcript_download_format'
:
u'srt'
,
...
...
@@ -1614,8 +1631,8 @@ class TestVideoWithBumper(TestVideo):
{
'display_name'
:
'Text (.txt) file'
,
'value'
:
'txt'
}
],
'poster'
:
json
.
dumps
(
OrderedDict
({
"url"
:
"http://img.youtube.com/vi/ZwkTiUPN0mg/0.jpg"
,
"type"
:
"youtube"
'url'
:
'http://img.youtube.com/vi/ZwkTiUPN0mg/0.jpg'
,
'type'
:
'youtube'
}))
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment