Я хочу отслеживать видеоролики для каждого пользователя с таблицей в базе данных под названием Viewings
. Он относится как к пользователю, так и к видео, и записывает длительность просмотра, а процент видео завершен.Отслеживание «длительности просмотренных видео» аналитики от JavaScript
Когда нажата кнопка воспроизведения, я хочу либо найти существующий просмотр на основе идентификатора, который хранится в 30-минутном сохраняющемся файле cookie (который создается при первом нажатии кнопки воспроизведения, если файл cookie не работает 't уже существует). Затем я хочу периодически обновлять атрибут length
этого Viewing
на каждые 10 секунд, когда пользователь просматривал видео, используя прослушиватель событий timeupdate
.
У меня есть функция JavaScript, которая возвращает lengthWatched
как целое число, которое представляет сколько секунд в видеоролике.
Я проверил, чтобы убедиться, что это работает со следующей функцией:
video.addEventListener 'timeupdate', ((e) ->
console.log(lengthWatched(e));
return
), false
Так что теперь все, что нужно сделать, это обновление length
всякий раз, когда эта функция возвращает целое число, делящееся на 10.
I «Конечно, мне придется использовать AJAX здесь. Но я не слишком уверен в лучшем способе перейти к следующему шагу, или, может быть, даже если лучше всего записать эти данные.
Любые предложения?
Edit:
Используя предложения от agmcleod и некоторые из моих собственных, я закончил с этими рабочими дополнениями JS:
#global variables
videoId = location['pathname'].split('/').pop()
viewingCookieName = "Video "+videoId.toString()
#taken from http://www.quirksmode.org/js/cookies.html for easy reading of cookies
readCookie = (name) ->
nameEQ = name + '='
ca = document.cookie.split(';')
i = 0
while i < ca.length
c = ca[i]
while c.charAt(0) == ' '
c = c.substring(1, c.length)
if c.indexOf(nameEQ) == 0
return c.substring(nameEQ.length, c.length)
i++
null
video.addEventListener 'timeupdate', ((e) ->
duration = lengthWatched(e)
if (duration % 5 == 0)
currentLength = 0
$.get "/viewings/" + readCookie(viewingCookieName), (data) ->
currentLength = data['length']
return
$.ajax(
url: "/viewings/" + readCookie(viewingCookieName) + ".json"
type: 'PUT'
data: { viewing: {length: currentLength + 5}}
dataType: 'json').success ->
console.log('put')
return
), false
#only including relevant code, took out other video play functionality
video.onplay = (e) ->
unless readCookie(viewingCookieName)
$.ajax(
url: "/viewings.json"
type: 'POST'
data: { viewing: { video_id: videoId, user_id: gon.current_user_id } },
dataType: 'json').success (data) ->
viewingId = data['id']
time = new Date(Date.now() + 1800000).toUTCString()
document.cookie = viewingCookieName+"="+ data['id']+"; expires="+time
return
Используется в основном один и тот же контроллер, предоставленную agmcleod. Я все еще работаю над исправлением timeupdate
, чтобы поражать только каждую секунду, но я уверен, что это будет довольно просто. Также можно добавить max_duration_reached
.
Спасибо, это именно то, что мне нужно. Я ценю, что вы написали полный ответ. – Doug