Add native camera and media service integrations

This commit is contained in:
2026-05-05 17:13:54 +00:00
parent 489d9d5243
commit e7441844c9
112 changed files with 18608 additions and 327 deletions
+99
View File
@@ -0,0 +1,99 @@
import { expect, tap } from '@git.zone/tstest/tapbundle';
import { PlexMapper, type IPlexSnapshot } from '../../ts/integrations/plex/index.js';
const snapshot: IPlexSnapshot = {
capturedAt: '2026-01-01T00:00:00.000Z',
source: 'manual',
online: true,
server: {
machineIdentifier: 'server-abc',
friendlyName: 'Media Box',
version: '1.41.0',
platform: 'Linux',
url: 'http://192.168.1.10:32400',
host: '192.168.1.10',
port: 32400,
online: true,
},
clients: [{
machineIdentifier: 'client-abc',
title: 'Living Room TV',
product: 'Plex for Android TV',
platform: 'Android',
host: '192.168.1.55',
port: 32500,
protocolCapabilities: ['playback', 'timeline'],
source: 'GDM',
volumeLevel: 0.42,
muted: false,
}],
sessions: [{
sessionKey: '7',
ratingKey: '1001',
key: '/library/metadata/1001',
title: 'The Test Episode',
type: 'episode',
summary: 'A test episode.',
duration: 3600000,
viewOffset: 125000,
librarySectionTitle: 'TV Shows',
grandparentTitle: 'Example Show',
parentTitle: 'Season 1',
parentIndex: 1,
index: 2,
thumb: '/library/metadata/1001/thumb/1',
state: 'playing',
mediaPositionUpdatedAt: '2026-01-01T00:00:00.000Z',
User: { id: '1', title: 'Owner' },
Player: {
machineIdentifier: 'client-abc',
title: 'Living Room TV',
product: 'Plex for Android TV',
platform: 'Android',
state: 'playing',
protocolCapabilities: ['playback', 'timeline'],
},
Session: { id: 'session-1', bandwidth: 9000, location: 'lan' },
}],
libraries: [{
key: '1',
uuid: 'library-tv',
title: 'TV Shows',
type: 'show',
itemCount: 123,
counts: { show: 10, season: 20, episode: 123 },
refreshing: false,
lastAddedItem: 'Example Show - S01E02 - The Test Episode',
lastAddedTimestamp: '2026-01-01T00:00:00.000Z',
}],
};
tap.test('maps Plex servers and media clients to canonical devices', async () => {
const devices = PlexMapper.toDevices(snapshot);
const server = devices.find((deviceArg) => deviceArg.id === 'plex.server.server_abc');
const client = devices.find((deviceArg) => deviceArg.id === 'plex.client.server_abc.client_abc');
expect(server?.online).toBeTrue();
expect(server?.state.some((stateArg) => stateArg.featureId === 'active_sessions' && stateArg.value === 1)).toBeTrue();
expect(client?.manufacturer).toEqual('Android');
expect(client?.state.some((stateArg) => stateArg.featureId === 'current_title' && stateArg.value === 'The Test Episode')).toBeTrue();
});
tap.test('maps Plex activity, media players, and libraries to entities', async () => {
const entities = PlexMapper.toEntities(snapshot);
const activity = entities.find((entityArg) => entityArg.id === 'sensor.media_box_plex');
const player = entities.find((entityArg) => entityArg.id === 'media_player.living_room_tv_plex');
const library = entities.find((entityArg) => entityArg.id === 'sensor.media_box_tv_shows_plex_library');
expect(activity?.state).toEqual(1);
expect(activity?.attributes?.watching).toEqual({ 'Owner - Plex for Android TV': 'Example Show - S1:E2 - The Test Episode' });
expect(player?.state).toEqual('playing');
expect(player?.attributes?.mediaContentType).toEqual('tvshow');
expect(player?.attributes?.mediaDuration).toEqual(3600);
expect(player?.attributes?.mediaPosition).toEqual(125);
expect(player?.attributes?.volumeLevel).toEqual(0.42);
expect(library?.state).toEqual(123);
expect(library?.attributes?.primaryType).toEqual('episode');
});
export default tap.start();