timestamps.js (2221B)
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, imageId) { 11 const container = document.getElementById(containerId); 12 const video = document.getElementById(videoId); 13 const image = document.getElementById(imageId); 14 const videoContainer = document.getElementById('videoContainer'); 15 const imageContainer = document.getElementById('imageContainer'); 16 17 // Regex for timestamps: [h:mm:ss] or [mm:ss] or [ss] 18 const timestampRegex = /\[(\d{1,2}(?::\d{2}){0,2})\]/g; 19 // Regex for rotations: [rotate90], [rotate180], [rotate270], [rotate0] 20 const rotateRegex = /\[rotate(0|90|180|270)\]/g; 21 22 // Replace timestamps 23 container.innerHTML = container.innerHTML 24 .replace(timestampRegex, (match, ts) => { 25 const seconds = parseTimestamp(ts); 26 return `<a href="#" class="timestamp" data-time="${seconds}">${match}</a>`; 27 }) 28 .replace(rotateRegex, (match, angle) => { 29 return `<a href="#" class="rotate" data-angle="${angle}">${match}</a>`; 30 }); 31 // Handle clicks 32 container.addEventListener("click", e => { 33 if (e.target.classList.contains("timestamp")) { 34 e.preventDefault(); 35 const time = Number(e.target.dataset.time); 36 if (video) { 37 video.currentTime = time; 38 video.play(); 39 } 40 } else if (e.target.classList.contains("rotate")) { 41 e.preventDefault(); 42 const angle = Number(e.target.dataset.angle); 43 44 if (video) { 45 applyRotation(video, angle); 46 } else if (image) { 47 applyRotation(image, angle); 48 } 49 } 50 }); 51 } 52 53 function applyRotation(element, angle) { 54 element.style.transform = `rotate(${angle}deg)`; 55 element.style.transformOrigin = "center center"; 56 57 if (angle === 90 || angle === 270) { 58 element.style.maxWidth = "none"; 59 } else { 60 element.style.maxWidth = "100%"; 61 } 62 } 63 64 // Run it 65 document.addEventListener("DOMContentLoaded", () => { 66 makeTimestampsClickable("current-description", "videoPlayer", "imageViewer"); 67 });