Skip to content

Commit

Permalink
HFP-1779 Refactor xAPI statement building
Browse files Browse the repository at this point in the history
There was some duplicate code that was used in several functions that could
also be supported by a builder function. Will be more relevant as new
xAPI statements will get added.
Cmp. #17 (comment)
  • Loading branch information
otacke committed Mar 14, 2018
1 parent c8940b2 commit a88c17b
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 183 deletions.
2 changes: 1 addition & 1 deletion scripts/html5.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ H5P.VideoHtml5 = (function ($) {
}
}

return videoXAPI.getArgsXAPIInitialized(video.currentTime, video.videoWidth, video.videoHeight, video.playbackRate, video.volume, ccEnabled, ccLanguage);
return videoXAPI.getArgsXAPIInitialized(video.videoWidth, video.videoHeight, video.playbackRate, video.volume, ccEnabled, ccLanguage);

};

Expand Down
267 changes: 86 additions & 181 deletions scripts/x-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,41 @@ H5P.VideoXAPI = (function ($) {
var currentTime = 0;


/**
* Generate common xAPI statement elements (Video Profile).
* @param {Object} params - Parameters.
* @param {string} params.verb - Verb for the xAPI statement.
* @param {Object} [params.result] - Extensions for the object.
* @param {Object} [params.extensionsContext] - Extensions for the context.
* @return {Object} JSON xAPI statement
*/
self.getArgsXAPI = function (params) {
params.extensionsContext = params.extensionsContext || {};

var dateTime = new Date();
var timeStamp = dateTime.toISOString();

return {
'verb': {
'id': 'http://adlnet.gov/expapi/verbs/' + params.verb,
'display': {'en-US': params.verb}
},
'object': getXAPIObject(),
'result': params.result,
'context': {
'contextActivities': {'category': [{'id': 'https://w3id.org/xapi/video'}]},
'extensions': params.extensionsContext
},
'timestamp': timeStamp
};
};

/**
* Generates 'initialized' xAPI statement (Video Profile).
* @see https://liveaspankaj.gitbooks.io/xapi-video-profile/content/statement_data_model.html#231-initialized
*
* @public
* @param {Number} currentTime time of the video currently
* @param {Number} width width of the current screen
* @param {Number} height height of the current video screen
* @param {Number} rate playback rate
Expand All @@ -51,14 +80,12 @@ H5P.VideoXAPI = (function ($) {
* @returns {Object} JSON xAPI statement
*
*/
self.getArgsXAPIInitialized = function (currentTime, width, height, rate, volume, ccEnabled, ccLanguage, quality) {
self.getArgsXAPIInitialized = function (width, height, rate, volume, ccEnabled, ccLanguage, quality) {
// If quality isn't provided, set it to the height of the video.
quality = typeof quality !== 'undefined' ? quality : height;

// Variables used in compiling xAPI results.
var dateTime = new Date();
var timeStamp = dateTime.toISOString();
var resultExtTime = formatFloat(currentTime);

var screenSize = screen.width + 'x' + screen.height;
var playbackSize = (width !== undefined && width !== '') ? width + 'x' + height : 'undetermined';
var playbackRate = rate;
Expand Down Expand Up @@ -95,24 +122,10 @@ H5P.VideoXAPI = (function ($) {
extensions['https://w3id.org/xapi/video/extensions/volume'] = volume;
}

return {
'verb': {
'id': 'http://adlnet.gov/expapi/verbs/initialized',
'display': {
'en-US': 'initialized'
}
},
'object': getXAPIObject(),
'context' : {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': extensions
},
'timestamp': timeStamp
};
return self.getArgsXAPI({
verb: 'initialized',
extensionsContext: extensions
});
};

/**
Expand All @@ -124,37 +137,18 @@ H5P.VideoXAPI = (function ($) {
* @returns {Object} JSON xAPI statement
*/
self.getArgsXAPIPlayed = function (currentTime) {
var dateTime = new Date();
var timeStamp = dateTime.toISOString();

var resultExtTime = formatFloat(currentTime);
playingSegmentStart = resultExtTime;

return {
'verb': {
'id': 'https://w3id.org/xapi/video/verbs/played',
'display': {
'en-US': 'played'
}
return self.getArgsXAPI({
verb: 'played',
result: {extensions: {
'https://w3id.org/xapi/video/extensions/time': resultExtTime}
},
'object': getXAPIObject(),
'result': {
'extensions': {
'https://w3id.org/xapi/video/extensions/time': resultExtTime,
}
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
},
'timestamp': timeStamp
};
extensionsContext: {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
});
};

/**
Expand All @@ -167,13 +161,8 @@ H5P.VideoXAPI = (function ($) {
* @returns {Object} JSON xAPI statement
*/
self.getArgsXAPIPaused = function (currentTime, duration) {
var dateTime = new Date();
var timeStamp = dateTime.toISOString();

var resultExtTime = formatFloat(currentTime);

var progress = self.getProgress(currentTime, duration);

endPlayingSegment(resultExtTime);

var extensions = {};
Expand All @@ -187,29 +176,13 @@ H5P.VideoXAPI = (function ($) {
extensions['https://w3id.org/xapi/video/extensions/played-segments'] = stringifyPlayedSegments();
}

return {
'verb': {
'id': 'https://w3id.org/xapi/video/verbs/paused',
'display': {
'en-US': 'paused'
}
},
'object': getXAPIObject(),
'result': {
'extensions': extensions
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
},
'timestamp' : timeStamp
};
return self.getArgsXAPI({
verb: 'paused',
result: {extensions: extensions},
extensionsContext: {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
});
};

/**
Expand All @@ -221,38 +194,22 @@ H5P.VideoXAPI = (function ($) {
* @returns {Object} JSON xAPI statement
*/
self.getArgsXAPISeeked = function (currentTime) {
var dateTime = new Date();
var timeStamp = dateTime.toISOString();
var resultExtTime = formatFloat(currentTime);
endPlayingSegment(formatFloat(self.previousTime));
playingSegmentStart = resultExtTime;

return {
'verb': {
'id': 'https://w3id.org/xapi/video/verbs/seeked',
'display': {
'en-US': 'seeked'
}
},
'object': getXAPIObject(),
'result': {
'extensions' : {
return self.getArgsXAPI({
verb: 'seeked',
result: {
extensions: {
'https://w3id.org/xapi/video/extensions/time-from': formatFloat(self.previousTime),
'https://w3id.org/xapi/video/extensions/time-to': playingSegmentStart
}
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
},
'timestamp' : timeStamp
};
extensionsContext: {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
});
};

/**
Expand All @@ -266,37 +223,19 @@ H5P.VideoXAPI = (function ($) {
* @returns {Object} JSON xAPI statement
*/
self.getArgsXAPIVolumeChanged = function (currentTime, muted, volume) {
var dateTime = new Date();
var timeStamp = dateTime.toISOString();
volumeChangedAt = formatFloat(currentTime);
volume = muted ? 0 : formatFloat(volume);

return {
'verb': {
'id': 'http://adlnet.gov/expapi/verbs/interacted',
'display': {
'en-US': 'interacted'
}
return self.getArgsXAPI({
verb: 'interacted',
result: {extensions: {
'https://w3id.org/xapi/video/extensions/time': volumeChangedAt}
},
'object': getXAPIObject(),
'result' : {
'extensions': {
'https://w3id.org/xapi/video/extensions/time': volumeChangedAt
}
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': {
'https://w3id.org/xapi/video/extensions/session-id': sessionID,
'https://w3id.org/xapi/video/extensions/volume': volume
}
},
'timestamp' : timeStamp
};
extensionsContext: {
'https://w3id.org/xapi/video/extensions/session-id': sessionID,
'https://w3id.org/xapi/video/extensions/volume': volume
}
});
};

/**
Expand All @@ -312,14 +251,12 @@ H5P.VideoXAPI = (function ($) {
*/
self.getArgsXAPIFullScreen = function (currentTime, width, height, fullscreen) {
fullscreen = typeof fullscreen !== 'undefined' ? fullscreen : false;

var dateTime = new Date();
var timeStamp = dateTime.toISOString();
var resultExtTime = formatFloat(currentTime);
var isFullscreen = Document.fullscreenElement !== null || document.mozFullScreen || document.webkitIsFullScreen || fullscreen;
var screenSize = screen.width + 'x' + screen.height;
var playbackSize = width + 'x' + height;

var resultExtTime = formatFloat(currentTime);

var extensions = {};
if (typeof sessionID !== 'undefined') {
extensions['https://w3id.org/xapi/video/extensions/session-id'] = sessionID;
Expand All @@ -334,29 +271,13 @@ H5P.VideoXAPI = (function ($) {
extensions['https://w3id.org/xapi/video/extensions/video-playback-size'] = playbackSize;
}

return {
'verb': {
'id': 'http://adlnet.gov/expapi/verbs/interacted',
'display': {
'en-US': 'interacted'
}
},
'object': getXAPIObject(),
'result': {
'extensions': {
'https://w3id.org/xapi/video/extensions/time': resultExtTime
}
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': extensions
return self.getArgsXAPI({
verb: 'interacted',
result: {extensions: {
'https://w3id.org/xapi/video/extensions/time': resultExtTime}
},
'timestamp' : timeStamp
};
extensionsContext: extensions
});
};

/**
Expand All @@ -371,10 +292,8 @@ H5P.VideoXAPI = (function ($) {
*/
self.getArgsXAPICompleted = function (currentTime, duration, progress) {
var resultExtTime = formatFloat(currentTime);
var dateTime = new Date();
endPlayingSegment(resultExtTime);
playingSegmentStart = 0;
var timeStamp = dateTime.toISOString();

var extensions = {};
if (typeof resultExtTime !== 'undefined') {
Expand All @@ -387,31 +306,17 @@ H5P.VideoXAPI = (function ($) {
extensions['https://w3id.org/xapi/video/extensions/played-segments'] = stringifyPlayedSegments();
}

return {
'verb': {
'id': 'http://adlnet.gov/expapi/verbs/completed',
'display': {
'en-US': 'completed'
}
},
'object': getXAPIObject(),
'result': {
return self.getArgsXAPI({
verb: 'completed',
result: {
'extensions': extensions,
'completion' : true,
'duration' : secondsToISO8601Duration(duration)
},
'context': {
'contextActivities': {
'category': [{
'id': 'https://w3id.org/xapi/video'
}]
},
'extensions': {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
'completion': true,
'duration': secondsToISO8601Duration(duration)
},
'timestamp' : timeStamp
};
extensionsContext: {
'https://w3id.org/xapi/video/extensions/session-id': sessionID
}
});
};

/**
Expand Down Expand Up @@ -574,4 +479,4 @@ H5P.VideoXAPI = (function ($) {
};

return XAPI;
})(H5P.jQuery);
})(H5P.jQuery);
Loading

0 comments on commit a88c17b

Please sign in to comment.