mirror of
https://gitlab.com/futo-org/fcast.git
synced 2025-06-24 21:25:23 +00:00
Receivers: Moved playlist message preparation to common components
This commit is contained in:
parent
c1e72173e0
commit
2fbfac0a04
2 changed files with 53 additions and 45 deletions
|
@ -3,6 +3,9 @@ import * as url from 'url';
|
|||
import { http, https } from 'modules/follow-redirects';
|
||||
import * as memfs from 'modules/memfs';
|
||||
import { Logger, LoggerType } from 'common/Logger';
|
||||
import { supportedPlayerTypes } from 'common/MimeTypes';
|
||||
import { NetworkService } from 'common/NetworkService';
|
||||
import { ContentObject, ContentType, PlaylistContent, PlayMessage } from 'common/Packets';
|
||||
const logger = new Logger('UtilityBackend', LoggerType.BACKEND);
|
||||
|
||||
export function deepEqual(x, y) {
|
||||
|
@ -13,6 +16,44 @@ export function deepEqual(x, y) {
|
|||
) : (x === y);
|
||||
}
|
||||
|
||||
export async function preparePlayMessage(message: PlayMessage, cachedPlayerVolume: number, mediaCacheInitializationCb: ((playMessage: PlaylistContent) => void)) {
|
||||
// Protocol v2 FCast PlayMessage does not contain volume field and could result in the receiver
|
||||
// getting out-of-sync with the sender when player windows are closed and re-opened. Volume
|
||||
// is cached in the play message when volume is not set in v3 PlayMessage.
|
||||
message.volume = message.volume === undefined ? cachedPlayerVolume : message.volume;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let rendererMessage: any = await NetworkService.proxyPlayIfRequired(message);
|
||||
let rendererEvent = 'play';
|
||||
let contentViewer = supportedPlayerTypes.find(v => v === message.container.toLocaleLowerCase()) ? 'player' : 'viewer';
|
||||
|
||||
if (message.container === 'application/json') {
|
||||
const json: ContentObject = message.url ? await fetchJSON(message.url) : JSON.parse(message.content);
|
||||
|
||||
if (json && json.contentType !== undefined) {
|
||||
switch (json.contentType) {
|
||||
case ContentType.Playlist: {
|
||||
rendererMessage = json as PlaylistContent;
|
||||
rendererEvent = 'play-playlist';
|
||||
|
||||
if ((rendererMessage.forwardCache && rendererMessage.forwardCache > 0) || (rendererMessage.backwardCache && rendererMessage.backwardCache > 0)) {
|
||||
mediaCacheInitializationCb(rendererMessage);
|
||||
}
|
||||
|
||||
const offset = rendererMessage.offset ? rendererMessage.offset : 0;
|
||||
contentViewer = supportedPlayerTypes.find(v => v === rendererMessage.items[offset].container.toLocaleLowerCase()) ? 'player' : 'viewer';
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { rendererEvent: rendererEvent, rendererMessage: rendererMessage, contentViewer: contentViewer };
|
||||
}
|
||||
|
||||
export async function fetchJSON(url: string): Promise<any> {
|
||||
const protocol = url.startsWith('https') ? https : http;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue