1
0
Fork 0
mirror of https://gitlab.com/futo-org/fcast.git synced 2025-08-03 15:57:01 +00:00

Receivers: Added unified logger module

This commit is contained in:
Michael Hollister 2025-05-01 10:37:21 -05:00
parent 7f9d7939bc
commit b24b3f0c55
17 changed files with 351 additions and 117 deletions

View file

@ -1,6 +1,8 @@
import dashjs from 'modules/dashjs';
import Hls from 'modules/hls.js';
const logger = window.targetAPI.logger;
export enum PlayerType {
Html,
Dash,
@ -26,7 +28,7 @@ export class Player {
try {
(this.player as dashjs.MediaPlayerClass).destroy();
} catch (e) {
console.warn("Failed to destroy dash player", e);
logger.warn("Failed to destroy dash player", e);
}
this.player = null;
this.playerType = null;
@ -37,7 +39,7 @@ export class Player {
try {
this.hlsPlayer.destroy();
} catch (e) {
console.warn("Failed to destroy hls player", e);
logger.warn("Failed to destroy hls player", e);
}
// fall through
@ -65,7 +67,7 @@ export class Player {
}
}
play() { console.log("Player: play"); this.player.play(); }
play() { logger.info("Player: play"); this.player.play(); }
isPaused(): boolean {
if (this.playerType === PlayerType.Dash) {
@ -74,7 +76,7 @@ export class Player {
return (this.player as HTMLVideoElement).paused;
}
}
pause() { console.log("Player: pause"); this.player.pause(); }
pause() { logger.info("Player: pause"); this.player.pause(); }
getVolume(): number {
if (this.playerType === PlayerType.Dash) {
@ -84,7 +86,7 @@ export class Player {
}
}
setVolume(value: number) {
console.log(`Player: setVolume ${value}`);
logger.info(`Player: setVolume ${value}`);
const sanitizedVolume = Math.min(1.0, Math.max(0.0, value));
if (this.playerType === PlayerType.Dash) {
@ -102,7 +104,7 @@ export class Player {
}
}
setMute(value: boolean) {
console.log(`Player: setMute ${value}`);
logger.info(`Player: setMute ${value}`);
if (this.playerType === PlayerType.Dash) {
(this.player as dashjs.MediaPlayerClass).setMute(value);
@ -119,7 +121,7 @@ export class Player {
}
}
setPlaybackRate(value: number) {
console.log(`Player: setPlaybackRate ${value}`);
logger.info(`Player: setPlaybackRate ${value}`);
const sanitizedSpeed = Math.min(16.0, Math.max(0.0, value));
if (this.playerType === PlayerType.Dash) {
@ -147,7 +149,7 @@ export class Player {
}
}
setCurrentTime(value: number) {
// console.log(`Player: setCurrentTime ${value}`);
// logger.info(`Player: setCurrentTime ${value}`);
const sanitizedTime = Math.min(this.getDuration(), Math.max(0.0, value));
if (this.playerType === PlayerType.Dash) {

View file

@ -1,7 +1,18 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { PlaybackErrorMessage, PlaybackUpdateMessage, VolumeUpdateMessage, Opcode } from 'common/Packets';
export {};
import { Logger, LoggerType } from 'common/Logger';
const logger = new Logger('PlayerWindow', LoggerType.FRONTEND);
// Cannot directly pass the object to the renderer for some reason...
const loggerInterface = {
trace: (message?: any, ...optionalParams: any[]) => { logger.trace(message, ...optionalParams); },
debug: (message?: any, ...optionalParams: any[]) => { logger.debug(message, ...optionalParams); },
info: (message?: any, ...optionalParams: any[]) => { logger.info(message, ...optionalParams); },
warn: (message?: any, ...optionalParams: any[]) => { logger.warn(message, ...optionalParams); },
error: (message?: any, ...optionalParams: any[]) => { logger.error(message, ...optionalParams); },
fatal: (message?: any, ...optionalParams: any[]) => { logger.fatal(message, ...optionalParams); },
};
declare global {
interface Window {
@ -37,21 +48,22 @@ if (TARGET === 'electron') {
onDisconnect: (callback: any) => electronAPI.ipcRenderer.on('disconnect', callback),
onPing: (callback: any) => electronAPI.ipcRenderer.on('ping', callback),
onPong: (callback: any) => electronAPI.ipcRenderer.on('pong', callback),
logger: loggerInterface,
});
// @ts-ignore
} else if (TARGET === 'webOS' || TARGET === 'tizenOS') {
preloadData = {
sendPlaybackErrorCb: () => { console.error('Player: Callback "send_playback_error" not set'); },
sendPlaybackUpdateCb: () => { console.error('Player: Callback "send_playback_update" not set'); },
sendVolumeUpdateCb: () => { console.error('Player: Callback "send_volume_update" not set'); },
// onPlayCb: () => { console.error('Player: Callback "play" not set'); },
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: () => { console.error('Player: Callback "pause" not set'); },
onResumeCb: () => { console.error('Player: Callback "resume" not set'); },
onSeekCb: () => { console.error('Player: Callback "onseek" not set'); },
onSetVolumeCb: () => { console.error('Player: Callback "setvolume" not set'); },
onSetSpeedCb: () => { console.error('Player: Callback "setspeed" not set'); },
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'); },
};
window.targetAPI = {
@ -64,10 +76,11 @@ if (TARGET === 'electron') {
onSeek: (callback: any) => { preloadData.onSeekCb = callback; },
onSetVolume: (callback: any) => { preloadData.onSetVolumeCb = callback; },
onSetSpeed: (callback: any) => { preloadData.onSetSpeedCb = callback; },
logger: loggerInterface,
};
} else {
// @ts-ignore
console.log(`Attempting to run FCast player on unsupported target: ${TARGET}`);
logger.warn(`Attempting to run FCast player on unsupported target: ${TARGET}`);
}
export {

View file

@ -12,6 +12,8 @@ import {
captionsLineHeight
} from 'src/player/Renderer';
const logger = window.targetAPI.logger;
function formatDuration(duration: number) {
if (isNaN(duration)) {
return '00:00';
@ -120,7 +122,7 @@ let captionsBaseHeight = 0;
let captionsContentHeight = 0;
function onPlay(_event, value: PlayMessage) {
console.log("Handle play message renderer", JSON.stringify(value));
logger.info("Handle play message renderer", JSON.stringify(value));
const currentVolume = player ? player.getVolume() : null;
const currentPlaybackRate = player ? player.getPlaybackRate() : null;
@ -143,7 +145,7 @@ function onPlay(_event, value: PlayMessage) {
if ((value.url || value.content) && value.container && videoElement) {
if (value.container === 'application/dash+xml') {
console.log("Loading dash player");
logger.info("Loading dash player");
const dashPlayer = dashjs.MediaPlayer().create();
const source = value.content ? value.content : value.url;
player = new Player(PlayerType.Dash, dashPlayer, source);
@ -236,7 +238,7 @@ function onPlay(_event, value: PlayMessage) {
}
} else if ((value.container === 'application/vnd.apple.mpegurl' || value.container === 'application/x-mpegURL') && !videoElement.canPlayType(value.container)) {
console.log("Loading hls player");
logger.info("Loading hls player");
const config = {
xhrSetup: function (xhr: XMLHttpRequest) {
@ -277,7 +279,7 @@ function onPlay(_event, value: PlayMessage) {
// hlsPlayer.subtitleDisplay = true;
} else {
console.log("Loading html player");
logger.info("Loading html player");
player = new Player(PlayerType.Html, videoElement, value.url);
videoElement.src = value.url;
@ -307,7 +309,7 @@ function onPlay(_event, value: PlayMessage) {
};
videoElement.onerror = (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error) => {
console.error("Player error", {source, lineno, colno, error});
logger.error("Player error", {source, lineno, colno, error});
};
videoElement.onloadedmetadata = (ev) => {
@ -419,7 +421,7 @@ function playerCtrlStateUpdate(event: PlayerControlEvent) {
break;
case PlayerControlEvent.VolumeChange: {
// console.log(`VolumeChange: isMute ${player?.isMuted()}, volume: ${player?.getVolume()}`);
// logger.info(`VolumeChange: isMute ${player?.isMuted()}, volume: ${player?.getVolume()}`);
const volume = Math.round(player?.getVolume() * playerCtrlVolumeBar.offsetWidth);
if (player?.isMuted()) {
@ -440,7 +442,7 @@ function playerCtrlStateUpdate(event: PlayerControlEvent) {
}
case PlayerControlEvent.TimeUpdate: {
// console.log(`TimeUpdate: Position: ${player.getCurrentTime()}, Duration: ${player.getDuration()}`);
// logger.info(`TimeUpdate: Position: ${player.getCurrentTime()}, Duration: ${player.getDuration()}`);
if (isLive) {
if (isLivePosition && player.getDuration() - player.getCurrentTime() > livePositionWindow) {
@ -736,7 +738,7 @@ const skipInterval = 10;
const volumeIncrement = 0.1;
function keyDownEventListener(event: any) {
// console.log("KeyDown", event);
// logger.info("KeyDown", event);
const handledCase = targetKeyDownEventListener(event);
if (handledCase) {
return;