{"version":3,"file":"js/5249-56f335c1a6af6a335c0c.chunk.js","mappings":"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,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACzE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IACrE,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACtE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxE,EAAG,EAAG,EAAG,GA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","sources":["webpack://endrun/./app/javascript/app/util/svgarchelper.js","webpack://endrun/./app/javascript/app/shortcodes/audioplayer_1.js"],"sourcesContent":["function generateCommand(size, arcWidth, destRatio) {\n const width = size;\n const centerX = width / 2;\n const radius = width / 2;\n\n function polarToCartesian(centerX, centerY, radius, angleRatio) {\n // angleRatio is 0->1, where 0 is 12 oclock\n var angleInRadians = (angleRatio * 2 - 0.5) * Math.PI;\n var x = centerX + radius * Math.cos(angleInRadians);\n var y = centerY + radius * Math.sin(angleInRadians);\n return [x, y];\n }\n\n function arc(radius, rotation, large_arc_flag, sweep_flag, x, y) {\n return [\n 'A',\n radius,\n radius,\n rotation,\n large_arc_flag,\n sweep_flag,\n x,\n y,\n ].join(' ');\n }\n\n destRatio = (destRatio - 0.00001) % 1;\n\n const outsidePt = polarToCartesian(centerX, centerX, radius, destRatio);\n const insidePt = polarToCartesian(\n centerX,\n centerX,\n radius - arcWidth,\n destRatio\n );\n\n const commands = [];\n commands.push('M' + centerX + ',0');\n\n commands.push(\n arc(\n radius,\n 0, // rotation, 0 == clockwise\n destRatio >= 0.5 ? 1 : 0, // large arc flag\n 1, // sweep flag\n outsidePt[0],\n outsidePt[1]\n )\n );\n\n commands.push('L ' + insidePt.join(' '));\n\n commands.push(\n arc(\n radius - arcWidth,\n 0,\n destRatio >= 0.5 ? 1 : 0, // large arc flag\n 0,\n centerX,\n arcWidth\n )\n );\n\n commands.push('Z');\n\n return commands.join('\\n');\n}\n\nexport function svgBuildPlayer(size, arcWidth) {\n function createSVGElement(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n }\n\n function rect(x, y, width, height) {\n const r = createSVGElement('rect');\n r.setAttribute('x', x);\n r.setAttribute('y', y);\n r.setAttribute('width', width);\n r.setAttribute('height', height);\n return r;\n }\n\n const svg = createSVGElement('svg');\n svg.setAttribute('width', size + 'px');\n svg.setAttribute('height', size + 'px');\n svg.setAttribute('shape-rendering', 'geometricPrecision');\n svg.setAttribute('data-play-ratio', '0');\n svg.setAttribute('data-load-ratio', '0');\n\n const loadhead = createSVGElement('path');\n loadhead.setAttribute('class', 'load');\n svg.appendChild(loadhead);\n\n const playhead = createSVGElement('path');\n playhead.setAttribute('class', 'play');\n svg.appendChild(playhead);\n\n const circle = createSVGElement('circle');\n svg.appendChild(circle);\n circle.setAttribute('cx', size / 2);\n circle.setAttribute('cy', size / 2);\n circle.setAttribute('r', size / 2 - arcWidth); // -1 to leave space for a 1px stroke\n circle.setAttribute('class', 'circle');\n\n const playButton = createSVGElement('g');\n playButton.setAttribute('class', 'play-button');\n const p = createSVGElement('polygon');\n p.setAttribute('points', '28,47 28,23 47,35'); // TODO: these should be proportional!\n playButton.appendChild(p);\n svg.appendChild(playButton);\n\n const pauseButton = createSVGElement('g');\n pauseButton.setAttribute('class', 'pause-button');\n pauseButton.appendChild(rect(27, 25, 5, 20));\n pauseButton.appendChild(rect(38, 25, 5, 20));\n svg.appendChild(pauseButton);\n\n function draw() {\n let playRatio = parseFloat(svg.getAttribute('data-play-ratio')) || 0.0;\n const loadRatio = parseFloat(svg.getAttribute('data-load-ratio')) || 0.0;\n if (playRatio >= 1.0) {\n playRatio = 0;\n }\n // todo: check if the command string is different before reflowing\n loadhead.setAttribute('d', generateCommand(size, arcWidth, loadRatio));\n playhead.setAttribute('d', generateCommand(size, arcWidth, playRatio));\n }\n\n svg.addEventListener('update', draw);\n draw();\n return svg;\n}\n","// local\nimport http from '$shared/http.js';\nimport { createEvent } from '../util/events.js';\nimport { svgBuildPlayer } from '../util/svgarchelper.js';\n\n// <div data-audioplayer data-audioplayer-src=\"https://tmp-uploads-2.s3.amazonaws.com/201503-horton-temp/Dukakis-3.mp3\"></div>\n// <div data-audioplayer data-audioplayer-src=\"https://tmp-uploads-2.s3.amazonaws.com/201503-horton-temp/14_IDon%27tNeedToForgive.mp3\"></div>\n\nlet audioContext;\n\ntry {\n audioContext = new (window.AudioContext || window.webkitAudioContext)();\n window._featureSupport_AudioContext = true;\n} catch (e) {\n audioContext = null;\n window._featureSupport_AudioContext = false;\n}\n\nconst analyser = audioContext.createAnalyser();\nanalyser.connect(audioContext.destination);\nanalyser.fftSize = 2048;\nanalyser.smoothingTimeConstant = 0.8;\nanalyser.minDecibels = -120;\n\nfunction unlockWebkitAudio() {\n window._unlockedWebkitAudio = false;\n window.addEventListener(\n 'touchstart',\n function () {\n if (window._unlockedWebkitAudio === true) {\n return;\n }\n try {\n const buffer = audioContext.createBuffer(1, 1, 22050);\n const source = audioContext.createBufferSource();\n source.buffer = buffer;\n source.connect(audioContext.destination);\n source.noteOn(0);\n window._unlockedWebkitAudio = true;\n } catch (e) {\n window._unlockedWebkitAudioDebug =\n 'try/catch failed in unlockWebkitAudio';\n }\n },\n false\n );\n}\n\nfunction enabledPlayers() {\n return document.querySelectorAll('[data-audioplayer=\"v1\"]');\n}\n\nfunction setupPlayers() {\n unlockWebkitAudio();\n enabledPlayers().forEach((el) => {\n buildPlayer(el);\n });\n}\n\nfunction timecodeToSeconds(timecode) {\n const pieces = timecode.split(':');\n const minutes = parseInt(pieces[0], 10);\n const seconds = parseFloat(pieces[1]);\n return minutes * 60.0 + seconds;\n}\n\nfunction selectCurrentCaptions(seconds, captions) {\n return captions.filter(function (caption) {\n return (caption.start <= seconds && seconds < caption.end) === true;\n });\n}\n\nfunction processCSV(lines) {\n return lines\n .split('\\n')\n .map(function (line) {\n return line.split(',');\n })\n .filter(function (row) {\n return row.length > 1; // Ignore empty rows\n })\n .map(function (row) {\n return {\n start: timecodeToSeconds(row[0]),\n end: timecodeToSeconds(row[1]),\n caption: row.slice(2, row.length).join(','),\n };\n });\n}\n\nfunction downloadCSV(url, callback) {\n http\n .get(url)\n .text()\n .then((text) => {\n const csv = processCSV(text);\n\n callback(null, csv);\n })\n .catch(() => {\n callback('Error downloading CSV');\n });\n}\n\nfunction downloadGistCaptions(gistKey, callback) {\n const serviceUrl = 'https://tmp-gist-proxy.herokuapp.com/';\n const requestUrl = serviceUrl + '?id=' + gistKey;\n\n downloadCSV(requestUrl, function (err, csv) {\n if (err) {\n callback(err);\n return;\n }\n callback(null, csv);\n });\n}\n\nfunction monitorPlayerChanges(el, captionEl, captions) {\n function renderCaption(time) {\n const activeCaptions = selectCurrentCaptions(time, captions);\n const captionText = activeCaptions\n .map(function (caption) {\n return caption.caption;\n })\n .join('\\n');\n return captionText;\n }\n el.addEventListener('timeupdate', function () {\n const time = parseFloat(el.getAttribute('data-playhead-seconds'));\n captionEl.innerHTML = renderCaption(time);\n });\n\n captionEl.innerHTML = renderCaption(0);\n}\n\nfunction dispatchEvent(el, eventName) {\n el.dispatchEvent(createEvent(eventName));\n}\n\nfunction addMultipleEventListeners(el, eventNames, callback) {\n eventNames.split(' ').forEach((eventName) => {\n el.addEventListener(eventName, callback);\n });\n return true;\n}\n\nfunction buildCard(el) {\n const name = el.getAttribute('data-name');\n const imageSrc = el.getAttribute('data-image-src');\n if (name === null) {\n return;\n }\n const wrapperEl = document.createElement('div');\n wrapperEl.className = 'card';\n el.appendChild(wrapperEl);\n\n if (imageSrc) {\n const imageEl = document.createElement('img');\n imageEl.className = 'card-image';\n imageEl.style['background-image'] = 'url(' + imageSrc + ')';\n wrapperEl.appendChild(imageEl);\n }\n\n const nameEl = document.createElement('div');\n nameEl.className = 'card-name';\n nameEl.textContent = name;\n wrapperEl.appendChild(nameEl);\n}\n\nfunction buildCaptions(el) {\n const captionGistKey = el.getAttribute('data-audioplayer-caption-gist-key');\n if (captionGistKey !== null) {\n const captionEl = document.createElement('div');\n captionEl.className = 'caption';\n el.appendChild(captionEl);\n\n downloadGistCaptions(captionGistKey, function (err, captions) {\n if (err) {\n console.log(err);\n return false;\n }\n monitorPlayerChanges(el, captionEl, captions);\n });\n return;\n }\n\n const csvUrl = el.getAttribute('data-caption-csv-url');\n\n if (csvUrl !== null) {\n const captionEl = document.createElement('div');\n captionEl.className = 'caption';\n el.appendChild(captionEl);\n\n downloadCSV(csvUrl, function (err, captions) {\n if (err) {\n console.log(err);\n return false;\n }\n monitorPlayerChanges(el, captionEl, captions);\n });\n }\n}\n\nfunction angleFromDyDx(dy, dx) {\n let angle = -0.5 * (Math.atan(dy / dx) / Math.PI - 0.5);\n if (dx < 0) {\n // we lose the left/right halfs with atan, so flip to the \"left\" half by adding 0.5 if dx<0\n // now we have 0.0->1.0\n // 12 oclock is '0'\n angle += 0.5;\n }\n return angle;\n}\n\nfunction distanceFromDyDx(dy, dx) {\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction buildPlayer(el) {\n // TODO:\n // autoplay on IE? (hopefully)\n // progress (maybe)\n\n let isHotzone = false;\n let audioDataBuffer = null;\n let audioSource = null;\n let isPlaying = false;\n let playStartTimestamp = 0; // (new Date()).getTime()\n let playDuration = 0; // seconds\n let playheadPercentage = 0; // 0->1\n let playheadSeconds = 0; // seconds\n let resumePlayheadOffset = 0.0; // where the play/pause happens\n let hotzoneEnabled = true;\n\n let className = 'audioplayer-1';\n if (el.className === className) {\n return;\n }\n el.className = className;\n\n // make some HTML\n buildCard(el);\n\n const audioUrl = el.getAttribute('data-audioplayer-src');\n\n if (audioContext === null) {\n console.log('fallback to <audio>');\n const audioEl = document.createElement('audio');\n audioEl.setAttribute('src', audioUrl);\n audioEl.setAttribute('controls', true);\n audioEl.setAttribute('style', 'display:block; margin:0 auto; width:300px;');\n el.appendChild(audioEl);\n return true;\n }\n\n buildCaptions(el);\n\n el.addEventListener('tmp_hotzone_start', () => {\n if (isPlaying === false && hotzoneEnabled === true) {\n dispatchEvent(el, 'tmp_play');\n } else {\n // console.log('entered hotzone, but already playing OR hotzone is disabled because of user interaction')\n }\n });\n el.addEventListener('tmp_hotzone_end', () => {\n dispatchEvent(el, 'tmp_pause');\n });\n\n function loadFile(url, onDownloadProgress, doneCallback) {\n http\n .get(url, {\n onDownloadProgress,\n })\n .arrayBuffer()\n .then((audioData) => {\n audioContext.decodeAudioData(\n audioData,\n (buffer) => {\n audioDataBuffer = buffer;\n doneCallback(null, audioDataBuffer);\n },\n (error) => {\n console.error('loadFile', error);\n doneCallback(error);\n }\n );\n });\n }\n\n function play() {\n // audioDataBuffer *must* be populated before you call this\n if (isPlaying) {\n return false;\n }\n\n audioSource = audioContext.createBufferSource();\n audioSource.buffer = audioDataBuffer;\n audioSource.connect(analyser);\n\n playDuration = audioSource.buffer.duration;\n resumePlayheadOffset = resumePlayheadOffset % playDuration;\n if (resumePlayheadOffset < 0.5) {\n // console.log('rPO is <1, setting to 0')\n resumePlayheadOffset = 0; // if we're in the first second of the file, start from the very beginning\n }\n audioSource[audioSource.start ? 'start' : 'noteOn'](\n 0,\n resumePlayheadOffset\n );\n playStartTimestamp = new Date().getTime();\n isPlaying = true; // this must be before drawAudioFFT and dispatchEvent\n\n // console.log('play at', resumePlayheadOffset);\n\n dispatchEvent(playheadSVG, 'update_controls');\n drawAudioFFT();\n let currentTimeInterval = setInterval(() => {\n const secondsSinceResume =\n (new Date().getTime() - playStartTimestamp) / 1000.0;\n playheadSeconds = resumePlayheadOffset + secondsSinceResume;\n playheadPercentage = playheadSeconds / playDuration;\n\n if (playheadPercentage >= 1) {\n // we're done, reset stuff, prep to cancel this timer ticking\n playheadSeconds = 0;\n resumePlayheadOffset = 0;\n isPlaying = false;\n dispatchEvent(el, 'timeupdate');\n }\n el.setAttribute('data-playhead-seconds', playheadSeconds);\n\n if (isPlaying === false) {\n clearInterval(currentTimeInterval);\n dispatchEvent(playheadSVG, 'update_controls');\n } else {\n // we are playing, so keep dispatching stuff every 0.1 seconds\n dispatchEvent(el, 'timeupdate');\n }\n }, 100);\n }\n\n el.addEventListener('tmp_play', () => {\n isHotzone = true;\n if (!audioDataBuffer) {\n loadFile(\n audioUrl,\n function (/** @type {import('ky').DownloadProgress} */ progressEvent) {\n // progress event\n const percentage =\n progressEvent.transferredBytes / progressEvent.totalBytes;\n el.setAttribute('data-load-ratio', percentage);\n dispatchEvent(el, 'sync_load_ratio');\n },\n function (err, buffer) {\n // loading is done\n if (err) {\n console.error(err);\n }\n audioDataBuffer = buffer; // scoped for the individual player\n if (isHotzone === true) {\n play();\n } else {\n // console.log('finished loading, but now were out of the hotzone for', el)\n }\n }\n );\n } else {\n // console.log('already have an audiosource, playing')\n play();\n }\n });\n\n el.addEventListener('tmp_pause', () => {\n // console.log('tmp_pause', el);\n isHotzone = false;\n\n if (audioSource === null) {\n // console.log('pause by audioSource is already null')\n return false;\n }\n\n audioSource[audioSource.stop ? 'stop' : 'noteOff'](0);\n audioSource.disconnect(analyser);\n audioSource = null;\n isPlaying = false;\n resumePlayheadOffset = playheadSeconds;\n dispatchEvent(el, 'timeupdate'); // to reset to 0 for data-ratio, prevents tiny slice of playheadSVG\n playheadSeconds = 0;\n dispatchEvent(playheadSVG, 'update_controls');\n });\n\n //////////////////////\n /// FFT VIS START\n let pixelRatio = 1;\n try {\n pixelRatio = parseFloat(window.devicePixelRatio);\n } catch (e) {}\n const width = el.offsetWidth * pixelRatio; // todo should this update/responsive-ness?\n const height = 55 * pixelRatio; // todo un-hardcode?\n const canvas = document.createElement('canvas');\n canvas.width = '' + width;\n canvas.height = '' + height;\n el.appendChild(canvas);\n const canvasCtx = canvas.getContext('2d');\n\n function magnitudeForFrequency(x, width, freqByteData, activeBinCount) {\n // this is the \"requested\" frequency\n // but it's a fractional one, as it's coming from the desired x-val on the plot\n const freq_req = ((0.35 * x) / width) * activeBinCount;\n\n // find the bins on each side of the requested frequency\n const freq_l = Math.floor(freq_req);\n const freq_r = Math.ceil(freq_req);\n\n // find the magnitudes for those frequencies\n const mag_l = freqByteData[freq_l] / 255; // dividing by 255 scales it to (0->1) because Uint8 is an 8-bit unsigned int (0->255)\n const mag_r = freqByteData[freq_r] / 255;\n\n // interpolate between _l and _r to find the 'smoothed' y-val for given target freq\n const offset = freq_req - freq_l;\n const magnitude = (1 - offset) * mag_l + offset * mag_r;\n return magnitude;\n }\n\n const previewFFTData = [\n 164, 177, 186, 191, 189, 170, 184, 194, 181, 177, 188, 181, 163, 166, 170,\n 169, 171, 174, 167, 160, 146, 142, 143, 145, 142, 140, 142, 138, 137, 140,\n 130, 112, 118, 118, 100, 107, 112, 108, 105, 94, 91, 87, 90, 96, 96, 93, 90,\n 84, 88, 95, 96, 93, 89, 88, 92, 92, 87, 87, 91, 98, 97, 94, 98, 99, 97, 104,\n 110, 107, 105, 105, 97, 96, 99, 96, 91, 98, 102, 94, 78, 86, 85, 78, 87, 90,\n 92, 93, 87, 85, 85, 83, 92, 102, 99, 88, 103, 102, 88, 97, 107, 107, 107,\n 115, 117, 114, 108, 98, 90, 96, 100, 101, 97, 86, 72, 74, 70, 62, 64, 71,\n 69, 68, 72, 72, 64, 54, 64, 65, 64, 72, 76, 70, 69, 70, 61, 57, 73, 82, 76,\n 74, 83, 80, 69, 72, 71, 61, 63, 72, 72, 65, 62, 65, 62, 62, 62, 63, 62, 60,\n 53, 54, 51, 50, 54, 54, 57, 58, 54, 52, 51, 47, 51, 51, 47, 53, 59, 54, 48,\n 48, 48, 45, 46, 52, 49, 46, 51, 49, 44, 40, 40, 42, 41, 37, 42, 48, 45, 45,\n 42, 43, 46, 52, 53, 48, 61, 62, 53, 52, 50, 49, 56, 61, 61, 55, 48, 49, 58,\n 61, 61, 64, 70, 71, 75, 72, 67, 77, 76, 71, 72, 71, 64, 57, 51, 55, 59, 51,\n 49, 47, 45, 46, 42, 39, 43, 42, 36, 35, 35, 35, 36, 38, 39, 35, 40, 41, 43,\n 43, 41, 42, 43, 48, 48, 53, 56, 52, 37, 53, 59, 58, 55, 54, 60, 64, 58, 57,\n 50, 46, 57, 52, 41, 50, 62, 56, 53, 61, 58, 51, 59, 70, 67, 54, 61, 58, 56,\n 52, 61, 64, 64, 69, 75, 72, 74, 81, 82, 69, 67, 79, 78, 72, 71, 67, 69, 80,\n 85, 84, 81, 80, 77, 79, 91, 95, 93, 87, 80, 92, 89, 82, 82, 85, 79, 72, 80,\n 85, 83, 75, 79, 80, 73, 64, 70, 66, 68, 66, 61, 70, 76, 78, 75, 74, 72, 77,\n 67, 71, 74, 83, 81, 76, 83, 83, 78, 72, 74, 65, 55, 58, 68, 66, 50, 53, 58,\n 50, 54, 62, 62, 56, 58, 60, 59, 52, 59, 63, 61, 59, 60, 57, 51, 44, 45, 42,\n 34, 36, 35, 34, 34, 36, 38, 41, 32, 38, 42, 44, 42, 43, 41, 45, 53, 53, 46,\n 60, 68, 62, 52, 62, 60, 52, 65, 69, 62, 61, 68, 67, 59, 54, 51, 60, 59, 44,\n 50, 57, 61, 60, 54, 52, 62, 61, 55, 54, 57, 60, 57, 53, 54, 57, 61, 57, 56,\n 52, 51, 57, 56, 51, 51, 59, 60, 57, 54, 56, 54, 47, 51, 52, 47, 49, 54, 50,\n 44, 39, 36, 46, 55, 54, 43, 41, 45, 47, 47, 47, 47, 48, 45, 43, 43, 42, 47,\n 43, 32, 48, 50, 35, 46, 50, 47, 52, 55, 48, 49, 57, 59, 57, 59, 59, 58, 55,\n 64, 65, 52, 55, 64, 60, 53, 52, 52, 51, 51, 50, 54, 50, 54, 54, 50, 53, 57,\n 54, 52, 52, 57, 56, 46, 42, 46, 53, 58, 58, 57, 53, 50, 56, 56, 56, 51, 44,\n 45, 51, 55, 52, 47, 50, 49, 49, 53, 46, 38, 41, 39, 41, 39, 36, 33, 33, 38,\n 36, 33, 23, 37, 36, 34, 30, 26, 34, 40, 38, 40, 41, 34, 34, 32, 29, 29, 31,\n 31, 27, 29, 36, 36, 32, 32, 35, 36, 27, 36, 40, 32, 27, 29, 29, 27, 31, 41,\n 40, 47, 53, 50, 49, 56, 53, 53, 57, 61, 61, 64, 60, 56, 63, 62, 55, 52, 54,\n 54, 56, 62, 59, 53, 55, 54, 49, 46, 40, 40, 34, 35, 37, 37, 32, 32, 37, 34,\n 29, 35, 37, 33, 26, 26, 31, 37, 39, 38, 39, 39, 31, 38, 40, 43, 43, 41, 41,\n 34, 37, 39, 37, 42, 46, 37, 41, 38, 42, 44, 34, 40, 43, 36, 41, 39, 41, 48,\n 45, 44, 50, 46, 48, 45, 33, 40, 39, 34, 28, 39, 44, 35, 35, 44, 43, 32, 35,\n 41, 43, 40, 45, 50, 47, 45, 47, 46, 40, 41, 47, 47, 40, 40, 48, 44, 35, 31,\n 35, 32, 33, 37, 44, 45, 47, 51, 49, 46, 49, 45, 35, 36, 34, 36, 39, 43, 43,\n 32, 37, 35, 37, 34, 26, 29, 32, 28, 29, 33, 31, 23, 28, 38, 39, 35, 24, 8,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0,\n ];\n\n function drawEmptyFFT() {\n // canvasCtx.fillStyle = 'rgb(246, 246, 245)'; // todo: un-hardcode?\n // canvasCtx.fillRect(0, 0, width, height);\n canvasCtx.clearRect(0, 0, width, height);\n\n const grd = canvasCtx.createLinearGradient(0, 0, 0, height);\n grd.addColorStop(0.1, 'rgb(126, 126, 125)');\n grd.addColorStop(0.4, 'rgb(142, 142, 140)');\n grd.addColorStop(0.8, 'rgb(118, 117, 117)');\n grd.addColorStop(1, 'rgb(57, 57, 57)');\n canvasCtx.fillStyle = grd;\n\n const previewFFTDataLength = previewFFTData.length;\n for (let x = 0; x < width; x++) {\n const magnitude = magnitudeForFrequency(\n x,\n width,\n previewFFTData,\n previewFFTDataLength\n );\n canvasCtx.fillRect(\n x, // x position, from left\n height / 2 - (height / 2) * magnitude, // y position, measured from **top**\n 1, // width\n magnitude * height // height\n );\n }\n }\n\n drawEmptyFFT();\n\n function drawAudioFFT() {\n // canvasCtx.fillStyle = 'rgb(246, 246, 244)'; // todo: un-hardcode?\n // canvasCtx.fillRect(0, 0, width, height);\n canvasCtx.clearRect(0, 0, width, height);\n\n // canvasCtx.fillStyle='rgba(255, 11, 58, 1)';\n // grd = canvasCtx.createLinearGradient(0, 0, 0, height);\n\n if (analyser !== null) {\n const freqByteData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqByteData);\n\n const activeBinCount = Math.ceil(1 * analyser.frequencyBinCount); // only use the 20% on the lowest end.\n\n if (true) {\n const output = [];\n for (let i = 0; i < activeBinCount; i++) {\n output.push(freqByteData[i]);\n }\n // get demo fft\n // console.log(JSON.stringify(output))\n }\n for (let x = 0; x < width; x++) {\n let magnitude = magnitudeForFrequency(\n x,\n width,\n freqByteData,\n activeBinCount\n );\n\n // Create gradient\n if (isNaN(magnitude)) magnitude = 1; // not sure why it can be NaN, but it can\n\n // centered waveform grdient\n const grd = canvasCtx.createLinearGradient(0, 0, 0, height);\n // centered waveform gradients\n grd.addColorStop(0.1, 'rgb(255, 11, 58)');\n grd.addColorStop(0.4, 'rgb(255, 46, 67)');\n grd.addColorStop(0.8, 'rgb(165, 35, 43)');\n grd.addColorStop(1.0, 'rgb(118, 35, 35)');\n // centered waveform\n canvasCtx.fillStyle = grd;\n canvasCtx.fillRect(\n x, // x position, from left\n height / 2 - (magnitude * height) / 2 - 1, //height/2 - ((height/2)*magnitude), // y position, measured from **top**\n 1, // width\n magnitude * height + 1 // height\n );\n }\n if (isPlaying) {\n requestAnimationFrame(drawAudioFFT);\n }\n } else {\n console.error('no analyzer, drawAudioFFT requested');\n }\n }\n /// FFT VIS END\n\n // START playhead controls\n const playheadSVG = svgBuildPlayer(70, 6); // width in px, arcWidth in px\n playheadSVG.setAttribute('class', 'playhead-svg');\n el.appendChild(playheadSVG);\n\n el.addEventListener('timeupdate', function () {\n playheadSVG.setAttribute('data-play-ratio', playheadPercentage);\n dispatchEvent(playheadSVG, 'update');\n });\n playheadSVG.setAttribute('data-load-ratio', 0);\n\n el.addEventListener('sync_load_ratio', () => {\n window.requestAnimationFrame(() => {\n const ratio = el.getAttribute('data-load-ratio');\n playheadSVG.setAttribute('data-load-ratio', ratio);\n dispatchEvent(playheadSVG, 'update');\n });\n });\n\n addMultipleEventListeners(playheadSVG, 'click touchstart', (event) => {\n event.preventDefault();\n\n const boundingRect = playheadSVG.getBoundingClientRect();\n const width = boundingRect.width;\n const x = event.clientX - boundingRect.left;\n const y = event.clientY - boundingRect.top;\n const dx = Math.min(0.1, x - width / 2.0); // divide by zero protection, :(\n const dy = width / 2.0 - y;\n const distance = distanceFromDyDx(dy, dx);\n\n if (distance > width / 4) {\n // TK TK TK TODO TODO\n // this is really complicated with webaudio api?\n } else {\n // we're 'inside' the click range, so this is a play/pause evnt\n dispatchEvent(el, 'user_toggleplaypause');\n }\n });\n playheadSVG.addEventListener('update_controls', () => {\n // console.log('update_controls', isPlaying)\n if (isPlaying == false) {\n playheadSVG.querySelector('.play-button').style.opacity = 1;\n playheadSVG.querySelector('.pause-button').style.opacity = 0;\n } else {\n playheadSVG.querySelector('.play-button').style.opacity = 0;\n playheadSVG.querySelector('.pause-button').style.opacity = 1;\n }\n });\n\n dispatchEvent(playheadSVG, 'update_controls');\n // END playhead controls\n\n // START playpause\n el.addEventListener('user_toggleplaypause', () => {\n hotzoneEnabled = false;\n\n if (isPlaying == false) {\n dispatchEvent(el, 'tmp_play');\n } else {\n dispatchEvent(el, 'tmp_pause');\n }\n });\n // END playpause\n\n const countdownEl = document.createElement('div');\n countdownEl.className = 'countdown';\n el.appendChild(countdownEl);\n\n addMultipleEventListeners(el, 'timeupdate', () => {\n const timeRemaining = Math.round(playDuration - playheadSeconds);\n const minutes = Math.floor(timeRemaining / 60);\n let seconds = timeRemaining % 60;\n if (seconds < 10) {\n seconds = '0' + seconds;\n }\n countdownEl.textContent = minutes + ':' + seconds;\n });\n countdownEl.textContent = '0:00';\n} // end buildPlayer\n\nsetupPlayers();\n"],"names":["generateCommand","size","arcWidth","destRatio","centerX","radius","polarToCartesian","centerY","angleRatio","angleInRadians","Math","PI","cos","sin","arc","rotation","large_arc_flag","sweep_flag","x","y","join","outsidePt","insidePt","commands","push","audioContext","window","AudioContext","webkitAudioContext","_featureSupport_AudioContext","e","analyser","createAnalyser","timecodeToSeconds","timecode","pieces","split","parseInt","parseFloat","downloadCSV","url","callback","http","get","text","then","csv","map","line","filter","row","length","start","end","caption","slice","catch","monitorPlayerChanges","el","captionEl","captions","renderCaption","time","activeCaptions","seconds","selectCurrentCaptions","addEventListener","getAttribute","innerHTML","dispatchEvent","eventName","addMultipleEventListeners","eventNames","forEach","connect","destination","fftSize","smoothingTimeConstant","minDecibels","_unlockedWebkitAudio","buffer","createBuffer","source","createBufferSource","noteOn","_unlockedWebkitAudioDebug","document","querySelectorAll","isHotzone","audioDataBuffer","audioSource","isPlaying","playStartTimestamp","playDuration","playheadPercentage","playheadSeconds","resumePlayheadOffset","hotzoneEnabled","className","name","imageSrc","wrapperEl","createElement","appendChild","imageEl","style","nameEl","textContent","buildCard","audioUrl","console","log","audioEl","setAttribute","loadFile","onDownloadProgress","doneCallback","arrayBuffer","audioData","decodeAudioData","error","play","duration","Date","getTime","playheadSVG","drawAudioFFT","currentTimeInterval","setInterval","secondsSinceResume","clearInterval","captionGistKey","err","serviceUrl","csvUrl","buildCaptions","progressEvent","percentage","transferredBytes","totalBytes","stop","disconnect","pixelRatio","devicePixelRatio","width","offsetWidth","height","canvas","canvasCtx","getContext","magnitudeForFrequency","freqByteData","activeBinCount","freq_req","freq_l","floor","freq_r","ceil","offset","previewFFTData","drawEmptyFFT","clearRect","grd","createLinearGradient","addColorStop","fillStyle","previewFFTDataLength","magnitude","fillRect","Uint8Array","frequencyBinCount","getByteFrequencyData","output","i","isNaN","requestAnimationFrame","createSVGElement","createElementNS","rect","r","svg","loadhead","playhead","circle","playButton","p","pauseButton","draw","playRatio","loadRatio","svgBuildPlayer","ratio","event","preventDefault","boundingRect","getBoundingClientRect","clientX","left","distance","dy","dx","sqrt","distanceFromDyDx","clientY","top","min","querySelector","opacity","countdownEl","timeRemaining","round","minutes","buildPlayer"],"sourceRoot":""}