timestamps.js (1756B)
1 function parseTimestamp(ts) { 2 const parts = ts.split(":").map(Number).reverse(); 3 let seconds = 0; 4 if (parts[0]) seconds += parts[0]; // seconds 5 if (parts[1]) seconds += parts[1] * 60; // minutes 6 if (parts[2]) seconds += parts[2] * 3600; // hours 7 return seconds; 8 } 9 10 function makeTimestampsClickable(containerId, videoId) { 11 const container = document.getElementById(containerId); 12 const video = document.getElementById(videoId); 13 14 // Regex for timestamps: [h:mm:ss] or [mm:ss] or [ss] 15 const timestampRegex = /\[(\d{1,2}(?::\d{2}){0,2})\]/g; 16 // Regex for rotations: [rotate90], [rotate180], [rotate270], [rotate0] 17 const rotateRegex = /\[rotate(0|90|180|270)\]/g; 18 19 // Replace timestamps 20 container.innerHTML = container.innerHTML.replace(timestampRegex, (match, ts) => { 21 const seconds = parseTimestamp(ts); 22 return `<a href="#" class="timestamp" data-time="${seconds}">${match}</a>`; 23 }); 24 25 // Replace rotations 26 container.innerHTML = container.innerHTML.replace(rotateRegex, (match, angle) => { 27 return `<a href="#" class="rotate" data-angle="${angle}">${match}</a>`; 28 }); 29 30 // Handle clicks 31 container.addEventListener("click", e => { 32 if (e.target.classList.contains("timestamp")) { 33 e.preventDefault(); 34 const time = Number(e.target.dataset.time); 35 video.currentTime = time; 36 video.play(); 37 } else if (e.target.classList.contains("rotate")) { 38 e.preventDefault(); 39 const angle = Number(e.target.dataset.angle); 40 video.style.transform = `rotate(${angle}deg)`; 41 video.style.transformOrigin = "center center"; 42 } 43 }); 44 } 45 46 // Run it 47 document.addEventListener("DOMContentLoaded", () => { 48 makeTimestampsClickable("current-description", "videoPlayer"); 49 });