1
0
Fork 0
mirror of https://gitlab.com/futo-org/fcast.git synced 2025-08-23 15:52:49 +00:00

webOS: Initial port of Electron v2.2.0 changes

This commit is contained in:
Michael Hollister 2025-07-07 14:02:19 -05:00
parent b08c3dab95
commit 4c1cb6cf8e
28 changed files with 1273 additions and 532 deletions

View file

@ -75,32 +75,48 @@ if (TARGET === 'electron') {
// @ts-ignore
} else if (TARGET === 'webOS' || TARGET === 'tizenOS') {
preloadData = {
sendPlaybackErrorCb: () => { logger.error('Player: Callback "send_playback_error" not set'); },
sendPlaybackUpdateCb: () => { logger.error('Player: Callback "send_playback_update" not set'); },
sendVolumeUpdateCb: () => { logger.error('Player: Callback "send_volume_update" not set'); },
// onPlayCb: () => { logger.error('Player: Callback "play" not set'); },
onPlayCb: undefined,
onPauseCb: () => { logger.error('Player: Callback "pause" not set'); },
onResumeCb: () => { logger.error('Player: Callback "resume" not set'); },
onSeekCb: () => { logger.error('Player: Callback "onseek" not set'); },
onSetVolumeCb: () => { logger.error('Player: Callback "setvolume" not set'); },
onSetSpeedCb: () => { logger.error('Player: Callback "setspeed" not set'); },
getSessionsCb: () => { logger.error('Player: Callback "getSessions" not set'); },
onConnectCb: () => { logger.error('Player: Callback "onConnect" not set'); },
onDisconnectCb: () => { logger.error('Player: Callback "onDisconnect" not set'); },
preloadData.sendPlaybackUpdateCb = (update: PlaybackUpdateMessage) => { logger.error('Player: Callback "send_playback_update" not set'); };
preloadData.sendVolumeUpdateCb = (update: VolumeUpdateMessage) => { logger.error('Player: Callback "send_volume_update" not set'); };
preloadData.sendPlaybackErrorCb = (error: PlaybackErrorMessage) => { logger.error('Player: Callback "send_playback_error" not set'); };
preloadData.sendEventCb = (message: EventMessage) => { logger.error('Player: Callback "onSendEventCb" not set'); };
// preloadData.onPlayCb = () => { logger.error('Player: Callback "play" not set'); };
preloadData.onPlayCb = undefined;
preloadData.onPauseCb = () => { logger.error('Player: Callback "pause" not set'); };
preloadData.onResumeCb = () => { logger.error('Player: Callback "resume" not set'); };
preloadData.onSeekCb = () => { logger.error('Player: Callback "onseek" not set'); };
preloadData.onSetVolumeCb = () => { logger.error('Player: Callback "setvolume" not set'); };
preloadData.onSetSpeedCb = () => { logger.error('Player: Callback "setspeed" not set'); };
preloadData.onSetPlaylistItemCb = () => { logger.error('Player: Callback "onSetPlaylistItem" not set'); };
preloadData.sendPlayRequestCb = () => { logger.error('Player: Callback "sendPlayRequest" not set'); };
preloadData.getSessionsCb = () => { logger.error('Player: Callback "getSessions" not set'); };
preloadData.onConnectCb = () => { logger.error('Player: Callback "onConnect" not set'); };
preloadData.onDisconnectCb = () => { logger.error('Player: Callback "onDisconnect" not set'); };
preloadData.onPlayPlaylistCb = () => { logger.error('Player: Callback "onPlayPlaylist" not set'); };
preloadData.onEventSubscribedKeysUpdate = (value: { keyDown: Set<string>, keyUp: Set<string> }) => {
preloadData.subscribedKeys.keyDown = value.keyDown;
preloadData.subscribedKeys.keyUp = value.keyUp;
};
preloadData.onToast = (message: string, icon: ToastIcon = ToastIcon.INFO, duration: number = 5000) => {
toast(message, icon, duration);
};
window.targetAPI = {
sendPlaybackError: (error: PlaybackErrorMessage) => { preloadData.sendPlaybackErrorCb(error); },
sendPlaybackUpdate: (update: PlaybackUpdateMessage) => { preloadData.sendPlaybackUpdateCb(update); },
sendVolumeUpdate: (update: VolumeUpdateMessage) => { preloadData.sendVolumeUpdateCb(update); },
sendPlaybackError: (error: PlaybackErrorMessage) => { preloadData.sendPlaybackErrorCb(error); },
sendEvent: (message: EventMessage) => { preloadData.sendEventCb(message); },
onPlay: (callback: any) => { preloadData.onPlayCb = callback; },
onPause: (callback: any) => { preloadData.onPauseCb = callback; },
onResume: (callback: any) => { preloadData.onResumeCb = callback; },
onSeek: (callback: any) => { preloadData.onSeekCb = callback; },
onSetVolume: (callback: any) => { preloadData.onSetVolumeCb = callback; },
onSetSpeed: (callback: any) => { preloadData.onSetSpeedCb = callback; },
onSetPlaylistItem: (callback: any) => { preloadData.onSetPlaylistItemCb = callback; },
sendPlayRequest: (message: PlayMessage, playlistIndex: number) => { preloadData.sendPlayRequestCb(message, playlistIndex); },
getSessions: (callback?: () => Promise<[any]>) => {
if (callback) {
preloadData.getSessionsCb = callback;
@ -109,8 +125,10 @@ if (TARGET === 'electron') {
return preloadData.getSessionsCb();
}
},
getSubscribedKeys: () => preloadData.subscribedKeys,
onConnect: (callback: any) => { preloadData.onConnectCb = callback; },
onDisconnect: (callback: any) => { preloadData.onDisconnectCb = callback; },
onPlayPlaylist: (callback: any) => { preloadData.onPlayPlaylistCb = callback; },
logger: loggerInterface,
};
} else {

View file

@ -12,7 +12,8 @@ import {
targetKeyDownEventListener,
captionsBaseHeightCollapsed,
captionsBaseHeightExpanded,
captionsLineHeight
captionsLineHeight,
targetKeyUpEventListener
} from 'src/player/Renderer';
const logger = window.targetAPI.logger;
@ -912,74 +913,6 @@ document.addEventListener('click', (event: MouseEvent) => {
const skipInterval = 10;
const volumeIncrement = 0.1;
function keyDownEventListener(event: KeyboardEvent) {
// logger.info("KeyDown", event);
let handledCase = targetKeyDownEventListener(event);
if (!handledCase) {
switch (event.code) {
case 'ArrowLeft':
skipBack();
event.preventDefault();
handledCase = true;
break;
case 'ArrowRight':
skipForward();
event.preventDefault();
handledCase = true;
break;
case "Home":
player?.setCurrentTime(0);
event.preventDefault();
handledCase = true;
break;
case "End":
if (isLive) {
setLivePosition();
}
else {
player?.setCurrentTime(player?.getDuration());
}
event.preventDefault();
handledCase = true;
break;
case 'KeyK':
case 'Space':
case 'Enter':
// Play/pause toggle
if (player?.isPaused()) {
player?.play();
} else {
player?.pause();
}
event.preventDefault();
handledCase = true;
break;
case 'KeyM':
// Mute toggle
player?.setMute(!player?.isMuted());
handledCase = true;
break;
case 'ArrowUp':
// Volume up
volumeChangeHandler(Math.min(player?.getVolume() + volumeIncrement, 1));
handledCase = true;
break;
case 'ArrowDown':
// Volume down
volumeChangeHandler(Math.max(player?.getVolume() - volumeIncrement, 0));
handledCase = true;
break;
default:
break;
}
}
if (window.targetAPI.getSubscribedKeys().keyDown.has(event.key)) {
window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyDown, event.key, event.repeat, handledCase)));
}
}
function skipBack() {
player?.setCurrentTime(Math.max(player?.getCurrentTime() - skipInterval, 0));
}
@ -990,10 +923,94 @@ function skipForward() {
}
}
document.addEventListener('keydown', keyDownEventListener);
document.addEventListener('keydown', (event: KeyboardEvent) => {
// logger.info("KeyDown", event.key);
let result = targetKeyDownEventListener(event);
let handledCase = result.handledCase;
// @ts-ignore
let key = (TARGET === 'webOS' && result.key !== '') ? result.key : event.key;
if (!handledCase) {
switch (event.key.toLowerCase()) {
case 'arrowleft':
skipBack();
event.preventDefault();
handledCase = true;
break;
case 'arrowright':
skipForward();
event.preventDefault();
handledCase = true;
break;
case "home":
player?.setCurrentTime(0);
event.preventDefault();
handledCase = true;
break;
case "end":
if (isLive) {
setLivePosition();
}
else {
player?.setCurrentTime(player?.getDuration());
}
event.preventDefault();
handledCase = true;
break;
case 'k':
case ' ':
case 'enter':
// Play/pause toggle
if (player?.isPaused()) {
player?.play();
} else {
player?.pause();
}
event.preventDefault();
handledCase = true;
break;
case 'm':
// Mute toggle
player?.setMute(!player?.isMuted());
handledCase = true;
break;
case 'arrowup':
// Volume up
volumeChangeHandler(Math.min(player?.getVolume() + volumeIncrement, 1));
handledCase = true;
break;
case 'arrowdown':
// Volume down
volumeChangeHandler(Math.max(player?.getVolume() - volumeIncrement, 0));
handledCase = true;
break;
default:
break;
}
}
if (window.targetAPI.getSubscribedKeys().keyDown.has(key)) {
window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyDown, key, event.repeat, handledCase)));
}
});
document.addEventListener('keyup', (event: KeyboardEvent) => {
if (window.targetAPI.getSubscribedKeys().keyUp.has(event.key)) {
window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyUp, event.key, event.repeat, false)));
// logger.info("KeyUp", event);
let result = targetKeyUpEventListener(event);
let handledCase = result.handledCase;
// @ts-ignore
let key = (TARGET === 'webOS' && result.key !== '') ? result.key : event.key;
if (!handledCase) {
switch (event.key) {
default:
break;
}
}
if (window.targetAPI.getSubscribedKeys().keyUp.has(key)) {
window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyUp, key, event.repeat, handledCase)));
}
});
@ -1020,6 +1037,7 @@ export {
captionsBaseHeight,
captionsLineHeight,
onPlay,
onPlayPlaylist,
playerCtrlStateUpdate,
formatDuration,
skipBack,