Chase
Crider
(function () { const root = document.getElementById('vp'); if (!root || root.dataset.ready) return; root.dataset.ready = '1'; const button = root.querySelector('.vp-play'); const audio = root.querySelector('audio'); const meta = root.querySelector('.vp-main .vp-meta'); const scrub = root.querySelector('.vp-scrub'); const bar = root.querySelector('.vp-bar'); const fill = root.querySelector('.vp-fill'); const knob = root.querySelector('.vp-knob'); let dragging = false; function timeString(seconds) { if (!Number.isFinite(seconds)) return '0:00'; const m = Math.floor(seconds / 60); const s = Math.floor(seconds % 60); return m + ':' + String(s).padStart(2, '0'); } function setPct(p) { fill.style.width = p + '%'; knob.style.left = p + '%'; scrub.setAttribute('aria-valuenow', Math.round(p)); } function update() { const playing = !audio.paused; const started = audio.currentTime > 0; button.textContent = playing ? 'Ⅱ' : '▶'; button.setAttribute('aria-label', (playing ? 'Pause' : 'Play') + ' Commercials'); if (!dragging) setPct(audio.duration ? (audio.currentTime / audio.duration * 100) : 0); meta.textContent = (playing || started) ? timeString(audio.currentTime) + (audio.duration ? ' / ' + timeString(audio.duration) : '') : ''; } button.addEventListener('click', async () => { if (!audio.paused) { audio.pause(); update(); return; } try { await audio.play(); } catch (error) { console.error('Audio playback failed:', error); } update(); }); function seekFromEvent(e) { if (!Number.isFinite(audio.duration)) return; const r = bar.getBoundingClientRect(); const f = Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)); setPct(f * 100); audio.currentTime = f * audio.duration; } scrub.addEventListener('pointerdown', e => { dragging = true; scrub.classList.add('drag'); try { scrub.setPointerCapture(e.pointerId); } catch (err) {} seekFromEvent(e); }); scrub.addEventListener('pointermove', e => { if (dragging) seekFromEvent(e); }); function endDrag() { dragging = false; scrub.classList.remove('drag'); update(); } scrub.addEventListener('pointerup', endDrag); scrub.addEventListener('pointercancel', endDrag); scrub.addEventListener('keydown', e => { if (!Number.isFinite(audio.duration)) return; if (e.key === 'ArrowRight') audio.currentTime = Math.min(audio.duration, audio.currentTime + 5); if (e.key === 'ArrowLeft') audio.currentTime = Math.max(0, audio.currentTime - 5); }); ['timeupdate', 'loadedmetadata', 'durationchange', 'play', 'pause', 'seeked'].forEach(ev => { audio.addEventListener(ev, update); }); audio.addEventListener('ended', () => { audio.currentTime = 0; update(); }); update(); })(); A little about me...
Hello! My name is Chase I am a 25-year-old voice-over artist located in Sunny Florida. If I am not voice acting, I am spending time with my wife playing video games, or...at the cinema again watching another movie!