1
0
mirror of https://git.sr.ht/~cadence/cloudtube synced 2024-11-24 16:37:30 +00:00
cloudtube/html/static/js/chapter-highlight.js

54 lines
1.7 KiB
JavaScript
Raw Normal View History

import {q, qa, ElemJS} from "./elemjs/elemjs.js"
class Chapter {
constructor(linkElement) {
this.link = new ElemJS(linkElement)
this.time = +linkElement.getAttribute("data-clickable-timestamp")
}
}
let chapters = [...document.querySelectorAll("[data-clickable-timestamp]")].map(linkElement => new Chapter(linkElement))
chapters.sort((a, b) => a.time - b.time)
function getCurrentChapter(time) {
const candidates = chapters.filter(chapter => chapter.time <= time)
if (candidates.length > 0) {
return candidates[candidates.length - 1]
} else {
return null
}
}
const video = q("#video")
const description = q("#description")
const regularBackground = "var(--regular-background)"
const highlightBackground = "var(--highlight-background)"
const paddingWidth = 4
let lastChapter = null
setInterval(() => {
const currentChapter = getCurrentChapter(video.currentTime)
if (currentChapter !== lastChapter) {
// Style link
if (lastChapter) {
lastChapter.link.removeClass("timestamp--active")
}
if (currentChapter) {
currentChapter.link.class("timestamp--active")
}
// Style background
if (currentChapter) {
const {offsetTop, offsetHeight} = currentChapter.link.element;
const offsetBottom = offsetTop + offsetHeight
let gradient = `linear-gradient(to bottom,`
+ ` ${regularBackground} ${offsetTop - paddingWidth}px, ${highlightBackground} ${offsetTop - paddingWidth}px,`
+ ` ${highlightBackground} ${offsetBottom + paddingWidth}px, ${regularBackground} ${offsetBottom + paddingWidth}px)`
console.log(gradient)
description.style.background = gradient
} else {
description.style.background = ""
}
}
lastChapter = currentChapter
}, 1000)