1
0
Fork 0
mirror of https://gitlab.com/futo-org/fcast.git synced 2025-06-24 21:25:23 +00:00
fcast/clients/chrome/popup.js

229 lines
8.3 KiB
JavaScript
Raw Normal View History

document.addEventListener('DOMContentLoaded', function() {
updateUrlList();
updateHostList();
updateVolume();
updatePlaybackState();
document.getElementById('clearAll').addEventListener('click', function() {
chrome.runtime.sendMessage({ action: 'clearAll' });
});
document.getElementById('addHost').addEventListener('click', function() {
const host = prompt('Enter new host (ip:port):');
if (host) {
chrome.runtime.sendMessage({ action: 'addHost', host: host });
}
});
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.action === 'updateUrls') {
updateUrlList();
} else if (request.action === 'updateHosts') {
updateHostList();
} else if (request.action == 'updateVolume') {
updateVolume();
} else if (request.action == 'updatePlaybackState') {
updatePlaybackState();
}
});
});
function updateUrlList() {
console.log("updateUrlList");
chrome.runtime.sendMessage({ action: 'getUrls' }, function(response) {
console.log("getUrls response", response);
const urlList = document.getElementById('urlList');
urlList.innerHTML = '';
response.urls.forEach(url => {
const listItem = document.createElement('li');
listItem.classList.add('url-item');
const urlText = document.createElement('div');
urlText.textContent = url.url;
const buttonContainer = document.createElement('div');
buttonContainer.classList.add('action-buttons');
const castButton = document.createElement('button');
castButton.textContent = 'C';
castButton.disabled = !response.selectedHost;
castButton.addEventListener('click', function() {
if (response.selectedHost) {
console.log("castVideo", url);
chrome.runtime.sendMessage({ action: 'castVideo', url });
}
});
buttonContainer.appendChild(castButton);
listItem.appendChild(urlText);
listItem.appendChild(buttonContainer);
urlList.appendChild(listItem);
});
});
}
function updateHostList() {
console.log("updateHostList");
chrome.runtime.sendMessage({ action: 'getHosts' }, function(response) {
console.log("getHosts response", response);
const hostList = document.getElementById('hostList');
hostList.innerHTML = '';
console.log("response.hosts", response.hosts);
response.hosts.forEach(host => {
const listItem = document.createElement('li');
if (host === response.selectedHost) {
listItem.style.color = 'green';
}
listItem.style.display = 'flex';
listItem.style.justifyContent = 'space-between';
listItem.style.alignItems = 'center';
const hostText = document.createElement('span');
hostText.textContent = host;
hostText.style.flexGrow = 1;
listItem.appendChild(hostText);
const selectButton = document.createElement('button');
if (host === response.selectedHost) {
selectButton.textContent = 'Unselect';
selectButton.classList.add('button-red');
selectButton.addEventListener('click', function() {
chrome.runtime.sendMessage({ action: 'selectHost', host: null });
});
} else {
selectButton.textContent = 'Select';
selectButton.addEventListener('click', function() {
chrome.runtime.sendMessage({ action: 'selectHost', host: host });
});
}
listItem.appendChild(selectButton);
const deleteButton = document.createElement('button');
deleteButton.textContent = 'Delete';
deleteButton.addEventListener('click', function() {
chrome.runtime.sendMessage({ action: 'deleteHost', host: host });
});
listItem.appendChild(deleteButton);
hostList.appendChild(listItem);
});
const controlsDiv = document.getElementById('timeBarControls');
const timeBar = document.getElementById('timeBar');
const resumeButton = document.getElementById('resumeButton');
const pauseButton = document.getElementById('pauseButton');
const stopButton = document.getElementById('stopButton');
const volumeControl = document.getElementById('volumeControl');
if (response.selectedHost) {
controlsDiv.style.opacity = 1;
timeBar.disabled = false;
resumeButton.disabled = false;
pauseButton.disabled = false;
stopButton.disabled = false;
volumeControl.disabled = false;
timeBar.addEventListener('input', handleSeek);
resumeButton.addEventListener('click', handleResume);
pauseButton.addEventListener('click', handlePause);
stopButton.addEventListener('click', handleStop);
volumeControl.addEventListener('input', handleVolumeChanged);
} else {
controlsDiv.style.opacity = 0.5;
timeBar.disabled = true;
resumeButton.disabled = true;
pauseButton.disabled = true;
stopButton.disabled = true;
volumeControl.disabled = true;
timeBar.removeEventListener('input', handleSeek);
resumeButton.removeEventListener('click', handleResume);
pauseButton.removeEventListener('click', handlePause);
stopButton.removeEventListener('click', handleStop);
volumeControl.removeEventListener('input', handleVolumeChanged);
}
});
}
function updateVolume() {
console.log("updateVolume");
chrome.runtime.sendMessage({ action: 'getVolume' }, function (response) {
const volumeControl = document.getElementById('volumeControl');
if (response.volume) {
volumeControl.value = response.volume * 100;
} else {
volumeControl.disabled = true;
}
});
}
function updatePlaybackState() {
console.log("updatePlaybackState");
chrome.runtime.sendMessage({ action: 'getPlaybackState' }, function (response) {
const timeBar = document.getElementById('timeBar');
const resumeButton = document.getElementById('resumeButton');
const pauseButton = document.getElementById('pauseButton');
const stopButton = document.getElementById('stopButton');
const volumeControl = document.getElementById('volumeControl');
if (!response.selectedHost || !response.playbackState || response.playbackState.state === 0) {
resumeButton.disabled = true;
pauseButton.disabled = true;
stopButton.disabled = true;
timeBar.disabled = true;
volumeControl.disabled = true;
return;
}
timeBar.max = response.playbackState.duration * 1000;
timeBar.value = response.playbackState.time * 1000;
stopButton.disabled = false;
timeBar.disabled = false;
volumeControl.disabled = false;
switch (response.playbackState.state) {
case 1: // Playing
resumeButton.disabled = true;
pauseButton.disabled = false;
break;
case 2: // Paused
resumeButton.disabled = false;
pauseButton.disabled = true;
break;
}
});
}
function handleSeek(event) {
console.log("handleSeek", event);
chrome.runtime.sendMessage({ action: 'seek', time: parseFloat(event.target.value) / 1000.0 });
}
function handleResume(event) {
console.log("handleResume", event);
chrome.runtime.sendMessage({ action: 'resume' });
}
function handlePause(event) {
console.log("handlePause", event);
chrome.runtime.sendMessage({ action: 'pause' });
}
function handleStop(event) {
console.log("handleStop", event);
chrome.runtime.sendMessage({ action: 'stop' });
}
function handleVolumeChanged(event) {
console.log("handleVolumeChanged", event);
chrome.runtime.sendMessage({ action: 'setVolume', volume: parseFloat(event.target.value) / 100.0 });
}