1317: Log and send totalPlayingTime
The current time is quantized to 1s, and `lastTimestamp` is used to prevent duplicate counts because `timeupdate` is fired at ~250ms intervals.
This commit is contained in:
parent
cc666a265a
commit
13b59037a6
2 changed files with 19 additions and 3 deletions
|
@ -194,7 +194,7 @@ const recsys = {
|
||||||
* Player closed. Check to see if primaryUri = playingUri
|
* Player closed. Check to see if primaryUri = playingUri
|
||||||
* if so, send the Entry.
|
* if so, send the Entry.
|
||||||
*/
|
*/
|
||||||
onPlayerDispose: function (claimId, isEmbedded) {
|
onPlayerDispose: function (claimId, isEmbedded, totalPlayingTime) {
|
||||||
if (window && window.store) {
|
if (window && window.store) {
|
||||||
const state = window.store.getState();
|
const state = window.store.getState();
|
||||||
const playingUri = selectPlayingUri(state);
|
const playingUri = selectPlayingUri(state);
|
||||||
|
@ -204,6 +204,7 @@ const recsys = {
|
||||||
if (isEmbedded) {
|
if (isEmbedded) {
|
||||||
recsys.entries[claimId]['isEmbed'] = true;
|
recsys.entries[claimId]['isEmbed'] = true;
|
||||||
}
|
}
|
||||||
|
recsys.entries[claimId]['totalPlayingTime'] = totalPlayingTime;
|
||||||
recsys.sendRecsysEntry(claimId);
|
recsys.sendRecsysEntry(claimId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,6 @@ class RecsysPlugin extends Component {
|
||||||
constructor(player, options) {
|
constructor(player, options) {
|
||||||
super(player, options);
|
super(player, options);
|
||||||
|
|
||||||
// Plugin started
|
|
||||||
if (options.debug) {
|
if (options.debug) {
|
||||||
this.log(`Created recsys plugin for: videoId:${options.videoId}`);
|
this.log(`Created recsys plugin for: videoId:${options.videoId}`);
|
||||||
}
|
}
|
||||||
|
@ -56,6 +55,7 @@ class RecsysPlugin extends Component {
|
||||||
this.lastTimeUpdate = null;
|
this.lastTimeUpdate = null;
|
||||||
this.currentTimeUpdate = null;
|
this.currentTimeUpdate = null;
|
||||||
this.inPause = false;
|
this.inPause = false;
|
||||||
|
this.watchedDuration = { total: 0, lastTimestamp: -1 };
|
||||||
|
|
||||||
// Plugin event listeners
|
// Plugin event listeners
|
||||||
player.on('playing', (event) => this.onPlay(event));
|
player.on('playing', (event) => this.onPlay(event));
|
||||||
|
@ -115,6 +115,21 @@ class RecsysPlugin extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentTimeUpdate = nextCurrentTime;
|
this.currentTimeUpdate = nextCurrentTime;
|
||||||
|
|
||||||
|
// --- Log watch duration (PR 1317) ---
|
||||||
|
// - Total playing time includes scrubbed durations, i.e. can technically be
|
||||||
|
// greater than length of the video if scrubbed back to re-watch parts.
|
||||||
|
// - Factors out playback speed, i.e. if the user watches two minutes of
|
||||||
|
// video at 2x, it's recorded as two minutes, not the browsers clock time
|
||||||
|
// of one minute.
|
||||||
|
// - Excludes jumping frames, e.g. jumping incrementally from start to end
|
||||||
|
// while paused will not contribute to the total despite user having
|
||||||
|
// "watched" the static frames.
|
||||||
|
const curTimeSec = nextCurrentTime.toFixed(0);
|
||||||
|
if (this.watchedDuration.lastTimestamp !== curTimeSec && !this.inPause) {
|
||||||
|
this.watchedDuration.total += 1;
|
||||||
|
this.watchedDuration.lastTimestamp = curTimeSec;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onSeeked(event) {
|
onSeeked(event) {
|
||||||
|
@ -147,7 +162,7 @@ class RecsysPlugin extends Component {
|
||||||
// Some browsers don't send onEnded event when closing player/browser, force it here
|
// Some browsers don't send onEnded event when closing player/browser, force it here
|
||||||
const recsysEvent = newRecsysPlayerEvent(PlayerEvent.event.stop, this.player.currentTime());
|
const recsysEvent = newRecsysPlayerEvent(PlayerEvent.event.stop, this.player.currentTime());
|
||||||
RecSys.onRecsysPlayerEvent(this.options_.videoId, recsysEvent);
|
RecSys.onRecsysPlayerEvent(this.options_.videoId, recsysEvent);
|
||||||
RecSys.onPlayerDispose(this.options_.videoId, this.options_.embedded);
|
RecSys.onPlayerDispose(this.options_.videoId, this.options_.embedded, this.watchedDuration.total);
|
||||||
}
|
}
|
||||||
|
|
||||||
log(...args) {
|
log(...args) {
|
||||||
|
|
Loading…
Reference in a new issue