122 lines
3.5 KiB
JavaScript
122 lines
3.5 KiB
JavaScript
|
var cache = cache || {}
|
||
|
var layer = 'descriptions'
|
||
|
var baseURL = 'https://pad.ma'
|
||
|
var imageResolution = 480
|
||
|
|
||
|
let lastKnownScrollPosition = 0
|
||
|
let ticking = false;
|
||
|
|
||
|
|
||
|
async function pandoraAPI(action, data) {
|
||
|
var url = baseURL + '/api/'
|
||
|
//var url = '/pandoraAPI/'
|
||
|
var key = JSON.stringify([action, data])
|
||
|
if (!cache[key]) {
|
||
|
var response = await fetch(url, {
|
||
|
method: 'POST',
|
||
|
headers: {'Content-Type': 'application/json'},
|
||
|
body: JSON.stringify({
|
||
|
action: action,
|
||
|
data: data
|
||
|
})
|
||
|
})
|
||
|
cache[key] = await response.json()
|
||
|
}
|
||
|
return cache[key]
|
||
|
}
|
||
|
|
||
|
function updatePlayerPosition(video, lastKnownScrollPosition) {
|
||
|
console.log('update', lastKnownScrollPosition)
|
||
|
video.style.top = lastKnownScrollPosition + 'px'
|
||
|
video.style.display = 'block';
|
||
|
}
|
||
|
|
||
|
function updatePlayer(video, frame, currentTime) {
|
||
|
var rect = frame.getBoundingClientRect();
|
||
|
video.style.opacity = 0
|
||
|
console.log('update player', rect)
|
||
|
video.style.top = (rect.top + window.scrollY) + 'px'
|
||
|
video.style.display = 'block';
|
||
|
//video.poster = frame.querySelector('img').src
|
||
|
video.currentTime = currentTime
|
||
|
video.controls = true
|
||
|
video.play()
|
||
|
video.style.opacity = 1
|
||
|
}
|
||
|
|
||
|
function isElementInViewport (el) {
|
||
|
var rect = el.getBoundingClientRect();
|
||
|
return (
|
||
|
rect.top >= 0 &&
|
||
|
rect.left >= 0 &&
|
||
|
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */
|
||
|
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function onVisibilityChange(el, callback) {
|
||
|
var old_visible;
|
||
|
return function () {
|
||
|
var visible = isElementInViewport(el);
|
||
|
if (visible != old_visible) {
|
||
|
old_visible = visible;
|
||
|
if (typeof callback == 'function') {
|
||
|
callback(visible);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
pandoraAPI('get', {id: film.id, keys: ['id', 'title', 'layers']}).then(response => {
|
||
|
var ascroll = document.querySelector('#ascroll')
|
||
|
var loaded = false
|
||
|
|
||
|
var video = document.createElement('video')
|
||
|
video.classList.add('player')
|
||
|
video.muted = true
|
||
|
video.src = `${baseURL}/${film.id}/480p.webm`
|
||
|
ascroll.appendChild(video)
|
||
|
|
||
|
var h1 = document.createElement('h1')
|
||
|
h1.innerHTML = response.data.title
|
||
|
ascroll.appendChild(h1)
|
||
|
|
||
|
response.data.layers[layer].forEach(annotation => {
|
||
|
var div = document.createElement('div')
|
||
|
div.classList.add('annotation')
|
||
|
div.innerHTML = `
|
||
|
<div class="frame"><img src="${baseURL}/${annotation.id.split('/')[0]}/${imageResolution}p${annotation.in}.jpg"></div>
|
||
|
<div class="text">${annotation.value}</div>
|
||
|
|
||
|
`
|
||
|
ascroll.appendChild(div)
|
||
|
var frame = div.querySelector('.frame')
|
||
|
document.addEventListener('scroll', onVisibilityChange(div.querySelector('.frame'), function(visible) {
|
||
|
if (loaded && visible)
|
||
|
updatePlayer(video, frame, annotation['in'])
|
||
|
|
||
|
}))
|
||
|
})
|
||
|
loaded = true
|
||
|
let frame = ascroll.querySelector('.annotation .frame')
|
||
|
if (frame) {
|
||
|
updatePlayer(video, frame, 0)
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
document.addEventListener('scroll', function(e) {
|
||
|
lastKnownScrollPosition = window.scrollY;
|
||
|
|
||
|
if (!ticking) {
|
||
|
window.requestAnimationFrame(function() {
|
||
|
updatePlayerPosition(video, lastKnownScrollPosition);
|
||
|
ticking = false;
|
||
|
});
|
||
|
|
||
|
ticking = true;
|
||
|
}
|
||
|
})
|
||
|
*/
|
||
|
})
|