私は AngularJS 用の Angular YouTube 埋め込みモジュールを使用しています (ここにあります https://github.com/brandly/angular-youtube-embed )。ただし、このソリューションは、純粋な Javascript/YouTube API 呼び出しでも同じように機能します。ソリューションを書き直す気がしません。
基本的なコンセプトは、ビデオ全体を任意のサイズのセグメントにスライスすることです。このサンプル ソリューションでは、ビデオを一連の 10 秒のスライスに分割しています。5 秒ごとに、タイマーがそのスライスに対応するプレーヤーの現在の時間をチェックします。個々のスライスが表す長さよりも頻繁にテストすることが重要です。
getPctCompleted() メソッドは、ユーザーがビデオの最後にジャンプしたかどうかに関係なく、ビデオの合計の長さの完了率を示します。
しかし、上級ユーザーはいつでもこれをスプーフィングできます。したがって、これは誰かが何かを見たことを「証明」するものではありません。これは、ユーザーからの他の入力と同様に、信頼できない入力です。
$scope.analyzer = {};
$scope.timeElapsed = 0;
$scope.videoLength = 0;
$scope.$on('youtube.player.playing', function($event, player) {
$scope.videoLength = player.getDuration();
$scope.player = player;
//start polling
setInterval(function() {
$scope.timeElapsed = $scope.player.getCurrentTime();
$scope.analyzer[parseInt($scope.timeElapsed / 10)] = true;
$scope.$apply();
}, 5000);
});
$scope.getPctCompleted = function() {
return Object.keys($scope.analyzer).length / (parseInt($scope.videoLength / 10));
};