From 64ecc3eae7f1c9b35b0f8154cb5fa43d3690ac95 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 Mar 2023 11:03:48 -0500 Subject: [PATCH 1/2] Add plugin types --- src/components/displaySettings/displaySettings.js | 3 ++- src/components/playback/playbackmanager.js | 7 ++++--- src/plugins/backdropScreensaver/plugin.js | 3 ++- src/plugins/bookPlayer/plugin.js | 3 ++- src/plugins/chromecastPlayer/plugin.js | 3 ++- src/plugins/comicsPlayer/plugin.js | 3 ++- src/plugins/experimentalWarnings/plugin.js | 3 ++- src/plugins/htmlAudioPlayer/plugin.js | 3 ++- src/plugins/htmlVideoPlayer/plugin.js | 3 ++- src/plugins/logoScreensaver/plugin.js | 4 +++- src/plugins/pdfPlayer/plugin.js | 3 ++- src/plugins/photoPlayer/plugin.js | 3 ++- src/plugins/playAccessValidation/plugin.js | 3 ++- src/plugins/sessionPlayer/plugin.js | 3 ++- src/plugins/syncPlay/plugin.ts | 5 +++-- src/plugins/youtubePlayer/plugin.js | 3 ++- src/scripts/screensavermanager.js | 3 ++- src/types/plugin.ts | 13 +++++++++++++ 18 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 src/types/plugin.ts diff --git a/src/components/displaySettings/displaySettings.js b/src/components/displaySettings/displaySettings.js index f351368a9a..195c919e9b 100644 --- a/src/components/displaySettings/displaySettings.js +++ b/src/components/displaySettings/displaySettings.js @@ -8,6 +8,7 @@ import datetime from '../../scripts/datetime'; import globalize from '../../scripts/globalize'; import loading from '../loading/loading'; import skinManager from '../../scripts/themeManager'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import '../../elements/emby-select/emby-select'; import '../../elements/emby-checkbox/emby-checkbox'; @@ -35,7 +36,7 @@ import template from './displaySettings.template.html'; function loadScreensavers(context, userSettings) { const selectScreensaver = context.querySelector('.selectScreensaver'); - const options = pluginManager.ofType('screensaver').map(plugin => { + const options = pluginManager.ofType(PluginType.Screensaver).map(plugin => { return { name: plugin.name, value: plugin.id diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index ffcd0e4d91..5d52321100 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -11,6 +11,7 @@ import { appHost } from '../apphost'; import Screenfull from 'screenfull'; import ServerConnections from '../ServerConnections'; import alert from '../alert'; +import { PluginType } from '../../types/plugin.ts'; import { includesAny } from '../../utils/container.ts'; const UNLIMITED_ITEMS = -1; @@ -2268,7 +2269,7 @@ class PlaybackManager { function runInterceptors(item, playOptions) { return new Promise(function (resolve, reject) { - const interceptors = pluginManager.ofType('preplayintercept'); + const interceptors = pluginManager.ofType(PluginType.PreplayIntercept); interceptors.sort(function (a, b) { return (a.order || 0) - (b.order || 0); @@ -3387,12 +3388,12 @@ class PlaybackManager { } Events.on(pluginManager, 'registered', function (e, plugin) { - if (plugin.type === 'mediaplayer') { + if (plugin.type === PluginType.MediaPlayer) { initMediaPlayer(plugin); } }); - pluginManager.ofType('mediaplayer').forEach(initMediaPlayer); + pluginManager.ofType(PluginType.MediaPlayer).forEach(initMediaPlayer); function sendProgressUpdate(player, progressEventName, reportPlaylist) { if (!player) { diff --git a/src/plugins/backdropScreensaver/plugin.js b/src/plugins/backdropScreensaver/plugin.js index 7db319a34e..823ab7d7e0 100644 --- a/src/plugins/backdropScreensaver/plugin.js +++ b/src/plugins/backdropScreensaver/plugin.js @@ -1,10 +1,11 @@ /* eslint-disable indent */ import ServerConnections from '../../components/ServerConnections'; +import { PluginType } from '../../types/plugin.ts'; class BackdropScreensaver { constructor() { this.name = 'Backdrop ScreenSaver'; - this.type = 'screensaver'; + this.type = PluginType.Screensaver; this.id = 'backdropscreensaver'; this.supportsAnonymous = false; } diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index e95c8657b1..df5e213b72 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -9,6 +9,7 @@ import TableOfContents from './tableOfContents'; import dom from '../../scripts/dom'; import { translateHtml } from '../../scripts/globalize'; import * as userSettings from '../../scripts/settings/userSettings'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import '../../elements/emby-button/paper-icon-button-light'; @@ -19,7 +20,7 @@ import './style.scss'; export class BookPlayer { constructor() { this.name = 'Book Player'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'bookplayer'; this.priority = 1; diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 9044cd3e30..81cfeab86a 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -5,6 +5,7 @@ import globalize from '../../scripts/globalize'; import castSenderApiLoader from './castSenderApi'; import ServerConnections from '../../components/ServerConnections'; import alert from '../../components/alert'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js @@ -569,7 +570,7 @@ class ChromecastPlayer { constructor() { // playbackManager needs this this.name = PlayerName; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'chromecast'; this.isLocalPlayer = false; this.lastPlayerData = {}; diff --git a/src/plugins/comicsPlayer/plugin.js b/src/plugins/comicsPlayer/plugin.js index d209069ad3..eb6d3cb11f 100644 --- a/src/plugins/comicsPlayer/plugin.js +++ b/src/plugins/comicsPlayer/plugin.js @@ -6,13 +6,14 @@ import keyboardnavigation from '../../scripts/keyboardNavigation'; import { appRouter } from '../../components/appRouter'; import ServerConnections from '../../components/ServerConnections'; import * as userSettings from '../../scripts/settings/userSettings'; +import { PluginType } from '../../types/plugin.ts'; import './style.scss'; export class ComicsPlayer { constructor() { this.name = 'Comics Player'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'comicsplayer'; this.priority = 1; this.imageMap = new Map(); diff --git a/src/plugins/experimentalWarnings/plugin.js b/src/plugins/experimentalWarnings/plugin.js index 563e6264f2..395f906890 100644 --- a/src/plugins/experimentalWarnings/plugin.js +++ b/src/plugins/experimentalWarnings/plugin.js @@ -2,6 +2,7 @@ import globalize from '../../scripts/globalize'; import * as userSettings from '../../scripts/settings/userSettings'; import { appHost } from '../../components/apphost'; import alert from '../../components/alert'; +import { PluginType } from '../../types/plugin.ts'; // TODO: Replace with date-fns // https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php @@ -46,7 +47,7 @@ function showIsoMessage() { class ExpirementalPlaybackWarnings { constructor() { this.name = 'Experimental playback warnings'; - this.type = 'preplayintercept'; + this.type = PluginType.PreplayIntercept; this.id = 'expirementalplaybackwarnings'; } diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index b5d3c8bd02..4157246714 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -3,6 +3,7 @@ import { appHost } from '../../components/apphost'; import * as htmlMediaHelper from '../../components/htmlMediaHelper'; import profileBuilder from '../../scripts/browserDeviceProfile'; import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; function getDefaultProfile() { @@ -85,7 +86,7 @@ class HtmlAudioPlayer { const self = this; self.name = 'Html Audio Player'; - self.type = 'mediaplayer'; + self.type = PluginType.MediaPlayer; self.id = 'htmlaudioplayer'; // Let any players created by plugins take priority diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f2a2b8d30b..b8551defbc 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -30,6 +30,7 @@ import ServerConnections from '../../components/ServerConnections'; import profileBuilder, { canPlaySecondaryAudio } from '../../scripts/browserDeviceProfile'; import { getIncludeCorsCredentials } from '../../scripts/settings/webSettings'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import { includesAny } from '../../utils/container.ts'; @@ -166,7 +167,7 @@ function tryRemoveElement(elem) { /** * @type {string} */ - type = 'mediaplayer'; + type = PluginType.MediaPlayer; /** * @type {string} */ diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index 8d5f7031a5..b1168ab5bd 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -1,8 +1,10 @@ +import { PluginType } from '../../types/plugin.ts'; + export default function () { const self = this; self.name = 'Logo ScreenSaver'; - self.type = 'screensaver'; + self.type = PluginType.Screensaver; self.id = 'logoscreensaver'; self.supportsAnonymous = true; diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js index 5f43d03fc9..b34404d7a9 100644 --- a/src/plugins/pdfPlayer/plugin.js +++ b/src/plugins/pdfPlayer/plugin.js @@ -4,6 +4,7 @@ import keyboardnavigation from '../../scripts/keyboardNavigation'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import dom from '../../scripts/dom'; import { appRouter } from '../../components/appRouter'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; import './style.scss'; @@ -12,7 +13,7 @@ import '../../elements/emby-button/paper-icon-button-light'; export class PdfPlayer { constructor() { this.name = 'PDF Player'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'pdfplayer'; this.priority = 1; diff --git a/src/plugins/photoPlayer/plugin.js b/src/plugins/photoPlayer/plugin.js index aa3ba5f364..7c41c53188 100644 --- a/src/plugins/photoPlayer/plugin.js +++ b/src/plugins/photoPlayer/plugin.js @@ -1,9 +1,10 @@ import ServerConnections from '../../components/ServerConnections'; +import { PluginType } from '../../types/plugin.ts'; export default class PhotoPlayer { constructor() { this.name = 'Photo Player'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'photoplayer'; this.priority = 1; } diff --git a/src/plugins/playAccessValidation/plugin.js b/src/plugins/playAccessValidation/plugin.js index c353ea9096..3081f8cf49 100644 --- a/src/plugins/playAccessValidation/plugin.js +++ b/src/plugins/playAccessValidation/plugin.js @@ -1,6 +1,7 @@ import globalize from '../../scripts/globalize'; import ServerConnections from '../../components/ServerConnections'; import alert from '../../components/alert'; +import { PluginType } from '../../types/plugin.ts'; function showErrorMessage() { return alert(globalize.translate('MessagePlayAccessRestricted')); @@ -9,7 +10,7 @@ function showErrorMessage() { class PlayAccessValidation { constructor() { this.name = 'Playback validation'; - this.type = 'preplayintercept'; + this.type = PluginType.PreplayIntercept; this.id = 'playaccessvalidation'; this.order = -2; } diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index a8ad32f791..98e0e843ab 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -1,6 +1,7 @@ import { playbackManager } from '../../components/playback/playbackmanager'; import serverNotifications from '../../scripts/serverNotifications'; import ServerConnections from '../../components/ServerConnections'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; function getActivePlayerId() { @@ -181,7 +182,7 @@ class SessionPlayer { const self = this; this.name = 'Remote Control'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.isLocalPlayer = false; this.id = 'remoteplayer'; diff --git a/src/plugins/syncPlay/plugin.ts b/src/plugins/syncPlay/plugin.ts index e4ef965a0d..59c066aaf7 100644 --- a/src/plugins/syncPlay/plugin.ts +++ b/src/plugins/syncPlay/plugin.ts @@ -5,8 +5,9 @@ import SyncPlay from './core'; import SyncPlayNoActivePlayer from './ui/players/NoActivePlayer'; import SyncPlayHtmlVideoPlayer from './ui/players/HtmlVideoPlayer'; import SyncPlayHtmlAudioPlayer from './ui/players/HtmlAudioPlayer'; +import { Plugin, PluginType } from '../../types/plugin'; -class SyncPlayPlugin { +class SyncPlayPlugin implements Plugin { name: string; id: string; type: string; @@ -17,7 +18,7 @@ class SyncPlayPlugin { this.id = 'syncplay'; // NOTE: This should probably be a "mediaplayer" so the playback manager can handle playback logic, but // SyncPlay needs refactored so it does not have an independent playback manager. - this.type = 'syncplay'; + this.type = PluginType.SyncPlay; this.priority = 1; this.init(); diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index a9dd8e9beb..2a10f8fcdc 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -2,6 +2,7 @@ import browser from '../../scripts/browser'; import { appRouter } from '../../components/appRouter'; import loading from '../../components/loading/loading'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop'; +import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; /* globals YT */ @@ -197,7 +198,7 @@ function setCurrentSrc(instance, elem, options) { class YoutubePlayer { constructor() { this.name = 'Youtube Player'; - this.type = 'mediaplayer'; + this.type = PluginType.MediaPlayer; this.id = 'youtubeplayer'; // Let any players created by plugins take priority diff --git a/src/scripts/screensavermanager.js b/src/scripts/screensavermanager.js index 4b0eedaa51..c63d530685 100644 --- a/src/scripts/screensavermanager.js +++ b/src/scripts/screensavermanager.js @@ -3,6 +3,7 @@ import { pluginManager } from '../components/pluginManager'; import inputManager from './inputManager'; import * as userSettings from './settings/userSettings'; import ServerConnections from '../components/ServerConnections'; +import { PluginType } from '../types/plugin.ts'; import Events from '../utils/events.ts'; import './screensavermanager.scss'; @@ -34,7 +35,7 @@ function getScreensaverPlugin(isLoggedIn) { option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver'; } - const plugins = pluginManager.ofType('screensaver'); + const plugins = pluginManager.ofType(PluginType.Screensaver); for (const plugin of plugins) { if (plugin.id === option) { diff --git a/src/types/plugin.ts b/src/types/plugin.ts new file mode 100644 index 0000000000..4b4b946e90 --- /dev/null +++ b/src/types/plugin.ts @@ -0,0 +1,13 @@ +export enum PluginType { + MediaPlayer = 'mediaplayer', + PreplayIntercept = 'preplayintercept', + Screensaver = 'screensaver', + SyncPlay = 'syncplay' +} + +export interface Plugin { + name: string + id: string + type: PluginType | string + priority: number +} From 3d91c72a0f177935555fe69bc4690c6c5f8de804 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 Mar 2023 11:49:19 -0500 Subject: [PATCH 2/2] Update SyncPlay plugin check --- src/scripts/libraryMenu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 92405f8fe3..77b38ab46a 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -16,6 +16,7 @@ import imageHelper from './imagehelper'; import { getMenuLinks } from '../scripts/settings/webSettings'; import Dashboard, { pageClassOn } from '../utils/dashboard'; import ServerConnections from '../components/ServerConnections'; +import { PluginType } from '../types/plugin.ts'; import Events from '../utils/events.ts'; import { getParameterByName } from '../utils/url.ts'; @@ -159,7 +160,7 @@ import '../styles/flexstyles.scss'; // Button is present headerSyncButton // SyncPlay plugin is loaded - && pluginManager.plugins.filter(plugin => plugin.id === 'syncplay').length > 0 + && pluginManager.ofType(PluginType.SyncPlay).length > 0 // SyncPlay enabled for user && policy?.SyncPlayAccess !== 'None' ) {