mirror of
https://git.sr.ht/~cadence/cloudtube
synced 2024-11-12 19:37:29 +00:00
54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
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)
|