let pbc = undefined; let dataUpdateIntervalMs = 3000; let playedAnything = false; let playbackWaitingOnUser = false; let removedInteractNag = false; let setChainOptionSelectFromSettings = false; let chainOption = 'none'; //expected to be one of 'none', 'tg', 'group' let lastPlayedGroup = undefined; let lastPlayedTg = undefined; let groupEnable = { 'jeff-law': false, 'jeff-fire': false, 'jeff-govt': false, 'jeff-bus': false, 'berk-law': false, 'berk-fire': false, 'berk-govt': false, 'wash-law': false, 'wash-fire': false, 'wash-govt': false, 'wash-bus': false, 'fred-law': false, 'fred-fire': false, 'fred-govt': false, 'fred-bus': false, 'loud-law': false, 'loud-fire': false, 'loud-govt': false, 'wvsp': false, 'msp': false, 'wv-ambulance': false, 'md-ambulance': false, 'va-ambulance': false, } let groupButtonMap = { 'jeff-law': jefflawButton, 'jeff-fire': jefffireButton, 'jeff-govt': jeffgovtButton, 'jeff-bus': jeffbusButton, 'berk-law': berklawButton, 'berk-fire': berkfireButton, 'berk-govt': berkgovtButton, 'wash-law': washlawButton, 'wash-fire': washfireButton, 'wash-govt': washgovtButton, 'wash-bus': washbusButton, 'fred-law': fredlawButton, 'fred-fire': fredfireButton, 'fred-govt': fredgovtButton, 'fred-bus': fredbusButton, 'loud-law': loudlawButton, 'loud-fire': loudfireButton, 'loud-govt': loudgovtButton, 'wvsp': wvspButton, 'msp': mspButton, 'wv-ambulance': wvambulanceButton, 'md-ambulance': mdambulanceButton, 'va-ambulance': vaambulanceButton, } function displayUpdate() { if (!navigator.userActivation.hasBeenActive) { interactNag.innerText = 'Please click/tap anywhere to enable playback!'; } else { interactNag.innerText = ''; removedInteractNag = true; } if (removedInteractNag && !setChainOptionSelectFromSettings) { chainOptionSelect.value = chainOption; setChainOptionSelectFromSettings = true; } if (!anyGroupSelected() && nothingSelectedNagDiv.style.display == 'none') { nothingSelectedNagDiv.style.display = 'block'; } else if (anyGroupSelected() && nothingSelectedNagDiv.style.display == 'block') { nothingSelectedNagDiv.style.display = 'none'; } pbc.displayUpdate(); displayUpdateTimeout = requestAnimationFrame(displayUpdate); } function showHideGroupSelect() { let div = document.getElementById('group-select-expand-div'); if (div.style.display == 'none') { div.style.display = "block";} else {div.style.display = "none";} } class PlaybackController { constructor () { this.calls = []; this.lastUpdateMaxId = '' + (Date.now() - 300000) + '-0'; this.dataUpdateEnabled = true; this.playbackActive = false; this.player = document.getElementById('audioPlayer'); } displayUpdate () { if (pbc.playbackActive && !isNaN(pbc.player.duration) && !isNaN(pbc.player.currentTime)) { playbackTimeUsedSpan.innerText = pbc.player.currentTime.toFixed(1); playbackDurationSpan.innerText = pbc.player.duration.toFixed(1); } else { playbackTimeUsedSpan.innerText = '---'; playbackDurationSpan.innerText = '---'; } horizBarChart(clipProgressCanvas, [pbc.player.currentTime], pbc.player.duration); } updatePlaylistHtml () { let playlistHtml = 'Playback Queue - ' + pbc.calls.length; if (pbc.calls.length == 1) { playlistHtml += ' item'; } else { playlistHtml += ' items'; } playlistHtml += '
'; playlistHtml += ''; playlistHtml += ''; for (let i=0; i'; } playlistHtml += '
TimeTalkgroupRadio IDTranscription
' + pbc.calls[i]['call_data']['nice_start'] + '' + metaTagEmojiMap[metaTagFromTags(pbc.calls[i]['call_data']['tg_tags'])] + ' ' + pbc.calls[i]['call_data']['tg_name'] + '' + pbc.calls[i]['call_data']['talker_id'] + '' + transcription + '
'; if (playbackWaitingOnUser && navigator.userActivation.hasBeenActive) { playbackWaitingOnUser = false; pbc.playNextCall(); } document.getElementById('playlist-div').innerHTML = playlistHtml; } ingestCall (call) { let foundMatch = false; for (const groupName in groupEnable) { if (groupEnable[groupName]) { if (groupMatch[groupName](call)) { call['groupName'] = groupName; call['played'] = false; pbc.calls.push(call); console.log('Added call for group ' + groupName); foundMatch = true; break; } } } if (!foundMatch) { console.log('Did not find match for call for tg ID ' + call['call_data']['tg_id'] + ' tags ' + call['call_data']['tg_tags']); } else { //pbc.calls.sort((a, b) => a['call_data']['start_time'] - b['call_data']['start_time']); pbc.updatePlaylistHtml(); } } playNextCall () { if (lastPlayedGroup && lastPlayedTg && chainOption != 'none' && pbc.calls.length > 2) { if (chainOption == 'group') { for (let i=0; i a['call_data']['start_time'] - b['call_data']['start_time']); pbc.updatePlaylistHtml(); if (pbc.calls.length > 0) { pbc.playNextCall(); } } playPause () { if (pbc.player.paused) { pbc.player.play(); } else { pbc.player.pause(); } } async getNewCalls () { var url = '/calls?min_id=' + pbc.lastUpdateMaxId; var response; var updateStartTime; try { updateStartTime = Date.now(); response = await fetch(url); } catch (error) { console.log('dataUpdate encountered a problem: ' + error); } const responseText = await response.text(); const newCalls = JSON.parse(responseText); // console.log(newCalls); const updateFinishTime = Date.now(); console.log('Update retrieved ' + newCalls.length + ' calls in ' + (updateFinishTime - updateStartTime) + ' ms, response length ' + responseText.length); if (newCalls.length > 0) { for (let i=0; i 0) { pbc.playNextCall(); } pbc.lastUpdateMaxId = '' + (parseInt(newCalls[newCalls.length - 1]['redis_id'].split('-')[0]) + 1) + '-0'; } if (pbc.dataUpdateEnabled) { pbc.dataUpdateTimeout = setTimeout(pbc.getNewCalls, dataUpdateIntervalMs); } } } function toggleGroup(groupName, buttonId) { const currentState = groupEnable[groupName]; if (currentState) { groupEnable[groupName] = false; document.getElementById(buttonId).style.border = 'solid gray 2px'; document.getElementById(buttonId).style.color = 'gray'; } else { groupEnable[groupName] = true; document.getElementById(buttonId).style.border = 'solid green 2px'; document.getElementById(buttonId).style.color = 'green'; } saveSettings(); } function anyGroupSelected() { for (groupName in groupEnable) { if (groupEnable[groupName]) { return true; } } return false; } function groupButtonFixer() { for (const groupName in groupEnable) { const button = groupButtonMap[groupName]; if (groupEnable[groupName]) { button.style.border = 'solid green 2px'; button.style.color = 'green'; } else { button.style.border = 'solid gray 2px'; button.style.color = 'gray'; } } } function chainOptionUpdateFromInput() { chainOption = chainOptionSelect.value; saveSettings(); } document.getElementById('chainOptionSelect').addEventListener('change', chainOptionUpdateFromInput); function init() { pbc = new PlaybackController(); pbc.player.addEventListener('ended', pbc.playbackFinished); pbc.getNewCalls(); loadSettings(); groupButtonFixer(); displayUpdateTimeout = requestAnimationFrame(displayUpdate); } init();