mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Reduce the number of events triggered by sessionPlayer
This commit is contained in:
parent
362259692c
commit
37b156260d
1 changed files with 54 additions and 11 deletions
|
@ -3,6 +3,7 @@ import serverNotifications from '../../scripts/serverNotifications';
|
||||||
import ServerConnections from '../../components/ServerConnections';
|
import ServerConnections from '../../components/ServerConnections';
|
||||||
import { PluginType } from '../../types/plugin.ts';
|
import { PluginType } from '../../types/plugin.ts';
|
||||||
import Events from '../../utils/events.ts';
|
import Events from '../../utils/events.ts';
|
||||||
|
import isEqual from 'lodash-es/isEqual';
|
||||||
|
|
||||||
function getActivePlayerId() {
|
function getActivePlayerId() {
|
||||||
const info = playbackManager.getPlayerInfo();
|
const info = playbackManager.getPlayerInfo();
|
||||||
|
@ -154,8 +155,8 @@ function processUpdatedSessions(instance, sessions, apiClient) {
|
||||||
if (session) {
|
if (session) {
|
||||||
normalizeImages(session, apiClient);
|
normalizeImages(session, apiClient);
|
||||||
|
|
||||||
const eventNames = getChangedEvents(instance.lastPlayerData);
|
|
||||||
updateCurrentQueue(instance, session);
|
updateCurrentQueue(instance, session);
|
||||||
|
const eventNames = getChangedEvents(instance.lastPlayerData, session);
|
||||||
|
|
||||||
instance.lastPlayerData = session;
|
instance.lastPlayerData = session;
|
||||||
|
|
||||||
|
@ -169,21 +170,63 @@ function processUpdatedSessions(instance, sessions, apiClient) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getChangedEvents(state1) {
|
function getBasicEvents(oldPlayerData, newPlayerData) {
|
||||||
const names = [];
|
const names = [];
|
||||||
|
if (oldPlayerData.PlayState.PositionTicks !== newPlayerData.PlayState.PositionTicks) {
|
||||||
if (!state1) {
|
|
||||||
names.push('statechange');
|
|
||||||
names.push('timeupdate');
|
names.push('timeupdate');
|
||||||
names.push('pause');
|
}
|
||||||
|
if (oldPlayerData.PlayState.IsPaused !== newPlayerData.PlayState.IsPaused) {
|
||||||
|
names.push(newPlayerData.PlayState.IsPaused ? 'pause' : 'unpause');
|
||||||
|
}
|
||||||
|
if (oldPlayerData.PlayState.IsMuted !== newPlayerData.PlayState.IsMuted
|
||||||
|
|| oldPlayerData.PlayState.VolumeLevel !== newPlayerData.PlayState.VolumeLevel) {
|
||||||
|
names.push('volumechange');
|
||||||
|
}
|
||||||
|
if (oldPlayerData.PlayState.RepeatMode !== newPlayerData.PlayState.RepeatMode) {
|
||||||
|
names.push('repeatmodechange');
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
return names;
|
function copyNewStateOfBasicEvents(oldPlayerData, newPlayerData) {
|
||||||
|
const prepareOldData = (oldObject, newObject, propertyName) => {
|
||||||
|
if (!Object.hasOwn(newObject, propertyName)) {
|
||||||
|
delete oldObject[propertyName];
|
||||||
|
} else {
|
||||||
|
oldObject[propertyName] = newObject[propertyName];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'PositionTicks');
|
||||||
|
if (oldPlayerData.TranscodingInfo) {
|
||||||
|
// TranscodingInfo.CompletionPercentage and TranscodingInfo.Framerate change with time
|
||||||
|
// so it's enough if we only trigger 'timeupdate' event
|
||||||
|
prepareOldData(oldPlayerData.TranscodingInfo, newPlayerData.TranscodingInfo, 'CompletionPercentage');
|
||||||
|
prepareOldData(oldPlayerData.TranscodingInfo, newPlayerData.TranscodingInfo, 'Framerate');
|
||||||
|
}
|
||||||
|
prepareOldData(oldPlayerData, newPlayerData, 'LastActivityDate');
|
||||||
|
prepareOldData(oldPlayerData, newPlayerData, 'LastPlaybackCheckIn');
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'IsPaused');
|
||||||
|
prepareOldData(oldPlayerData, newPlayerData, 'LastPausedDate');
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'IsMuted');
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'VolumeLevel');
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'RepeatMode');
|
||||||
|
prepareOldData(oldPlayerData.PlayState, newPlayerData.PlayState, 'OrderMode');
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChangedEvents(oldPlayerData, newPlayerData) {
|
||||||
|
if (!oldPlayerData?.PlayState || !newPlayerData?.PlayState
|
||||||
|
|| (oldPlayerData.TranscodingInfo !== newPlayerData.TranscodingInfo && (!oldPlayerData.TranscodingInfo || !newPlayerData.TranscodingInfo))) {
|
||||||
|
return ['statechange'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Trim these down to prevent the UI from over-refreshing
|
const names = getBasicEvents(oldPlayerData, newPlayerData);
|
||||||
names.push('statechange');
|
// override the part of oldPlayerData, because it will be overwritten anyway, after this function
|
||||||
names.push('timeupdate');
|
copyNewStateOfBasicEvents(oldPlayerData, newPlayerData);
|
||||||
names.push('pause');
|
|
||||||
|
if (!isEqual(oldPlayerData, newPlayerData)) {
|
||||||
|
return ['statechange'];
|
||||||
|
}
|
||||||
|
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue