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

Receivers: Add playlist next/previous buttons and metadata for audio files

This commit is contained in:
Michael Hollister 2025-06-16 15:17:16 -05:00
parent 782a01f4e9
commit 56e10760b8
8 changed files with 151 additions and 32 deletions

View file

@ -1,6 +1,6 @@
import { BrowserWindow, ipcMain, IpcMainEvent, nativeImage, Tray, Menu, dialog, shell } from 'electron';
import { ToastIcon } from 'common/components/Toast';
import { Opcode, PlaybackErrorMessage, PlaybackUpdateMessage, VolumeUpdateMessage, PlayMessage, PlayUpdateMessage, EventMessage, EventType, PlaylistContent, SeekMessage, SetVolumeMessage, SetSpeedMessage, SetPlaylistItemMessage } from 'common/Packets';
import { Opcode, PlaybackErrorMessage, PlaybackUpdateMessage, VolumeUpdateMessage, PlayMessage, PlayUpdateMessage, EventMessage, EventType, PlaylistContent, SeekMessage, SetVolumeMessage, SetSpeedMessage, SetPlaylistItemMessage, MetadataType, GenericMediaMetadata } from 'common/Packets';
import { DiscoveryService } from 'common/DiscoveryService';
import { TcpListenerService } from 'common/TcpListenerService';
import { WebSocketListenerService } from 'common/WebSocketListenerService';
@ -19,6 +19,8 @@ import { hideBin } from 'yargs/helpers';
const cp = require('child_process');
let logger = null;
const APPLICATION_TITLE = 'FCast Receiver';
class AppCache {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
public interfaces: any = null;
@ -125,7 +127,7 @@ export class Main {
await dialog.showMessageBox({
type: 'info',
title: 'Fcast Receiver',
title: APPLICATION_TITLE,
message: aboutMessage,
buttons: ['OK'],
defaultId: 0
@ -168,11 +170,18 @@ export class Main {
Main.mediaCache = new MediaCache(playMessage);
});
let windowTitle = APPLICATION_TITLE;
if (message.metadata?.type === MetadataType.Generic) {
const metadata = message.metadata as GenericMediaMetadata;
windowTitle = metadata.title ? `${metadata.title} - ${APPLICATION_TITLE}` : APPLICATION_TITLE;
}
if (!Main.playerWindow) {
Main.playerWindow = new BrowserWindow({
fullscreen: true,
autoHideMenuBar: true,
icon: path.join(__dirname, 'icon512.png'),
title: windowTitle,
webPreferences: {
preload: path.join(__dirname, 'player/preload.js')
}
@ -191,11 +200,13 @@ export class Main {
});
}
else if (Main.playerWindow && messageInfo.contentViewer !== Main.playerWindowContentViewer) {
Main.playerWindow.setTitle(windowTitle);
Main.playerWindow.loadFile(path.join(__dirname, `${messageInfo.contentViewer}/index.html`));
Main.playerWindow.on('ready-to-show', async () => {
Main.playerWindow?.webContents?.send(messageInfo.rendererEvent, messageInfo.rendererMessage);
});
} else {
Main.playerWindow.setTitle(windowTitle);
Main.playerWindow?.webContents?.send(messageInfo.rendererEvent, messageInfo.rendererMessage);
}

View file

@ -12,7 +12,9 @@
<div id="title-icon"></div>
<div id="loading-spinner" class="lds-ring"><div></div><div></div><div></div><div></div></div>
<div id="idle-background"></div>
<img id="thumbnailImage" />
<video id="videoPlayer" autoplay preload="auto"></video>
<div id="mediaTitle" class="captionsContainer"></div>
<div id="videoCaptions" class="captionsContainer"></div>
<div id="controls" class="container">
@ -27,7 +29,9 @@
</div>
<div class="leftButtonContainer">
<div id="playPrevious" class="playPrevious iconSize"></div>
<div id="action" class="play iconSize"></div>
<div id="playNext" class="playNext iconSize"></div>
<div id="volume" class="volume_high iconSize"></div>
<div class="volumeContainer">