import * as WaveformPlaylist from 'waveform-playlist'; import delay from 'delay'; import html from 'nanohtml' import { parseMediaFragmentIdentifier } from '../util/media-fragment-identifier.js'; async function init() { document.body.innerHTML = ''; const mainEl = html`
`; document.body.appendChild(mainEl); const playlist = WaveformPlaylist.init({ container: document.getElementById('container'), timescale: true, waveHeight: 100, state: 'select', }); const eventEmitter = playlist.getEventEmitter(); function playpause() { eventEmitter.emit(playlist.isPlaying() ? 'pause' : 'play'); } function updateVolume(event) { eventEmitter.emit('mastervolumechange', event.target.value); } document.body.addEventListener('keydown', event => { if (event.target !== document.body) return; if (event.code === 'Space') { playpause(); } }); // Load the file await playlist.load([{ src: document.URL, }]); function syncFragmentToSelection() { // Read target fragment from URL let start, end; const fragmentIdentifier = window.location.hash; if (fragmentIdentifier) { try { const parsed = parseMediaFragmentIdentifier(fragmentIdentifier); start = parsed.start; end = parsed.end; } catch (err) {} } // Emit event to update selection in player eventEmitter.emit('select', start, end); } // Bind window hash change to update player window.addEventListener('hashchange', async function() { if(playlist.isPlaying()) { eventEmitter.emit('stop') // pause needs a small delay, coz the lib doesn't // update player view (drawRequest) when isPlaying() = true. await delay(10); } await syncFragmentToSelection(); eventEmitter.emit('play'); }); // Read start & end from window location. syncFragmentToSelection(); // Start playing. A tiny delay seems needed in Firefox to show the cursor at the right place. requestAnimationFrame(() => eventEmitter.emit('play')); return playlist; } init().then(playlist => { // Store playlist as a shared global variable. self.playlist = playlist; });