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;