This repository has been archived by the owner on Sep 30, 2021. It is now read-only.
/
flowplayer.drive-analytics.js
99 lines (87 loc) · 3.33 KB
/
flowplayer.drive-analytics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*!
Drive analytics plugin for Flowplayer HTML5
Copyright (c) 2016, Flowplayer Oy
Released under the ISC License:
https://opensource.org/licenses/ISC
*/
(function() {
/* global flowplayer, xflow */
var extension = function(flowplayer) {
flowplayer(function(player) {
var nextProgress, p2pBytes = {}, cdnBytes = {};
function _cbHandler(err) {
if (err) {
player.off('.drivetrack'); // Don't bombard the API if it's down
}
}
if (typeof xflow !== 'undefined') xflow.Broker.on(xflow.Events.STATS, function(stats) {
var url = resolveUrl(stats.src);
if (!stats.p2p) {
if (!cdnBytes[url]) cdnBytes[url] = 0;
cdnBytes[url] += stats.loaded;
return;
}
if (!p2pBytes[url]) p2pBytes[url] = 0;
p2pBytes[url] += stats.loaded;
});
player.on('ready', function(_ev, _api, video) {
player.one(player.conf.splash ? 'progress' : 'resume', function() {
track(video.src, 0, flowplayer.version, false, _cbHandler);
nextProgress = 5;
player.on('progress.drivetrack', function(_ev, _api, time) {
if (time < nextProgress) return;
track(player.video.src, nextProgress, flowplayer.version, false, _cbHandler);
nextProgress += 5;
});
player.on('finish.drivetrack', function() {
track(player.video.src, player.video.duration, flowplayer.version, true, _cbHandler);
player.one('resume', function() {
track(video.src, 0, flowplayer.version, false, _cbHandler);
nextProgress = 5;
});
});
player.on('seek', function(_, __, time) {
nextProgress = Math.ceil(time/5)*5;
});
});
function track(src, time, playerVersion, finished, cb) {
if (typeof time !== 'number' || !isFinite(time)) return;
var trackerUrl = getTrackerURL(src);
if (!trackerUrl) return;
var xhr = new XMLHttpRequest();
xhr.open('POST', trackerUrl);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status !== 200) cb(new Error('Request error'));
};
var url = resolveUrl(src);
xhr.send(JSON.stringify({ play: {
src: src,
seconds: time,
p2pBytes: p2pBytes[url],
cdnBytes: cdnBytes[url],
playerVersion: playerVersion,
finished: !!finished
}}));
cdnBytes[url] = 0;
p2pBytes[url] = 0;
}
});
});
};
if (typeof module === 'object' && module.exports) module.exports = extension;
else if (typeof flowplayer === 'function') extension(flowplayer);
function resolveUrl(src) {
var a = document.createElement('a');
a.href = src;
return a.href;
}
function getTrackerURL(src) {
var a = document.createElement('a');
a.href = src;
var productionUrls = ['cdn.flowplayer.org', 'drive.flowplayer.org']
, devUrls = ['cdn.dev.flowplayer.org'];
if (productionUrls.indexOf(a.hostname) !== -1) return 'https://api.flowplayer.org/events/play';
if (devUrls.indexOf(a.hostname) !== -1) return 'https://api.flowplayer.org/events/dev/play';
}
})();