Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'udemo' into FLUID-4744

  • Loading branch information...
commit f0d28063501e99ceeb0779e97816df1209fdbe70 2 parents 8c0ab5a + a752873
@anvk anvk authored
View
238 css/VideoPlayer.css
@@ -25,6 +25,13 @@
width: 100%;
height: 100%;
}
+.fl-videoPlayer-video-element:focus {
+ outline: solid 3px #3195C7;
+}
+.fl-theme-uio-yb .fl-videoPlayer-video-element:focus { outline-color: #FFFF00; }
+.fl-theme-uio-wb .fl-videoPlayer-video-element:focus { outline-color: #FFFFFF; }
+.fl-theme-uio-by .fl-videoPlayer-video-element:focus,
+.fl-theme-uio-bw .fl-videoPlayer-video-element:focus { outline-color: #000000; }
/*
* Controller area
@@ -34,10 +41,14 @@
position : absolute;
padding : 3px 5px;
}
+.fl-theme-uio-yb .fl-videoPlayer-tooltip,
+.fl-theme-uio-by .fl-videoPlayer-tooltip,
+.fl-theme-uio-wb .fl-videoPlayer-tooltip,
+.fl-theme-uio-bw .fl-videoPlayer-tooltip { background: none; }
.fl-videoPlayer-controller {
width:100%;
- bottom: 0;
+ position: relative;
}
@@ -52,6 +63,13 @@
cursor: pointer;
background-color: rgba(0, 0, 0, 0);
}
+.fl-videoPlayer-button:focus {
+ background-color: #3195C7;
+}
+.fl-theme-uio-yb .fl-videoPlayer-button:focus { background-color: #FFFF00 !important; }
+.fl-theme-uio-wb .fl-videoPlayer-button:focus { background-color: #FFFFFF !important; }
+.fl-theme-uio-by .fl-videoPlayer-button:focus,
+.fl-theme-uio-bw .fl-videoPlayer-button:focus { background-color: #000000 !important; }
.fl-videoPlayer-controller-buttons .fl-videoPlayer-button,
.fl-videoPlayer-controller-buttons .fl-videoPlayer-button:hover {
@@ -74,16 +92,17 @@
display: inline-block;
}
-.fl-videoPlayer-controller-buttons > div {
+.fl-videoPlayer-controller-buttons-main,
+.fl-videoPlayer-controller-buttons-secondary {
height: 100%;
+ position: absolute;
+ bottom: 0;
}
-
.fl-videoPlayer-controller-buttons-main {
- float: left;
+ left: 0;
}
-
.fl-videoPlayer-controller-buttons-secondary {
- float: right;
+ right: 0;
}
a.fl-videoPlayer-button-wrapper {
@@ -98,6 +117,13 @@ a.fl-videoPlayer-button-wrapper {
.fl-videoPlayer-play:hover {
background-image: url('../images/default/play_hover.png');
}
+.fl-videoPlayer-play:focus {
+ background-image: url('../images/white/play.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-play:focus,
+.fl-theme-uio-wb .fl-videoPlayer-play:focus { background-image: url('../images/black/play.png'); }
+.fl-theme-uio-by .fl-videoPlayer-play:focus { background-image: url('../images/yellow/play.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-play:focus { background-image: url('../images/white/play.png'); }
.fl-videoPlayer-playing {
background-image: url('../images/default/pause.png');
@@ -107,6 +133,14 @@ a.fl-videoPlayer-button-wrapper {
background-image: url('../images/default/pause_hover.png');
}
+.fl-videoPlayer-playing:focus {
+ background-image: url('../images/white/pause.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-playing:focus,
+.fl-theme-uio-wb .fl-videoPlayer-playing:focus { background-image: url('../images/black/pause.png'); }
+.fl-theme-uio-by .fl-videoPlayer-playing:focus { background-image: url('../images/yellow/pause.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-playing:focus { background-image: url('../images/white/pause.png'); }
+
/* Fullscreen button */
.fl-videoPlayer-fullscreen {
background-image: url('../images/default/fullscreen.png');
@@ -116,6 +150,14 @@ a.fl-videoPlayer-button-wrapper {
background-image: url('../images/default/fullscreen_hover.png');
}
+.fl-videoPlayer-fullscreen:focus {
+ background-image: url('../images/white/fullscreen.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-fullscreen:focus,
+.fl-theme-uio-wb .fl-videoPlayer-fullscreen:focus { background-image: url('../images/black/fullscreen.png'); }
+.fl-theme-uio-by .fl-videoPlayer-fullscreen:focus { background-image: url('../images/yellow/fullscreen.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-fullscreen:focus { background-image: url('../images/white/fullscreen.png'); }
+
.fl-videoPlayer-fullscreen-on {
background-image: url('../images/default/smallscreen.png');
}
@@ -124,6 +166,14 @@ a.fl-videoPlayer-button-wrapper {
background-image: url('../images/default/smallscreen_hover.png');
}
+.fl-videoPlayer-fullscreen-on:focus {
+ background-image: url('../images/white/smallscreen.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-fullscreen-on:focus,
+.fl-theme-uio-wb .fl-videoPlayer-fullscreen-on:focus { background-image: url('../images/black/smallscreen.png'); }
+.fl-theme-uio-by .fl-videoPlayer-fullscreen-on:focus { background-image: url('../images/yellow/smallscreen.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-fullscreen-on:focus { background-image: url('../images/white/smallscreen.png'); }
+
/* Volume button */
.fl-videoPlayer-mute {
background-image: url('../images/default/volume.png');
@@ -142,9 +192,24 @@ a.fl-videoPlayer-button-wrapper {
background-image: url('../images/default/captions_hover.png');
}
+.fl-videoPlayer-captions-button:focus {
+ background-image: url('../images/white/captions.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-captions-button:focus,
+.fl-theme-uio-wb .fl-videoPlayer-captions-button:focus { background-image: url('../images/black/captions.png'); }
+.fl-theme-uio-by .fl-videoPlayer-captions-button:focus { background-image: url('../images/yellow/captions.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-captions-button:focus { background-image: url('../images/white/captions.png'); }
+
.fl-videoPlayer-captions-button-on {
background-image: url('../images/default/captions_on.png');
}
+.fl-videoPlayer-captions-button-on:focus {
+ background-image: url('../images/white/captions_on.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-captions-button-on:focus,
+.fl-theme-uio-wb .fl-videoPlayer-captions-button-on:focus { background-image: url('../images/black/captions_on.png'); }
+.fl-theme-uio-by .fl-videoPlayer-captions-button-on:focus { background-image: url('../images/yellow/captions_on.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-captions-button-on:focus { background-image: url('../images/white/captions_on.png'); }
/* Transcript button */
.fl-videoPlayer-transcripts-button {
@@ -155,9 +220,24 @@ a.fl-videoPlayer-button-wrapper {
background-image: url('../images/default/transcript_hover.png');
}
+.fl-videoPlayer-transcripts-button:focus {
+ background-image: url('../images/white/transcript.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-transcripts-button:focus,
+.fl-theme-uio-wb .fl-videoPlayer-transcripts-button:focus { background-image: url('../images/black/transcript.png'); }
+.fl-theme-uio-by .fl-videoPlayer-transcripts-button:focus { background-image: url('../images/yellow/transcript.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-transcripts-button:focus { background-image: url('../images/white/transcript.png'); }
+
.fl-videoPlayer-transcripts-button-on {
background-image: url('../images/default/transcript_on.png');
}
+.fl-videoPlayer-transcripts-button-on:focus {
+ background-image: url('../images/white/transcript_on.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-transcripts-button-on:focus,
+.fl-theme-uio-wb .fl-videoPlayer-transcripts-button-on:focus { background-image: url('../images/black/transcript_on.png'); }
+.fl-theme-uio-by .fl-videoPlayer-transcripts-button-on:focus { background-image: url('../images/yellow/transcript_on.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-transcripts-button-on:focus { background-image: url('../images/white/transcript_on.png'); }
/******************
@@ -166,24 +246,69 @@ a.fl-videoPlayer-button-wrapper {
.fl-videoPlayer-volumeContainer {
position: relative;
+ top: 2px;
}
.fl-videoPlayer-volumeControl {
display: none;
z-index: 1000;
border-width: 5px 11px;
- border-style: solid #c2c2c2;
+ border-style: solid;
+ border-color: #c2c2c2;
position: absolute;
bottom: 31px;
right: 0px;
width: 25%;
background-color: #F2F2F2;
}
+.fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-volumeControl {
+ border-color: #3195C7;
+}
+.fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-mute {
+ background-color: #3195C7;
+ background-image: url('../images/white/volume.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-mute {
+ background-color: #FFFF00 !important;
+ background-image: url('../images/black/volume.png');
+}
+.fl-theme-uio-wb .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-mute {
+ background-color: #FFFFFF !important;
+ background-image: url('../images/black/volume.png');
+}
+.fl-theme-uio-by .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-mute {
+ background-color: #000000 !important;
+ background-image: url('../images/yellow/volume.png');
+}
+.fl-theme-uio-bw .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-mute {
+ background-color: #000000 !important;
+ background-image: url('../images/white/volume.png');
+}
+
+.fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-muted {
+ background-color: #3195C7;
+ background-image: url('../images/white/volume_off.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-muted {
+ background-color: #FFFF00 !important;
+ background-image: url('../images/black/volume_off.png');
+}
+.fl-theme-uio-wb .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-muted {
+ background-color: #FFFFFF !important;
+ background-image: url('../images/black/volume_off.png');
+}
+.fl-theme-uio-by .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-muted {
+ background-color: #000000 !important;
+ background-image: url('../images/yellow/volume_off.png');
+}
+.fl-theme-uio-bw .fl-videoPlayer-volumeContainer:focus .fl-videoPlayer-muted {
+ background-color: #000000 !important;
+ background-image: url('../images/white/volume_off.png');
+}
.fl-videoPlayer-volumeControl.ui-corner-all {
border-radius: 0px 0px 0px 0px;
}
-
.fl-videoPlayer-volumeControl .ui-slider-handle {
height: 10%;
left: -8px;
@@ -226,10 +351,33 @@ a.fl-videoPlayer-button-wrapper {
margin: 2% 0 0% 2%;
}
-.fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem:hover,
+.fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem:hover {
+ background-color: #ffcc00;
+}
.fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-selected,
.fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active.fl-videoPlayer-menuItem-selected {
- background-color: #ffcc00;
+ color: #FFFFFF;
+ background-color: #3195C7;
+}
+.fl-theme-uio-yb .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-selected,
+.fl-theme-uio-yb .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active.fl-videoPlayer-menuItem-selected {
+ color: #000000 !important;
+ background-color: #FFFF00 !important;
+}
+.fl-theme-uio-wb .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-selected,
+.fl-theme-uio-wb .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active.fl-videoPlayer-menuItem-selected {
+ color: #000000 !important;
+ background-color: #FFFFFF !important;
+}
+.fl-theme-uio-by .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-selected,
+.fl-theme-uio-by .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active.fl-videoPlayer-menuItem-selected {
+ color: #FFFF00 !important;
+ background-color: #000000 !important;
+}
+.fl-theme-uio-bw .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-selected,
+.fl-theme-uio-bw .fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active.fl-videoPlayer-menuItem-selected {
+ color: #FFFFFF !important;
+ background-color: #000000 !important;
}
.fl-videoPlayer-languageMenu .fl-videoPlayer-menuItem-active {
@@ -251,7 +399,7 @@ ul.fl-videoPlayer-transcripts-languageList li {
.fl-videoPlayer-buffered-progress {
height: 1em;
left: 0;
- top: 0;
+ top: 1px;
position: absolute;
width: 100%;
pointer-events:none;
@@ -292,9 +440,12 @@ ul.fl-videoPlayer-transcripts-languageList li {
.fl-videoPlayer-scrubberContainer {
width: 100%;
text-align: center;
- margin-bottom: -0.4em;
- position: relative;
+ position: absolute;
+ bottom: 2.3em;
+ left: 0;
+ height: 1em;
}
+.fl-theme-uio-yb .fl-videoPlayer-scrubberContainer { background-color: transparent !important;}
.fl-videoPlayer-scrubberContainer * {
margin: auto;
display: inline-block;
@@ -303,6 +454,9 @@ ul.fl-videoPlayer-transcripts-languageList li {
.fl-videoPlayer-scrubber {
width: 100%;
}
+.fl-videoPlayer-scrubber.ui-slider-horizontal {
+ height: 1em;
+}
.fl-videoPlayer-scrubber.ui-widget-content {
background: rgba(0, 0, 0, 0.45);
@@ -314,19 +468,40 @@ ul.fl-videoPlayer-transcripts-languageList li {
width: 5em;
margin-left: -1.5em;
margin-top: -0.9em;
- background: rgba(0, 0, 0, 0);
+ background: #000000;
border-width: 0px 0px 0px 0px;
color: #fff;
text-decoration: none;
text-align: center;
-
+ font-size: 90%;
+ font-weight: lighter;
+ padding: 0.2em;
}
-.fl-videoPlayer-scrubber .ui-slider-handle > span {
- font-size: 70%;
- font-weight: lighter;
- background-color: #000;
- padding: 0 5% 0 5%;
+.fl-videoPlayer-scrubber .ui-slider-handle:focus {
+ border: solid 1px #FFFFFF;
+ color: #FFFFFF;
+ background-color: #3195C7;
+}
+.fl-theme-uio-yb .fl-videoPlayer-scrubber .ui-slider-handle:focus,
+.fl-theme-uio-yb .fl-videoPlayer-scrubber .ui-slider-handle:focus span {
+ color: #000000 !important;
+ background-color: #FFFF00 !important;
+}
+.fl-theme-uio-wb .fl-videoPlayer-scrubber .ui-slider-handle:focus,
+.fl-theme-uio-wb .fl-videoPlayer-scrubber .ui-slider-handle:focus span {
+ color: #000000 !important;
+ background-color: #FFFFFF !important;
+}
+.fl-theme-uio-by .fl-videoPlayer-scrubber .ui-slider-handle:focus,
+.fl-theme-uio-by .fl-videoPlayer-scrubber .ui-slider-handle:focus span {
+ color: #FFFF00 !important;
+ background-color: #000000 !important;
+}
+.fl-theme-uio-bw .fl-videoPlayer-scrubber .ui-slider-handle:focus,
+.fl-theme-uio-bw .fl-videoPlayer-scrubber .ui-slider-handle:focus span {
+ color: #FFFFFF !important;
+ background-color: #000000 !important;
}
.fl-videoPlayer-time {
@@ -352,7 +527,7 @@ ul.fl-videoPlayer-transcripts-languageList li {
.fl-videoPlayer-captionArea {
text-align:center;
position: relative;
- bottom: 1.1em;
+ bottom: 1.5em;
pointer-events:none;
}
@@ -361,7 +536,12 @@ ul.fl-videoPlayer-transcripts-languageList li {
position: absolute;
width: 100%;
}
-
+.fl-theme-uio-yb .fl-videoPlayer-overlay,
+.fl-theme-uio-wb .fl-videoPlayer-overlay,
+.fl-theme-uio-by .fl-videoPlayer-overlay,
+.fl-theme-uio-bw .fl-videoPlayer-overlay {
+ background-color: transparent !important;
+}
.fl-videoPlayer-caption-captionText {
color: white;
background-color: black;
@@ -395,11 +575,6 @@ ul.fl-videoPlayer-transcripts-languageList li {
width: 65%;
}
-.fl-videoPlayer-transcripts-close-button {
- float: right;
- margin: 0.2em;
-}
-
.fl-videoPlayer-transcript-text {
word-spacing: 0.1em;
overflow-x: hidden;
@@ -424,6 +599,8 @@ ul.fl-videoPlayer-transcripts-languageList li {
}
.fl-videoPlayer-transcripts-close-button {
+ float: right;
+ margin: 0.2em;
background-image: url('../images/default/transcriptclose.png');
background-repeat: no-repeat;
background-position: center center;
@@ -431,6 +608,13 @@ ul.fl-videoPlayer-transcripts-languageList li {
.fl-videoPlayer-transcripts-close-button:hover {
background-image: url('../images/default/transcriptclose_hover.png');
}
+.fl-videoPlayer-transcripts-close-button:focus {
+ background-image: url('../images/white/transcriptclose.png');
+}
+.fl-theme-uio-yb .fl-videoPlayer-transcripts-close-button:focus,
+.fl-theme-uio-wb .fl-videoPlayer-transcripts-close-button:focus { background-image: url('../images/black/transcriptclose.png'); }
+.fl-theme-uio-by .fl-videoPlayer-transcripts-close-button:focus { background-image: url('../images/yellow/transcriptclose.png'); }
+.fl-theme-uio-bw .fl-videoPlayer-transcripts-close-button:focus { background-image: url('../images/white/transcriptclose.png'); }
.fl-videoPlayer-transcript-element:hover {
color: #25b3d3;
View
37 html/videoPlayer_template.html
@@ -10,26 +10,6 @@
<div class="flc-videoPlayer-controller fl-videoPlayer-controller">
- <div class="flc-videoPlayer-scrubberContainer fl-videoPlayer-scrubberContainer">
- <div class="flc-videoPlayer-scrubber fl-videoPlayer-scrubber">
- <a class="ui-slider-handle" href="#">
- <span>
- <span class="flc-videoPlayer-current fl-videoPlayer-time fl-videoPlayer-current"></span>/<span class="flc-videoPlayer-total fl-videoPlayer-time fl-videoPlayer-total"></span>
- </span>
- </a>
- </div>
-
- <div class="flc-videoPlayer-buffered-progress fl-videoPlayer-buffered-progress">
- <div class="flc-progress fl-progress-popUp">
- <div class="flc-progress-bar fl-progress-theBar">
- <div class="flc-progress-indicator fl-progress-indicator">
- </div>
- </div>
- </div>
- </div>
-
- </div>
-
<div class="fl-videoPlayer-controller-buttons">
<div class="fl-videoPlayer-controller-buttons-main">
<button type="button" class="flc-videoPlayer-play fl-videoPlayer-button"></button>
@@ -40,6 +20,23 @@
</div>
</div>
+ <div class="flc-videoPlayer-scrubberContainer fl-videoPlayer-scrubberContainer">
+ <div class="flc-videoPlayer-scrubber fl-videoPlayer-scrubber">
+ <a class="ui-slider-handle" href="#">
+ <span class="flc-videoPlayer-current fl-videoPlayer-time fl-videoPlayer-current"></span>/<span class="flc-videoPlayer-total fl-videoPlayer-time fl-videoPlayer-total"></span>
+ </a>
+ </div>
+
+ <div class="flc-videoPlayer-buffered-progress fl-videoPlayer-buffered-progress">
+ <div class="flc-progress fl-progress-popUp">
+ <div class="flc-progress-bar fl-progress-theBar">
+ <div class="flc-progress-indicator fl-progress-indicator">
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
<div class="fl-videoPlayer-controller-buttons-secondary">
<div class="flc-videoPlayer-captionControls-container fl-videoPlayer-captions">
<button class="flc-videoPlayer-captions-button fl-videoPlayer-button"></button>
View
12 js/ToggleButton.js
@@ -64,6 +64,12 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
}
button.prop("aria-pressed", pressed);
};
+
+ that.press = function () {
+ that.requestStateChange();
+ that.events.onPress.fire(that);
+ return false;
+ };
};
fluid.toggleButton.setUpToggleButton = function (that) {
@@ -85,11 +91,7 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
fluid.toggleButton.bindToggleButtonEvents = function (that) {
var button = that.locate("button");
- button.click(function () {
- that.requestStateChange();
- that.events.onPress.fire();
- return false;
- });
+ button.click(that.press);
that.applier.modelChanged.addListener(that.options.modelPath, function () {
that.refreshView();
View
39 js/VideoPlayer.js
@@ -91,6 +91,9 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
rewind: {
modifier: $.ui.keyCode.SHIFT,
key: $.ui.keyCode.LEFT
+ },
+ escape: {
+ key: $.ui.keyCode.ESCAPE
}
};
@@ -438,16 +441,35 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
var videoEl = video[0];
if (that.model.fullscreen === true) {
- if (videoEl.mozRequestFullScreen) {
- videoEl.mozRequestFullScreen();
- } else if (videoEl.webkitEnterFullScreen) {
- videoEl.webkitEnterFullScreen();
- }
- // else {
- // TODO: Fallback to other versions of browsers
- // }
+ // FLUID-4661: Using browser'ss full screen video mode for now until we implement our own fullscreen mode
+ fluid.each(["moz", "webkit", "o"], function (value) {
+ var functionName = value + "RequestFullScreen";
+ if (videoEl[functionName]) {
+ videoEl[functionName]();
+ return false;
+ }
+ });
}
};
+
+ // FLUID-4661: Change the fullscreen model flag back to false when browser exits its HTML5 fullscreen mode
+ // Once our own custome fullscreen mode is implemented we want to call this fireChangeRequest in another function
+ // which will be called by pressing a full screen toggle Button or when a key shortcut for exiting a fullscreen is pressed
+ fluid.each({
+ "fullscreenchange": "fullscreen",
+ "mozfullscreenchange": "mozFullScreen",
+ "webkitfullscreenchange": "webkitIsFullScreen",
+ "ofullscreenchange": "oFullScreen"
+ }, function (value, key) {
+ document.addEventListener(key, function () {
+ if (!document[value]) {
+ that.applier.fireChangeRequest({
+ path: "fullscreen",
+ value: false
+ });
+ }
+ });
+ });
};
fluid.videoPlayer.postInit = function (that) {
@@ -540,6 +562,7 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
}
that.locate("controllers").hide();
+
that.events.onReady.fire(that);
});
View
2  js/VideoPlayer_controllers.js
@@ -458,7 +458,7 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
fluid.tabindex(that.locate("handle"), -1);
fluid.activatable(that.container, function (evt) {
- that.muteButton.events.onPress.fire();
+ that.muteButton.press();
});
// TODO: This will be converted to use the activatable plugin
// as part of FLUID-4552
View
6 js/VideoPlayer_framework.js
@@ -86,7 +86,7 @@ var fluid_1_5 = fluid_1_5 || {};
var newValue = fluid.get(that.pentModel, key);
// synthetic change summarising ultimate individual effect of pent change
var synthChange = {type: "ADD", path: key, value: newValue};
- // console.log("Replaying pent change ", synthChange, " to target ", target);
+ // fluid.log("Replaying pent change ", synthChange, " to target ", target);
var changes = value.func(newValue, key, target, [synthChange]);
fluid.requestChanges(target.applier, changes);
}
@@ -135,7 +135,7 @@ var fluid_1_5 = fluid_1_5 || {};
fluid.modelRelay.registerTarget(that, that);
if (that.events.bindingTrigger) {
that.events.bindingTrigger.addListener(function () { // TODO: add this as a framework facility
- console.log("Binding triggered");
+ // fluid.log("Binding triggered");
that.options.bindingTriggered = true;
});
}
@@ -169,7 +169,7 @@ var fluid_1_5 = fluid_1_5 || {};
if (newValue < min) {
newValue = min;
} else if (newValue > max) {
- newValue = model.max;
+ newValue = max;
}
changeRequest.value = newValue;
}
View
124 js/VideoPlayer_transcript.js
@@ -9,7 +9,7 @@ You may obtain a copy of the ECL 2.0 License and BSD License at
https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
*/
-/*global jQuery, window, fluid*/
+/*global jQuery, window, fluid, captionator*/
// JSLint options
/*jslint white: true, funcinvoke: true, undef: true, newcap: true, nomen: true, regexp: true, bitwise: true, browser: true, forin: true, maxerr: 100, indent: 4 */
@@ -56,15 +56,18 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
selection: undefined,
choices: [],
labels: [],
- transcriptIntervalId: null,
- transcriptElementIdPrefix: "flc-videoPlayer-transcript-element" // TODO: this belongs as a plain option
+ transcriptIntervalId: null
},
transcripts: [],
invokers: {
convertToMilli: {
funcName: "fluid.videoPlayer.transcript.convertToMilli",
args: ["{arguments}.0"]
- }
+ },
+ convertSecsToMilli: {
+ funcName: "fluid.videoPlayer.transcript.convertSecsToMilli",
+ args: ["{arguments}.0"]
+ }
},
selectors: {
languageDropdown: ".flc-videoPlayer-transcripts-language-dropdown",
@@ -75,7 +78,8 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
styles: {
element: "fl-videoPlayer-transcript-element",
highlight: "fl-videoPlayer-transcript-element-highlight"
- }
+ },
+ transcriptElementIdPrefix: "flc-videoPlayer-transcript-element"
});
/** Functions to show/hide the transcript area **/
@@ -139,12 +143,15 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
return Math.round(secs * 1000 + parseInt(splitSec[1], 10));
};
+ /**
+ * Convert the start/end time of the transcripts retrieved with the Universal Subtitles jsonP API
+ */
fluid.videoPlayer.transcript.convertSecsToMilli = function (time) {
return Math.round(time * 1000);
};
- fluid.videoPlayer.transcript.getTranscriptElementId = function (that, transcriptIndex) {
- return that.options.model.transcriptElementIdPrefix + "-" + transcriptIndex;
+ fluid.videoPlayer.transcript.getTranscriptElementId = function (transcriptElementIdPrefix, transcriptIndex) {
+ return transcriptElementIdPrefix + "-" + transcriptIndex;
};
fluid.videoPlayer.transcript.getTranscriptElement = function (transcriptElementContent, idName, tClass) {
@@ -155,27 +162,29 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
that.locate("transcriptText").html(transcriptText);
that.updateTranscriptHighlight();
- $('span[id|="' + that.model.transcriptElementIdPrefix + '"]').click(function (element) {
+ $('span[id|="' + that.options.transcriptElementIdPrefix + '"]').click(function (element) {
var elementId = element.currentTarget.id;
- var trackId = parseInt(elementId.substring(that.model.transcriptElementIdPrefix.length + 1), 10);
+ var trackId = parseInt(elementId.substring(that.options.transcriptElementIdPrefix.length + 1), 10);
var transcriptIndex = that.model.currentTracks.transcripts[0];
var track = that.options.transcripts[transcriptIndex].tracks[trackId];
// TODO: This test for Universal Subtitles file format should be factored better,
- // as part of a general strategy (see parseUniSubTranscriptFile() and parseTranscriptFile())
+ // as part of a general strategy (see parseTranscriptFile())
var inTimeMillis;
- if (track.text) { // this is a Universal Subtitles format file
- inTimeMillis = fluid.videoPlayer.transcript.convertSecsToMilli(track.start_time);
+ if (track.text) {
+ // this is a Universal Subtitles format file
+ inTimeMillis = that.convertSecsToMilli(track.start_time);
} else {
+ // a WebVTT compatible json format file
inTimeMillis = that.convertToMilli(track.inTime);
}
// Fire the onTranscriptElementChange event with the track start time and the track itself
- that.events.onTranscriptElementChange.fire((1 + inTimeMillis)/1000, track);
+ that.events.onTranscriptElementChange.fire((1 + inTimeMillis) / 1000, track);
});
};
- fluid.videoPlayer.transcript.highlightTranscriptElement = function (that, currentTrackId, previousTrackId) {
+ fluid.videoPlayer.transcript.highlightTranscriptElement = function (that, currentTrackId) {
// Remove the previous highlights. The previous highlight may not necessarily be the "previousTrackId"
// since a slight time delay is applied on the interval change listener to prevent the event queuing-up
// when the scrubber bar is slid back and forth quickly
@@ -183,7 +192,7 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
// Highlight the current transcript
if (currentTrackId !== null) {
- var currentTranscriptElementId = fluid.videoPlayer.transcript.getTranscriptElementId(that, currentTrackId);
+ var currentTranscriptElementId = fluid.videoPlayer.transcript.getTranscriptElementId(that.options.transcriptElementIdPrefix, currentTrackId);
var element = fluid.jById(currentTranscriptElementId);
element.addClass(that.options.styles.highlight);
@@ -193,7 +202,26 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
}
};
- fluid.videoPlayer.transcript.parseTranscriptFile = function (that, transcripts, currentIndex) {
+ /**
+ * Parse the json transcript string to extract the interval list and fires onTranscriptsLoaded event
+ * with the list and the transcript component. The first event argument "interval list" is a must-have
+ * for the other video player components to respond. The 2nd event argument "transcript component" is
+ * currently only used for writing unit tests.
+ *
+ * 2 format of transcripts are accepted by this function: WebVTT compatible json format & universal
+ * subtitle jsonP format. These formats have different paths to identify text, start/end times, which
+ * is the reason to have 3 path parameters (textPath, startTimePath, endTimePath).
+ *
+ * @param that - transcript component
+ * @param transcripts - json string of transcripts text and start/end time
+ * @param currentIndex - the index of the transcript to display
+ * @param convertToMilliFunc - the function that converts the start/end time of each transcript text to millisecond
+ * @param textPath - the EL path on the transcripts json string to retrieve each transcript text
+ * @param startTimePath - the EL path on the transcripts json string to retrieve the start time of each transcript text
+ * @param endTimetPath - the EL path on the transcripts json string to retrieve the end time of each transcript text
+ * @return fires onTranscriptsLoaded event with extracted interval list and the transcript component
+ */
+ fluid.videoPlayer.transcript.parseTranscriptFile = function (that, transcripts, currentIndex, convertToMilliFunc, textPath, startTimePath, endTimePath) {
transcripts = (typeof (transcripts) === "string") ? JSON.parse(transcripts) : transcripts;
if (transcripts.transcriptCollection) {
transcripts = transcripts.transcriptCollection;
@@ -204,7 +232,13 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
// Generate the transcript text
var transcriptText = "";
for (var i = 0; i < transcripts.length; i++) {
- transcriptText = transcriptText + fluid.videoPlayer.transcript.getTranscriptElement(transcripts[i].transcript, fluid.videoPlayer.transcript.getTranscriptElementId(that, i), that.options.styles.element) + "&nbsp;";
+ transcriptText = transcriptText +
+ fluid.videoPlayer.transcript.getTranscriptElement(
+ fluid.get(transcripts[i], textPath),
+ fluid.videoPlayer.transcript.getTranscriptElementId(that.options.transcriptElementIdPrefix, i),
+ that.options.styles.element
+ ) +
+ "&nbsp;";
}
that.options.transcripts[currentIndex].transcriptText = transcriptText;
@@ -214,49 +248,15 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
var intervalList = [];
fluid.each(transcripts, function (value, key) {
intervalList[key] = {
- begin: that.convertToMilli(value.inTime),
- end: that.convertToMilli(value.outTime)
+ begin: convertToMilliFunc(fluid.get(value, startTimePath)),
+ end: convertToMilliFunc(fluid.get(value, endTimePath))
};
});
- that.events.onTranscriptsLoaded.fire(intervalList);
+ // The 2nd event parameter "that" is for writing unit test, no used at implementing transcript functionalities
+ that.events.onTranscriptsLoaded.fire(intervalList, that);
};
- // TODO: This is very similar to the original parseTranscriptFile()
- // Should probably be factored as a strategy
- fluid.videoPlayer.transcript.parseUniSubTranscriptFile = function (that, transcripts, currentIndex) {
- transcripts = (typeof (transcripts) === "string") ? JSON.parse(transcripts) : transcripts;
- if (transcripts.transcriptCollection) {
- transcripts = transcripts.transcriptCollection;
- }
-
- that.options.transcripts[currentIndex].tracks = transcripts;
-
- // Generate the transcript text
- var transcriptText = "";
- for (var i = 0; i < transcripts.length; i++) {
- transcriptText = transcriptText
- + fluid.videoPlayer.transcript.getTranscriptElement(transcripts[i].text,
- fluid.videoPlayer.transcript.getTranscriptElementId(that, i),
- that.options.styles.element)
- + "&nbsp;";
- }
-
- that.options.transcripts[currentIndex].transcriptText = transcriptText;
- fluid.videoPlayer.transcript.displayTranscript(that, transcriptText);
-
- // Construct intervalList that's used by intervalEventsConductor to fire intervalChange event
- var intervalList = [];
- fluid.each(transcripts, function (value, key) {
- intervalList[key] = {
- begin: fluid.videoPlayer.transcript.convertSecsToMilli(value.start_time),
- end: fluid.videoPlayer.transcript.convertSecsToMilli(value.end_time)
- };
- });
-
- that.events.onTranscriptsLoaded.fire(intervalList);
- };
-
fluid.videoPlayer.transcript.loadTranscript = function (that, currentIndex) {
var transcriptSource = that.options.transcripts[currentIndex];
if (transcriptSource) {
@@ -264,14 +264,14 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
// Handle Universal Subtitles JSON files for transcripts
if (transcriptSource.type.match(/^jsonp\//)) {
captionator.getJSONP("".concat(transcriptSource.src, "&callback=?"), function (data) {
- fluid.videoPlayer.transcript.parseUniSubTranscriptFile(that, data, currentIndex);
- })
+ fluid.videoPlayer.transcript.parseTranscriptFile(that, data, currentIndex, that.convertSecsToMilli, "text", "start_time", "end_time");
+ });
} else {
var opts = {
type: "GET",
dataType: "text",
success: function (data) {
- fluid.videoPlayer.transcript.parseTranscriptFile(that, data, currentIndex);
+ fluid.videoPlayer.transcript.parseTranscriptFile(that, data, currentIndex, that.convertToMilli, "transcript", "inTime", "outTime");
},
error: function () {
fluid.log("Error loading transcript: " + transcriptSource.src + ". Are you sure this file exists?");
@@ -345,11 +345,11 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
});
that.events.onIntervalChange.addListener(function (currentInterval, previousInterval) {
- if (currentInterval != that.model.transcriptIntervalId) {
+ if (currentInterval !== that.model.transcriptIntervalId) {
// TODO: use a better strategy for this, which was intended to prevent event pile-up
setTimeout(function () {
that.applier.requestChange("transcriptIntervalId", currentInterval);
- }, 100);
+ }, 100);
}
});
that.applier.modelChanged.addListener("transcriptIntervalId", that.updateTranscriptHighlight);
@@ -358,14 +358,14 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
fluid.videoPlayer.transcript.preInit = function (that) {
// build the 'choices' from the transcript list provided
fluid.each(that.options.transcripts, function (value, key) {
- // ToDo: convert the integer to string to avoid the "unrecognized text" error at rendering dropdown list box
+ // TODO: convert the integer to string to avoid the "unrecognized text" error at rendering dropdown list box
// The integer is converted back in the listener function for currentTracks.transcripts.0.
// Needs a better solution for this.
that.model.choices.push(key.toString());
that.model.labels.push(value.label);
});
- that.model.transcriptElementIdPrefix = that.model.transcriptElementIdPrefix + "-" + that.id;
+ that.options.transcriptElementIdPrefix = that.options.transcriptElementIdPrefix + "-" + that.id;
that.updateTranscriptHighlight = function (previousInterval) {
fluid.videoPlayer.transcript.highlightTranscriptElement(that, that.model.transcriptIntervalId, previousInterval);
};
View
6 js/VideoPlayer_uiOptions.js
@@ -212,17 +212,17 @@ https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
callback(players);
};
var lateListener = function () {
- console.log("Listener for " + instances.length);
+ // fluid.log("Listener for " + instances.length);
// awful workaround for FLUID-4192, "broken trees"
setTimeout(listener, 1);
};
if (relay.events.bindingTrigger && !relay.options.bindingTriggered) {
- console.log("Late binding instances " + instances.length);
+ // fluid.log("Late binding instances " + instances.length);
relay.events.bindingTrigger.addListener(lateListener);
}
else {
- console.log("Immediate binding instances " + instances.length);
+ // fluid.log("Immediate binding instances " + instances.length);
lateListener();
}
};
View
22,514 lib/infusion/MyInfusion.js
11,901 additions, 10,613 deletions not shown
View
2  lib/infusion/README.txt
@@ -1,4 +1,4 @@
-MyInfusion was built from an unreleased version of Infusion (a84ee8), amb26 branch FLUID-4531 using the following command:
+MyInfusion was built from an unreleased version of Infusion master branch (be0b2ff095fa3ea1b1cb4abd3e38e41462d333d1) using the following command:
Build the minified Infusion:
ant customBuild -Dinclude="uiOptions, uploader, tooltip" -lib lib/rhino
View
544 tests/html/TestTranscripts.en.json
@@ -0,0 +1,544 @@
+{
+ "transcriptCollection": [
+ {
+ "inTime": "00:00:01.77",
+ "outTime": "00:00:04.03",
+ "transcript": "Eeny, meeny, miny, moe,"
+ },
+ {
+ "inTime": "00:00:04.03",
+ "outTime": "00:00:05.99",
+ "transcript": "Catch a tiger by the toe"
+ },
+ {
+ "inTime": "00:00:05.99",
+ "outTime": "00:00:08.05",
+ "transcript": "If he hollers let him go"
+ },
+ {
+ "inTime": "00:00:08.05",
+ "outTime": "00:00:10.96",
+ "transcript": "Eeny, meeny, miny moe."
+ },
+ {
+ "inTime": "00:00:12.70",
+ "outTime": "00:00:14.64",
+ "transcript": "I'm Jutta Treviranus"
+ },
+ {
+ "inTime": "00:00:14.64",
+ "outTime": "00:00:16.04",
+ "transcript": "and I've come to wonder"
+ },
+ {
+ "inTime": "00:00:16.04",
+ "outTime": "00:00:18.38",
+ "transcript": "whether we have a chance to reorganize our future."
+ },
+ {
+ "inTime": "00:00:18.38",
+ "outTime": "00:00:23.23",
+ "transcript": "David Kelley says that the future of design is human centred."
+ },
+ {
+ "inTime": "00:00:23.23",
+ "outTime": "00:00:25.51",
+ "transcript": "Most experts agree."
+ },
+ {
+ "inTime": "00:00:25.51",
+ "outTime": "00:00:29.02",
+ "transcript": "That leaves the question - which human?"
+ },
+ {
+ "inTime": "00:00:29.02",
+ "outTime": "00:00:32.46",
+ "transcript": "An inevitable human condition is diversity."
+ },
+ {
+ "inTime": "00:00:32.46",
+ "outTime": "00:00:34.70",
+ "transcript": "There's no typical human,"
+ },
+ {
+ "inTime": "00:00:34.70",
+ "outTime": "00:00:37.33",
+ "transcript": "even clones and identical twins are not the same."
+ },
+ {
+ "inTime": "00:00:37.33",
+ "outTime": "00:00:40.42",
+ "transcript": "We differ from one to the next,"
+ },
+ {
+ "inTime": "00:00:40.42",
+ "outTime": "00:00:43.54",
+ "transcript": "but also from one moment to the next,"
+ },
+ {
+ "inTime": "00:00:43.54",
+ "outTime": "00:00:46.84",
+ "transcript": "from one context to the next."
+ },
+ {
+ "inTime": "00:00:46.84",
+ "outTime": "00:00:49.91",
+ "transcript": "But diversity and difference become overwhelming"
+ },
+ {
+ "inTime": "00:00:49.91",
+ "outTime": "00:00:52.94",
+ "transcript": "and we develop strategies to deal with this diversity."
+ },
+ {
+ "inTime": "00:00:52.94",
+ "outTime": "00:00:55.56",
+ "transcript": "We try to make things simpler,"
+ },
+ {
+ "inTime": "00:00:55.60",
+ "outTime": "00:00:57.50",
+ "transcript": "less complex, less chaotic"
+ },
+ {
+ "inTime": "00:00:57.50",
+ "outTime": "00:01:00.00",
+ "transcript": "Another part of the human condition is that"
+ },
+ {
+ "inTime": "00:01:00.00",
+ "outTime": "00:01:03.18",
+ "transcript": "we try to find commonality and connections."
+ },
+ {
+ "inTime": "00:01:03.20",
+ "outTime": "00:01:09.53",
+ "transcript": "We form groups informal and formal with implicit and explicit criteria."
+ },
+ {
+ "inTime": "00:01:09.55",
+ "outTime": "00:01:13.97",
+ "transcript": "We organize, we create categories, we filter, we label."
+ },
+ {
+ "inTime": "00:01:13.97",
+ "outTime": "00:01:19.67",
+ "transcript": "At our most insecure and overwhelmed we divide in two, we create binaries:"
+ },
+ {
+ "inTime": "00:01:19.67",
+ "outTime": "00:01:21.86",
+ "transcript": "male, female"
+ },
+ {
+ "inTime": "00:01:21.86",
+ "outTime": "00:01:24.21",
+ "transcript": "disabled, normal"
+ },
+ {
+ "inTime": "00:01:24.21",
+ "outTime": "00:01:27.03",
+ "transcript": "left, right"
+ },
+ {
+ "inTime": "00:01:27.03",
+ "outTime": "00:01:29.57",
+ "transcript": "us, them."
+ },
+ {
+ "inTime": "00:01:29.57",
+ "outTime": "00:01:34.98",
+ "transcript": "This all results in issues of who belongs and who is excluded."
+ },
+ {
+ "inTime": "00:01:34.98",
+ "outTime": "00:01:37.53",
+ "transcript": "Membership in groups can be self assigned,"
+ },
+ {
+ "inTime": "00:01:37.53",
+ "outTime": "00:01:40.46",
+ "transcript": "may be imposed, may even be policed."
+ },
+ {
+ "inTime": "00:01:40.46",
+ "outTime": "00:01:44.17",
+ "transcript": "Groups are used to assert or assign privileges and powers."
+ },
+ {
+ "inTime": "00:01:44.17",
+ "outTime": "00:01:46.92",
+ "transcript": "We use groups to judge"
+ },
+ {
+ "inTime": "00:01:46.92",
+ "outTime": "00:01:49.22",
+ "transcript": "values get assigned to groups"
+ },
+ {
+ "inTime": "00:01:49.22",
+ "outTime": "00:01:51.88",
+ "transcript": "often characteristics that have nothing to do with"
+ },
+ {
+ "inTime": "00:01:51.88",
+ "outTime": "00:01:53.35",
+ "transcript": "the original founding properties of groups"
+ },
+ {
+ "inTime": "00:01:53.35",
+ "outTime": "00:01:55.98",
+ "transcript": "are generalized to all individuals in the group."
+ },
+ {
+ "inTime": "00:01:55.98",
+ "outTime": "00:02:00.07",
+ "transcript": "Sometimes, people who are in an imposed group"
+ },
+ {
+ "inTime": "00:02:00.07",
+ "outTime": "00:02:02.00",
+ "transcript": "take ownership of the group and reform"
+ },
+ {
+ "inTime": "00:02:02.00",
+ "outTime": "00:02:04.42",
+ "transcript": "the classifications and values from within."
+ },
+ {
+ "inTime": "00:02:04.42",
+ "outTime": "00:02:08.44",
+ "transcript": "Occasionally, someone has the audacity"
+ },
+ {
+ "inTime": "00:02:08.44",
+ "outTime": "00:02:11.00",
+ "transcript": "to break out of the category we have put her in"
+ },
+ {
+ "inTime": "00:02:11.00",
+ "outTime": "00:02:16.90",
+ "transcript": "but to preserve our category, we may dismiss her as an anomaly."
+ },
+ {
+ "inTime": "00:02:16.90",
+ "outTime": "00:02:20.03",
+ "transcript": "Some groups are more fluid while others are more fixed."
+ },
+ {
+ "inTime": "00:02:20.03",
+ "outTime": "00:02:23.56",
+ "transcript": "We not only form groups, but groups of groups"
+ },
+ {
+ "inTime": "00:02:23.56",
+ "outTime": "00:02:25.66",
+ "transcript": "and groups, of groups, of groups."
+ },
+ {
+ "inTime": "00:02:25.66",
+ "outTime": "00:02:29.09",
+ "transcript": "Membership in one group can grant us membership in other groups."
+ },
+ {
+ "inTime": "00:02:29.09",
+ "outTime": "00:02:33.03",
+ "transcript": "But despite all this, we are diverse,"
+ },
+ {
+ "inTime": "00:02:33.03",
+ "outTime": "00:02:34.85",
+ "transcript": "we are complex,"
+ },
+ {
+ "inTime": "00:02:34.85",
+ "outTime": "00:02:36.45",
+ "transcript": "we are chaotic."
+ },
+ {
+ "inTime": "00:02:36.45",
+ "outTime": "00:02:38.81",
+ "transcript": "Individually we're different"
+ },
+ {
+ "inTime": "00:02:38.81",
+ "outTime": "00:02:40.44",
+ "transcript": "over time, in different contexts,"
+ },
+ {
+ "inTime": "00:02:40.44",
+ "outTime": "00:02:42.35",
+ "transcript": "in different roles, in different groups."
+ },
+ {
+ "inTime": "00:02:42.35",
+ "outTime": "00:02:45.42",
+ "transcript": "We need to assert our uniqueness,"
+ },
+ {
+ "inTime": "00:02:45.42",
+ "outTime": "00:02:47.86",
+ "transcript": "we need to form and refine our identity."
+ },
+ {
+ "inTime": "00:02:47.86",
+ "outTime": "00:02:50.91",
+ "transcript": "We struggle with the identity imposed on us."
+ },
+ {
+ "inTime": "00:02:50.91",
+ "outTime": "00:02:56.36",
+ "transcript": "Generally, people do not fit easily into assigned categories"
+ },
+ {
+ "inTime": "00:02:56.36",
+ "outTime": "00:02:58.98",
+ "transcript": "and yet we persist in assigning them."
+ },
+ {
+ "inTime": "00:02:58.98",
+ "outTime": "00:03:02.63",
+ "transcript": "And then, something new comes along"
+ },
+ {
+ "inTime": "00:03:02.63",
+ "outTime": "00:03:05.41",
+ "transcript": "and shakes up our groups, our categories and our rules,"
+ },
+ {
+ "inTime": "00:03:05.41",
+ "outTime": "00:03:08.26",
+ "transcript": "and we need to adjust, rebuild and rethink."
+ },
+ {
+ "inTime": "00:03:08.26",
+ "outTime": "00:03:12.53",
+ "transcript": "Something like, networks and digital stuff."
+ },
+ {
+ "inTime": "00:03:12.53",
+ "outTime": "00:03:15.47",
+ "transcript": "This new digital and connected world"
+ },
+ {
+ "inTime": "00:03:15.47",
+ "outTime": "00:03:17.87",
+ "transcript": "puts into question how we group things"
+ },
+ {
+ "inTime": "00:03:17.87",
+ "outTime": "00:03:20.75",
+ "transcript": "and challenges our excuses for leaving people out."
+ },
+ {
+ "inTime": "00:03:20.75",
+ "outTime": "00:03:25.46",
+ "transcript": "The digital changes our view of time, space and distance"
+ },
+ {
+ "inTime": "00:03:25.46",
+ "outTime": "00:03:31.08",
+ "transcript": "and by extension our view of design, what is possible and what things cost."
+ },
+ {
+ "inTime": "00:03:31.08",
+ "outTime": "00:03:36.04",
+ "transcript": "Digital things are plastic, mutable, malleable and adaptable."
+ },
+ {
+ "inTime": "00:03:36.04",
+ "outTime": "00:03:39.50",
+ "transcript": "Before, not everyone could fit,"
+ },
+ {
+ "inTime": "00:03:39.50",
+ "outTime": "00:03:42.16",
+ "transcript": "allowing someone in meant someone else was left out."
+ },
+ {
+ "inTime": "00:03:42.16",
+ "outTime": "00:03:46.06",
+ "transcript": "In the digital, room is very stretchy."
+ },
+ {
+ "inTime": "00:03:46.06",
+ "outTime": "00:03:49.76",
+ "transcript": "Before, what we created could not fit everyone"
+ },
+ {
+ "inTime": "00:03:49.76",
+ "outTime": "00:03:51.77",
+ "transcript": "so we made it fit the largest group."
+ },
+ {
+ "inTime": "00:03:51.77",
+ "outTime": "00:03:54.53",
+ "transcript": "We made it for the group called average or typical"
+ },
+ {
+ "inTime": "00:03:54.53",
+ "outTime": "00:03:58.26",
+ "transcript": "this left out everyone not average or typical."
+ },
+ {
+ "inTime": "00:03:58.26",
+ "outTime": "00:04:03.39",
+ "transcript": "In the digital reality the things we make can reconfigure, adapt"
+ },
+ {
+ "inTime": "00:04:03.39",
+ "outTime": "00:04:06.27",
+ "transcript": "and take a form that is best for each individual."
+ },
+ {
+ "inTime": "00:04:06.27",
+ "outTime": "00:04:11.90",
+ "transcript": "In the solid world, each copy cost almost the same as the original."
+ },
+ {
+ "inTime": "00:04:11.90",
+ "outTime": "00:04:14.35",
+ "transcript": "Consumption actually consumed."
+ },
+ {
+ "inTime": "00:04:14.35",
+ "outTime": "00:04:18.56",
+ "transcript": "In the digital world, we can copy almost without cost."
+ },
+ {
+ "inTime": "00:04:18.56",
+ "outTime": "00:04:21.00",
+ "transcript": "Consumption no longer consumes."
+ },
+ {
+ "inTime": "00:04:21.00",
+ "outTime": "00:04:24.52",
+ "transcript": "Before, it took a great deal of time and effort"
+ },
+ {
+ "inTime": "00:04:24.52",
+ "outTime": "00:04:27.23",
+ "transcript": "to deliver things, especially to people far away."
+ },
+ {
+ "inTime": "00:04:27.23",
+ "outTime": "00:04:30.93",
+ "transcript": "Now it is as easy to deliver things around the world"
+ },
+ {
+ "inTime": "00:04:30.93",
+ "outTime": "00:04:33.13",
+ "transcript": "as it is to deliver things next door."
+ },
+ {
+ "inTime": "00:04:33.13",
+ "outTime": "00:04:36.85",
+ "transcript": "Before, if we didn't place things in a fixed spot"
+ },
+ {
+ "inTime": "00:04:36.85",
+ "outTime": "00:04:39.53",
+ "transcript": "we would have a hard time finding them again."
+ },
+ {
+ "inTime": "00:04:39.53",
+ "outTime": "00:04:43.63",
+ "transcript": "Now we can place them anywhere on the network and"
+ },
+ {
+ "inTime": "00:04:43.63",
+ "outTime": "00:04:46.26",
+ "transcript": "retrieve them anywhere on the network."
+ },
+ {
+ "inTime": "00:04:46.26",
+ "outTime": "00:04:50.13",
+ "transcript": "Before, we needed to label things unambiguously and simply"
+ },
+ {
+ "inTime": "00:04:50.13",
+ "outTime": "00:04:52.80",
+ "transcript": "so we could recognize them and know what to do with them."
+ },
+ {
+ "inTime": "00:04:52.80",
+ "outTime": "00:04:56.44",
+ "transcript": "Now we can see a description of each person or thing"
+ },
+ {
+ "inTime": "00:04:56.44",
+ "outTime": "00:04:59.02",
+ "transcript": "that is useful and relevant to our purpose."
+ },
+ {
+ "inTime": "00:04:59.02",
+ "outTime": "00:05:03.01",
+ "transcript": "And by the way, we have learned that"
+ },
+ {
+ "inTime": "00:05:03.01",
+ "outTime": "00:05:06.36",
+ "transcript": "inclusion and equality are good for all of us."
+ },
+ {
+ "inTime": "00:05:06.36",
+ "outTime": "00:05:09.35",
+ "transcript": "We are all healthier, wealthier and wiser"
+ },
+ {
+ "inTime": "00:05:09.35",
+ "outTime": "00:05:12.19",
+ "transcript": "when our society is inclusive and equal."
+ },
+ {
+ "inTime": "00:05:12.19",
+ "outTime": "00:05:15.36",
+ "transcript": "We've also discovered that diverse groups"
+ },
+ {
+ "inTime": "00:05:15.36",
+ "outTime": "00:05:18.93",
+ "transcript": "are more innovative and creative, and better at planning and predicting."
+ },
+ {
+ "inTime": "00:05:18.93",
+ "outTime": "00:05:23.73",
+ "transcript": "We've experimented with new organization like"
+ },
+ {
+ "inTime": "00:05:23.73",
+ "outTime": "00:05:26.33",
+ "transcript": "most popular, to be ignored"
+ },
+ {
+ "inTime": "00:05:26.33",
+ "outTime": "00:05:28.69",
+ "transcript": "friend, not friend."
+ },
+ {
+ "inTime": "00:05:28.69",
+ "outTime": "00:05:31.03",
+ "transcript": "But we can do better."
+ },
+ {
+ "inTime": "00:05:31.03",
+ "outTime": "00:05:33.26",
+ "transcript": "We can afford to be generous in our design,"
+ },
+ {
+ "inTime": "00:05:33.26",
+ "outTime": "00:05:35.39",
+ "transcript": "we have fewer excuses to exclude."
+ },
+ {
+ "inTime": "00:05:35.39",
+ "outTime": "00:05:37.56",
+ "transcript": "We can be true to our diversity."
+ },
+ {
+ "inTime": "00:05:37.56",
+ "outTime": "00:05:43.06",
+ "transcript": "Perhaps now, we can find a way to make room for us all."
+ }
+ ]
+}
View
544 tests/html/TestTranscripts.fr.json
@@ -0,0 +1,544 @@
+{
+ "transcriptCollection": [
+ {
+ "inTime": "00:00:01.77",
+ "outTime": "00:00:04.03",
+ "transcript": "Eeny, meeny, miny, moe,"
+ },
+ {
+ "inTime": "00:00:04.03",
+ "outTime": "00:00:05.99",
+ "transcript": "Attrape un tigre par son orteil"
+ },
+ {
+ "inTime": "00:00:05.99",
+ "outTime": "00:00:08.05",
+ "transcript": "S'il crie laisses le aller"
+ },
+ {
+ "inTime": "00:00:08.05",
+ "outTime": "00:00:10.96",
+ "transcript": "Eeny, meeny, miny moe."
+ },
+ {
+ "inTime": "00:00:12.70",
+ "outTime": "00:00:14.64",
+ "transcript": "Je suis Jutta Treviranus"
+ },
+ {
+ "inTime": "00:00:14.64",
+ "outTime": "00:00:16.04",
+ "transcript": "et je suis venu me demander"
+ },
+ {
+ "inTime": "00:00:16.04",
+ "outTime": "00:00:18.38",
+ "transcript": "si nous avons une chance de réorganiser notre futur."
+ },
+ {
+ "inTime": "00:00:18.38",
+ "outTime": "00:00:23.23",
+ "transcript": "David Kelley affirme que l'avenir du design est centré sur l'Homme."
+ },
+ {
+ "inTime": "00:00:23.23",
+ "outTime": "00:00:25.51",
+ "transcript": "La plupart des experts sont d'accord."
+ },
+ {
+ "inTime": "00:00:25.51",
+ "outTime": "00:00:29.02",
+ "transcript": "Reste la question - Quel Homme?"
+ },
+ {
+ "inTime": "00:00:29.02",
+ "outTime": "00:00:32.46",
+ "transcript": "Une condition humaine est inévitable, la diversité."
+ },
+ {
+ "inTime": "00:00:32.46",
+ "outTime": "00:00:34.70",
+ "transcript": "Il n'y a aucun humain générique."
+ },
+ {
+ "inTime": "00:00:34.70",
+ "outTime": "00:00:37.33",
+ "transcript": "Même les clones et les jumeaux ne sont pas les mêmes."
+ },
+ {
+ "inTime": "00:00:37.33",
+ "outTime": "00:00:40.42",
+ "transcript": "Nous différons de l'un à l'autre,"
+ },
+ {
+ "inTime": "00:00:40.42",
+ "outTime": "00:00:43.54",
+ "transcript": "mais aussi d'un moment à l'autre,"
+ },
+ {
+ "inTime": "00:00:43.54",
+ "outTime": "00:00:46.84",
+ "transcript": "d'un contexte à l'autre."
+ },
+ {
+ "inTime": "00:00:46.84",
+ "outTime": "00:00:49.91",
+ "transcript": "Mais la diversité et les différences deviennent écrasantes"
+ },
+ {
+ "inTime": "00:00:49.91",
+ "outTime": "00:00:52.94",
+ "transcript": "et nous développons des stratégies pour faire face à cette diversité."
+ },
+ {
+ "inTime": "00:00:52.94",
+ "outTime": "00:00:55.56",
+ "transcript": "Nous essayons de rendre les choses plus simples,"
+ },
+ {
+ "inTime": "00:00:55.60",
+ "outTime": "00:00:57.50",
+ "transcript": "moins complexe, moins chaotique."
+ },
+ {
+ "inTime": "00:00:57.50",
+ "outTime": "00:01:00.00",
+ "transcript": "Une autre partie de la condition humaine est que nous"
+ },
+ {
+ "inTime": "00:01:00.00",
+ "outTime": "00:01:03.18",
+ "transcript": "essayons de trouver des communités et des connexions."
+ },
+ {
+ "inTime": "00:01:03.20",
+ "outTime": "00:01:09.53",
+ "transcript": "Nous formons des groupes formels et informels avec des critères explicites et implicites."
+ },
+ {
+ "inTime": "00:01:09.55",
+ "outTime": "00:01:13.97",
+ "transcript": "Nous organisons, nous créons des catégories, nous filtrons, nous labélisons."
+ },
+ {
+ "inTime": "00:01:13.97",
+ "outTime": "00:01:19.67",
+ "transcript": "Dans nos moments les plus précaires nous divisons en deux, nous créons des binaires:"
+ },
+ {
+ "inTime": "00:01:19.67",
+ "outTime": "00:01:21.86",
+ "transcript": "masculin, féminin"
+ },
+ {
+ "inTime": "00:01:21.86",
+ "outTime": "00:01:24.21",
+ "transcript": "handicapés, normale"
+ },
+ {
+ "inTime": "00:01:24.21",
+ "outTime": "00:01:27.03",
+ "transcript": "gauche, droite"
+ },
+ {
+ "inTime": "00:01:27.03",
+ "outTime": "00:01:29.57",
+ "transcript": "nous, eux."
+ },
+ {
+ "inTime": "00:01:29.57",
+ "outTime": "00:01:34.98",
+ "transcript": "Cela se traduit dans les questions: \"Qui appartient?\" et \"Qui est exclu?\""
+ },
+ {
+ "inTime": "00:01:34.98",
+ "outTime": "00:01:37.53",
+ "transcript": "L'adhésion à des groupes peut être de son propre chef,"
+ },
+ {
+ "inTime": "00:01:37.53",
+ "outTime": "00:01:40.46",
+ "transcript": "peut être imposée, peut-être même policée."
+ },
+ {
+ "inTime": "00:01:40.46",
+ "outTime": "00:01:44.17",
+ "transcript": "Les groupes sont utilisés pour affirmer ou attribuer des privilèges et des pouvoirs."
+ },
+ {
+ "inTime": "00:01:44.17",
+ "outTime": "00:01:46.92",
+ "transcript": "Nous utilisons des groupes pour juger"
+ },
+ {
+ "inTime": "00:01:46.92",
+ "outTime": "00:01:49.22",
+ "transcript": "des valeurs sont attribuées à des groupes"
+ },
+ {
+ "inTime": "00:01:49.22",
+ "outTime": "00:01:51.88",
+ "transcript": "souvent des caractéristiques qui n'ont rien à voir avec"
+ },
+ {
+ "inTime": "00:01:51.88",
+ "outTime": "00:01:53.35",
+ "transcript": "les propriétés originales des fondateurs des groupes"
+ },
+ {
+ "inTime": "00:01:53.35",
+ "outTime": "00:01:55.98",
+ "transcript": "sont souvent généralisés à tous les individus du groupe."
+ },
+ {
+ "inTime": "00:01:55.98",
+ "outTime": "00:02:00.07",
+ "transcript": "Parfois, les gens qui sont dans un groupe contre leur grès"
+ },
+ {
+ "inTime": "00:02:00.07",
+ "outTime": "00:02:02.00",
+ "transcript": "prennent la propriété du groupe et le réforme"
+ },
+ {
+ "inTime": "00:02:02.00",
+ "outTime": "00:02:04.42",
+ "transcript": "ses classifications et ses valeurs."
+ },
+ {
+ "inTime": "00:02:04.42",
+ "outTime": "00:02:08.44",
+ "transcript": "Parfois, quelqu'un a l'audace"
+ },
+ {
+ "inTime": "00:02:08.44",
+ "outTime": "00:02:11.00",
+ "transcript": "de sortir de la catégorie que nous lui avons imposé"
+ },
+ {
+ "inTime": "00:02:11.00",
+ "outTime": "00:02:16.90",
+ "transcript": "mais pour préserver notre catégorie, nous pouvons la renvoyer comme une anomalie."
+ },
+ {
+ "inTime": "00:02:16.90",
+ "outTime": "00:02:20.03",
+ "transcript": "Certains groupes sont plus fluides tandis que d'autres sont plus fixes."
+ },
+ {
+ "inTime": "00:02:20.03",
+ "outTime": "00:02:23.56",
+ "transcript": "Nous ne créons pas seulement des groupes, mais des groupes de groupes"
+ },
+ {
+ "inTime": "00:02:23.56",
+ "outTime": "00:02:25.66",
+ "transcript": "et des groupes, de groupes, de groupes."
+ },
+ {
+ "inTime": "00:02:25.66",
+ "outTime": "00:02:29.09",
+ "transcript": "L'adhésion à un groupe peut nous accorder l'adhésion à d'autres groupes."
+ },
+ {
+ "inTime": "00:02:29.09",
+ "outTime": "00:02:33.03",
+ "transcript": "Mais malgré tout cela, nous sommes différents"
+ },
+ {
+ "inTime": "00:02:33.03",
+ "outTime": "00:02:34.85",
+ "transcript": "nous sommes complexe"
+ },
+ {
+ "inTime": "00:02:34.85",
+ "outTime": "00:02:36.45",
+ "transcript": "nous sommes chaotique."
+ },
+ {
+ "inTime": "00:02:36.45",
+ "outTime": "00:02:38.81",
+ "transcript": "Individuellement, nous sommes différents"
+ },
+ {
+ "inTime": "00:02:38.81",
+ "outTime": "00:02:40.44",
+ "transcript": "au fil du temps, dans des contextes différents"
+ },
+ {
+ "inTime": "00:02:40.44",
+ "outTime": "00:02:42.35",
+ "transcript": "dans des rôles différents, dans des groupes différents."
+ },
+ {
+ "inTime": "00:02:42.35",
+ "outTime": "00:02:45.42",
+ "transcript": "Nous devons affirmer notre spécificité"
+ },
+ {
+ "inTime": "00:02:45.42",
+ "outTime": "00:02:47.86",
+ "transcript": "nous avons besoin de former et de perfectionner notre identité."
+ },
+ {
+ "inTime": "00:02:47.86",
+ "outTime": "00:02:50.91",
+ "transcript": "Nous luttons contre l'identité qui nous est imposé."
+ },
+ {
+ "inTime": "00:02:50.91",
+ "outTime": "00:02:56.36",
+ "transcript": "Généralement, les gens ne s'intègrent pas facilement dans les catégories qu'on leurs assigne"
+ },
+ {
+ "inTime": "00:02:56.36",
+ "outTime": "00:02:58.98",
+ "transcript": "et pourtant nous persistons à les affecter."
+ },
+ {
+ "inTime": "00:02:58.98",
+ "outTime": "00:03:02.63",
+ "transcript": "Et puis, quelque chose de nouveau arrive"
+ },
+ {
+ "inTime": "00:03:02.63",
+ "outTime": "00:03:05.41",
+ "transcript": "et secoue nos groupes, nos catégories et nos règles"
+ },
+ {
+ "inTime": "00:03:05.41",
+ "outTime": "00:03:08.26",
+ "transcript": "et nous avons besoin d'ajuster, de reconstruire et de repenser."
+ },
+ {
+ "inTime": "00:03:08.26",
+ "outTime": "00:03:12.53",
+ "transcript": "Quelque chose comme: les réseaux, le numérique."
+ },
+ {
+ "inTime": "00:03:12.53",
+ "outTime": "00:03:15.47",
+ "transcript": "Ce nouveau monde numérique et connecté"
+ },
+ {
+ "inTime": "00:03:15.47",
+ "outTime": "00:03:17.87",
+ "transcript": "remet en question la façon dont nous groupons les choses"
+ },
+ {
+ "inTime": "00:03:17.87",
+ "outTime": "00:03:20.75",
+ "transcript": "et défi nos excuses pour ne pas laisser les gens sortir."
+ },
+ {
+ "inTime": "00:03:20.75",
+ "outTime": "00:03:25.46",
+ "transcript": "Le numérique change notre vision du temps, de l'espace et des distances"
+ },
+ {
+ "inTime": "00:03:25.46",
+ "outTime": "00:03:31.08",
+ "transcript": "et par extension notre point de vue du design, ce qui est possible et du coût des choses."
+ },
+ {
+ "inTime": "00:03:31.08",
+ "outTime": "00:03:36.04",
+ "transcript": "Les objets numériques sont plastique, mutable, malléable et adaptable."
+ },
+ {
+ "inTime": "00:03:36.04",
+ "outTime": "00:03:39.50",
+ "transcript": "Avant, tout le monde ne pouvait pas convenir"
+ },
+ {
+ "inTime": "00:03:39.50",
+ "outTime": "00:03:42.16",
+ "transcript": "autoriser quelqu'un signifiait mettre quelqu'un d'autre à l'écart."
+ },
+ {
+ "inTime": "00:03:42.16",
+ "outTime": "00:03:46.06",
+ "transcript": "Dans le numérique, tout est très extensible"
+ },
+ {
+ "inTime": "00:03:46.06",
+ "outTime": "00:03:49.76",
+ "transcript": "Avant, ce que nous créions ne pouvait pas convenir à tous."
+ },
+ {
+ "inTime": "00:03:49.76",
+ "outTime": "00:03:51.77",
+ "transcript": "Alors nous l'adaptions au plus grand groupe"
+ },
+ {
+ "inTime": "00:03:51.77",
+ "outTime": "00:03:54.53",
+ "transcript": "Nous l'avons fait pour le groupe appelé moyen ou typique"
+ },
+ {
+ "inTime": "00:03:54.53",
+ "outTime": "00:03:58.26",
+ "transcript": "Ceci laissait de côté tous ceux qui ne sont pas moyens ou typiques."
+ },
+ {
+ "inTime": "00:03:58.26",
+ "outTime": "00:04:03.39",
+ "transcript": "Dans la réalité numérique ce que nous faisons peut être reconfiguré, adapté"
+ },
+ {
+ "inTime": "00:04:03.39",
+ "outTime": "00:04:06.27",
+ "transcript": "et prendre une forme qui est la meilleur pour chaque individu."
+ },
+ {
+ "inTime": "00:04:06.27",
+ "outTime": "00:04:11.90",
+ "transcript": "Dans le monde solide, chaque copie coûte presque autant que l'original."
+ },
+ {
+ "inTime": "00:04:11.90",
+ "outTime": "00:04:14.35",
+ "transcript": "la consommation consommait en fait."
+ },
+ {
+ "inTime": "00:04:14.35",
+ "outTime": "00:04:18.56",
+ "transcript": "Dans le monde numérique, nous pouvons copier presque sans coût."
+ },
+ {
+ "inTime": "00:04:18.56",
+ "outTime": "00:04:21.00",
+ "transcript": "La consommation ne consomme plus."
+ },
+ {
+ "inTime": "00:04:21.00",
+ "outTime": "00:04:24.52",
+ "transcript": "Avant, il fallait beaucoup de temps et d'effort"
+ },
+ {
+ "inTime": "00:04:24.52",
+ "outTime": "00:04:27.23",
+ "transcript": "pour livrer des choses, surtout pour les gens très loin."
+ },
+ {
+ "inTime": "00:04:27.23",
+ "outTime": "00:04:30.93",
+ "transcript": "Maintenant, il est aussi facile de livrer des choses dans le monde"
+ },
+ {
+ "inTime": "00:04:30.93",
+ "outTime": "00:04:33.13",
+ "transcript": "que de le livrer juste à côté"
+ },
+ {
+ "inTime": "00:04:33.13",
+ "outTime": "00:04:36.85",
+ "transcript": "Avant, si on ne placait pas les choses dans un endroit fixe"
+ },
+ {
+ "inTime": "00:04:36.85",
+ "outTime": "00:04:39.53",
+ "transcript": "nous avions du mal à les retrouver."
+ },
+ {
+ "inTime": "00:04:39.53",
+ "outTime": "00:04:43.63",
+ "transcript": "Maintenant, nous pouvons les placer n'importe où sur le réseau et"
+ },
+ {
+ "inTime": "00:04:43.63",
+ "outTime": "00:04:46.26",
+ "transcript": "les récupérer n'importe où sur le réseau."
+ },
+ {
+ "inTime": "00:04:46.26",
+ "outTime": "00:04:50.13",
+ "transcript": "Avant, nous avions besoin d'étiqueter les choses clairement et simplement."
+ },
+ {
+ "inTime": "00:04:50.13",
+ "outTime": "00:04:52.80",
+ "transcript": "Afin de pouvoir les reconnaître et de savoir quoi faire avec elles."
+ },
+ {
+ "inTime": "00:04:52.80",
+ "outTime": "00:04:56.44",
+ "transcript": "Maintenant nous pouvons voir une description de chaque personne ou chose"
+ },
+ {
+ "inTime": "00:04:56.44",
+ "outTime": "00:04:59.02",
+ "transcript": "voir ce qui est util et pertinent à notre but."
+ },
+ {
+ "inTime": "00:04:59.02",
+ "outTime": "00:05:03.01",
+ "transcript": "Et en passant, nous avons appris que"
+ },
+ {
+ "inTime": "00:05:03.01",
+ "outTime": "00:05:06.36",
+ "transcript": "l'inclusion et l'égalité sont bons pour nous tous."
+ },
+ {
+ "inTime": "00:05:06.36",
+ "outTime": "00:05:09.35",
+ "transcript": "Nous sommes tous sains, plus riches et plus sage"
+ },
+ {
+ "inTime": "00:05:09.35",
+ "outTime": "00:05:12.19",
+ "transcript": "quand notre société est inclusive et égalitaire."
+ },
+ {
+ "inTime": "00:05:12.19",
+ "outTime": "00:05:15.36",
+ "transcript": "Nous avons également découvert que les divers groupes"
+ },
+ {
+ "inTime": "00:05:15.36",
+ "outTime": "00:05:18.93",
+ "transcript": "sont plus innovants et créatifs, et plus adapté à la planification et aux prévisions."
+ },
+ {
+ "inTime": "00:05:18.93",
+ "outTime": "00:05:23.73",
+ "transcript": "Nous avons expérimenté de nouvelles organisations comme"
+ },
+ {
+ "inTime": "00:05:23.73",
+ "outTime": "00:05:26.33",
+ "transcript": "la plus populaire, celui à ignorer"
+ },
+ {
+ "inTime": "00:05:26.33",
+ "outTime": "00:05:28.69",
+ "transcript": "ami, pas un ami."
+ },
+ {
+ "inTime": "00:05:28.69",
+ "outTime": "00:05:31.03",
+ "transcript": "Mais nous pouvons faire mieux."
+ },
+ {
+ "inTime": "00:05:31.03",
+ "outTime": "00:05:33.26",
+ "transcript": "Nous pouvons nous permettre d'être généreux dans notre conception"
+ },
+ {
+ "inTime": "00:05:33.26",
+ "outTime": "00:05:35.39",
+ "transcript": "nous avons moins d'excuses à exclure."
+ },
+ {
+ "inTime": "00:05:35.39",
+ "outTime": "00:05:37.56",
+ "transcript": "Nous pouvons être fidèles à notre diversité."
+ },
+ {
+ "inTime": "00:05:37.56",
+ "outTime": "00:05:43.06",
+ "transcript": "Peut-être maintenant, nous pouvons trouver un moyen de faire de la place pour tous."
+ }
+ ]
+}
View
33 tests/html/VideoFramework-test.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Video Framework Test Suite</title>
+
+ <link rel="stylesheet" type="text/css" media="screen" href="../lib/qunit/css/qunit.css" />
+
+ <script type="text/javascript" src="../../lib/infusion/MyInfusion.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_framework.js"></script>
+
+ <!-- jqUnit test framework js files -->
+ <script type="text/javascript" src="../lib/qunit/js/qunit.js"></script>
+ <script type="text/javascript" src="../lib/jqUnit/js/jqUnit.js"></script>
+
+ <!-- These are tests that have been written using this page as data and test supports -->
+ <script type="text/javascript" src="../js/VideoFrameworkTests.js"></script>
+
+ </head>
+ <body id="body">
+ <!-- This is the markup that jqUnit will look for when running tests and displaying the results -->
+ <h1 id="qunit-header">Video Framework Test Suite</h1>
+ <h2 id="qunit-banner"></h2>
+ <div id="qunit-testrunner-toolbar"></div>
+ <h2 id="qunit-userAgent"></h2>
+ <ol id="qunit-tests"></ol>
+
+ <div id="main">
+
+ </div> <!-- /main -->
+
+ </body>
+</html>
View
49 tests/html/VideoPlayer-IntegrationTest.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Video Player Test Suite</title>
+
+ <link rel="stylesheet" type="text/css" media="screen" href="../lib/qunit/css/qunit.css" />
+
+ <script type="text/javascript" src="../../lib/infusion/MyInfusion.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_framework.js"></script>
+ <script type="text/javascript" src="../../lib/jquery-ui/js/jquery.ui.button.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_html5Captionator.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_controllers.js"></script>
+ <script type="text/javascript" src="../../js/ToggleButton.js"></script>
+ <script type="text/javascript" src="../../js/MenuButton.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_media.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_transcript.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_intervalEventsConductor.js"></script>
+ <script type="text/javascript" src="../../js/HTML5-backcompat.js"></script>
+
+ <!-- jqUnit test framework js files -->
+ <script type="text/javascript" src="../lib/qunit/js/qunit.js"></script>
+ <script type="text/javascript" src="../lib/jqUnit/js/jqUnit.js"></script>
+
+ <!-- These are tests that have been written using this page as data and test supports -->
+ <script type="text/javascript" src="../js/VideoPlayerIntegrationTests.js"></script>
+
+ <!-- Utils -->
+ <script type="text/javascript" src="../../lib/captionator/js/captionator.js"></script>
+
+ </head>
+ <body id="body">
+ <!-- This is the markup that jqUnit will look for when running tests and displaying the results -->
+ <h1 id="qunit-header">Video Player Integration Test Suite</h1>
+ <h2 id="qunit-banner"></h2>
+ <div id="qunit-testrunner-toolbar"></div>
+ <h2 id="qunit-userAgent"></h2>
+ <ol id="qunit-tests"></ol>
+ <div id="main">
+
+ <div class="videoPlayer-playButton fl-videoPlayer"></div>
+ <div class="videoPlayer-containerClick fl-videoPlayer"></div>
+ <div class="videoPlayer-transcript fl-videoPlayer"></div>
+
+ </div> <!-- /main -->
+
+ </body>
+</html>
View
45 tests/html/VideoPlayerTranscript-test.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Video Player Transcript Test Suite</title>
+
+ <link rel="stylesheet" type="text/css" media="screen" href="../lib/qunit/css/qunit.css" />
+
+ <script type="text/javascript" src="../../lib/infusion/MyInfusion.js"></script>
+ <script type="text/javascript" src="../../lib/captionator/js/captionator.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_intervalEventsConductor.js"></script>
+ <script type="text/javascript" src="../../js/VideoPlayer_transcript.js"></script>
+
+ <!-- jqUnit test framework js files -->
+ <script type="text/javascript" src="../lib/qunit/js/qunit.js"></script>
+ <script type="text/javascript" src="../lib/jqUnit/js/jqUnit.js"></script>
+
+ <!-- These are tests that have been written using this page as data and test supports -->
+ <script type="text/javascript" src="../js/VideoPlayerTranscriptTests.js"></script>
+
+ </head>
+ <body id="body">
+ <!-- This is the markup that jqUnit will look for when running tests and displaying the results -->
+ <h1 id="qunit-header">Video Player Transcript Test Suite</h1>
+ <h2 id="qunit-banner"></h2>
+ <div id="qunit-testrunner-toolbar"></div>
+ <h2 id="qunit-userAgent"></h2>
+ <ol id="qunit-tests"></ol>
+
+ <div id="main">
+ <div class="flc-videoPlayer-transcriptArea fl-videoPlayer-transcriptArea">
+ <div class="fl-videoPlayer-transcript-controls">
+ <select class="flc-videoPlayer-transcripts-language-dropdown fl-videoPlayer-transcripts-language-dropdown">
+ <option></option>
+ </select>
+ <button type="button" class="flc-videoPlayer-transcripts-close-button fl-videoPlayer-button fl-videoPlayer-transcripts-close-button"></button>
+ </div>
+
+ <div class="flc-videoPlayer-transcript-text fl-videoPlayer-transcript-text"></div>
+ </div>
+ </div> <!-- /main -->
+
+ </body>
+</html>
View
18 tests/js/ToggleButtonTests.js
@@ -73,6 +73,24 @@ fluid.registerNamespace("fluid.tests");
});
});
+ toggleButtonTests.asyncTest("Press", function () {
+ expect(3);
+ var testComponent;
+ testComponent = fluid.tests.initToggleButton({
+ listeners: {
+ onReady: function (that) {
+ jqUnit.assertEquals("Initial state should be 'false'", false, that.readIndirect("modelPath"));
+ that.press();
+ },
+ onPress: function (that) {
+ jqUnit.assertTrue("onPress event should fire", true);
+ jqUnit.assertEquals("State should change to be 'true'", true, that.readIndirect("modelPath"));
+ start();
+ }
+ }
+ });
+ });
+
toggleButtonTests.asyncTest("Default integrated functionality", function () {
var testComponent = fluid.tests.initToggleButton({
listeners: {
View
59 tests/js/VideoFrameworkTests.js
@@ -0,0 +1,59 @@
+/*
+Copyright 2012 OCAD University
+
+Licensed under the Educational Community License (ECL), Version 2.0 or the New
+BSD license. You may not use this file except in compliance with one these
+Licenses.
+
+You may obtain a copy of the ECL 2.0 License and BSD License at
+https://github.com/fluid-project/infusion/raw/master/Infusion-LICENSE.txt
+*/
+
+// Declare dependencies
+/*global fluid, jqUnit, expect, jQuery, start*/
+
+// JSLint options
+/*jslint white: true, funcinvoke: true, undef: true, newcap: true, nomen: true, regexp: true, bitwise: true, browser: true, forin: true, maxerr: 100, indent: 4 */
+
+fluid.registerNamespace("fluid.tests");
+
+(function ($) {
+ $(document).ready(function () {
+
+ var videoFrameworkTests = new jqUnit.TestCase("Video Framework Tests");
+
+ videoFrameworkTests.asyncTest("linearRangeGuard", function () {
+ expect(3);
+