diff --git a/src/tools/server/sdk/plex/plexClient.test.ts b/src/tools/server/sdk/plex/plexClient.test.ts
index 48c8af49c..9ef7feee4 100644
--- a/src/tools/server/sdk/plex/plexClient.test.ts
+++ b/src/tools/server/sdk/plex/plexClient.test.ts
@@ -1,32 +1,33 @@
-import { describe, expect, it } from 'vitest';
+import { afterEach, describe, expect, it } from 'vitest';
import 'vitest-fetch-mock';
import { PlexClient } from './plexClient';
-const mockResponse = `
-
-`;
-
describe('Plex SDK', () => {
- it('abc', async () => {
+ it('return sessions when player, user and session present', async () => {
// arrange
const client = new PlexClient('https://plex.local', 'MY_TOKEN');
- fetchMock.mockResponseOnce(mockResponse);
+ fetchMock.mockOnceIf(
+ 'https://plex.local/status/sessions?X-Plex-Token=MY_TOKEN',
+ `
+
+ `
+ );
// act
const response = await client.getSessions();
@@ -74,4 +75,63 @@ describe('Plex SDK', () => {
},
});
});
+
+ it('return sessions when no player and session present', async () => {
+ // arrange
+ const client = new PlexClient('http://plex.local', 'ABCYZT');
+
+ fetchMock.mockResponseOnce(`
+
+ `);
+
+ // act
+ const response = await client.getSessions();
+
+ // assert
+ expect(fetchMock.requests().length).toBe(1);
+ expect(fetchMock.requests()[0].url).toBe(
+ 'http://plex.local/status/sessions?X-Plex-Token=ABCYZT'
+ );
+ expect(response.length).toBe(1);
+ expect(response[0]).toMatchObject({
+ id: undefined,
+ username: 'Anonymous',
+ userProfilePicture: undefined,
+ sessionName: 'Plex Web (Chrome)',
+ currentlyPlaying: {
+ name: 'A long title',
+ type: 'movie',
+ },
+ });
+ });
+
+ it('return empty if no media container', async () => {
+ // arrange
+ const client = new PlexClient('http://plex.local', 'Homarr');
+
+ fetchMock.mockResponseOnce('');
+
+ // act
+ const response = await client.getSessions();
+
+ // assert
+ expect(fetchMock.requests().length).toBe(1);
+ expect(response.length).toBe(0);
+ });
+
+ afterEach(() => {
+ fetchMock.mockRestore();
+ });
});
diff --git a/src/tools/server/sdk/plex/plexClient.ts b/src/tools/server/sdk/plex/plexClient.ts
index 6bc6707ce..eabf5a264 100644
--- a/src/tools/server/sdk/plex/plexClient.ts
+++ b/src/tools/server/sdk/plex/plexClient.ts
@@ -33,7 +33,7 @@ export class PlexClient {
const mediaElement = this.findElement('Media', videoElement.elements);
const sessionElement = this.findElement('Session', videoElement.elements);
- if (!userElement || !playerElement || !mediaElement || !sessionElement) {
+ if (!playerElement || !mediaElement) {
return undefined;
}
@@ -43,9 +43,9 @@ export class PlexClient {
const transcodingElement = this.findElement('TranscodeSession', videoElement.elements);
return {
- id: sessionElement.id as string,
- username: userElement.title as string,
- userProfilePicture: userElement.thumb as string,
+ id: (sessionElement?.id as string | undefined),
+ username: userElement?.title ?? 'Anonymous' as string,
+ userProfilePicture: userElement?.thumb as string | undefined,
sessionName: `${playerElement.product} (${playerElement.title})`,
currentlyPlaying: {
name: videoElement.attributes?.title as string,
diff --git a/src/types/api/media-server/session-info.ts b/src/types/api/media-server/session-info.ts
index 81e3d943b..6132f9185 100644
--- a/src/types/api/media-server/session-info.ts
+++ b/src/types/api/media-server/session-info.ts
@@ -1,7 +1,7 @@
export type GenericSessionInfo = {
supportsMediaControl: boolean;
username: string | undefined;
- id: string;
+ id: string | undefined;
sessionName: string;
userProfilePicture: string | undefined;
currentlyPlaying: GenericCurrentlyPlaying | undefined;