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
@@ -0,0 +1,37 @@
import { expect, tap } from '@git.zone/tstest/tapbundle';
import { createDlnaDmrDiscoveryDescriptor } from '../../ts/integrations/dlna_dmr/index.js';
tap.test('matches DLNA DMR SSDP records', async () => {
const descriptor = createDlnaDmrDiscoveryDescriptor();
const matcher = descriptor.getMatchers()[0];
const result = await matcher.matches({
st: 'urn:schemas-upnp-org:device:MediaRenderer:1',
usn: 'uuid:renderer-1::urn:schemas-upnp-org:device:MediaRenderer:1',
location: 'http://192.168.1.50:8000/description.xml',
upnp: {
friendlyName: 'Living Room Renderer',
manufacturer: 'Example',
modelName: 'Renderer',
serviceList: {
service: [
{ serviceId: 'urn:upnp-org:serviceId:AVTransport' },
{ serviceId: 'urn:upnp-org:serviceId:ConnectionManager' },
{ serviceId: 'urn:upnp-org:serviceId:RenderingControl' },
],
},
},
}, {});
expect(result.matched).toBeTrue();
expect(result.normalizedDeviceId).toEqual('uuid:renderer-1');
expect(result.candidate?.integrationDomain).toEqual('dlna_dmr');
});
tap.test('matches manual DLNA DMR entries', async () => {
const descriptor = createDlnaDmrDiscoveryDescriptor();
const matcher = descriptor.getMatchers()[1];
const result = await matcher.matches({ url: 'http://renderer.local/device.xml', name: 'Manual Renderer' }, {});
expect(result.matched).toBeTrue();
expect(result.candidate?.metadata?.location).toEqual('http://renderer.local/device.xml');
});
export default tap.start();
@@ -0,0 +1,56 @@
import { expect, tap } from '@git.zone/tstest/tapbundle';
import { DlnaDmrMapper } from '../../ts/integrations/dlna_dmr/index.js';
import type { IDlnaDmrSnapshot } from '../../ts/integrations/dlna_dmr/index.js';
tap.test('maps DLNA renderer snapshots to canonical devices and entities', async () => {
const snapshot: IDlnaDmrSnapshot = {
device: {
location: 'http://192.168.1.50:8000/description.xml',
udn: 'uuid:renderer-1',
deviceType: 'urn:schemas-upnp-org:device:MediaRenderer:1',
friendlyName: 'Living Room Renderer',
manufacturer: 'Example',
modelName: 'DMR 1',
services: {},
},
state: {
online: true,
transport: {
currentTransportState: 'PLAYING',
currentTransportActions: ['Play', 'Pause', 'Stop'],
},
rendering: {
volume: 42,
muted: false,
presets: ['FactoryDefaults', 'Movie'],
selectedPreset: 'Movie',
},
media: {
currentTrackUri: 'http://media.local/song.mp3',
metadata: {
title: 'Test Song',
artist: 'Test Artist',
album: 'Test Album',
upnpClass: 'object.item.audioItem.musicTrack',
},
position: {
trackDurationSeconds: 240,
relativeTimeSeconds: 12,
},
},
sinkProtocolInfo: ['http-get:*:audio/mpeg:*'],
updatedAt: '2026-01-01T00:00:00.000Z',
},
};
const devices = DlnaDmrMapper.toDevices(snapshot);
const entities = DlnaDmrMapper.toEntities(snapshot);
expect(devices[0].id).toEqual('dlna_dmr.renderer.uuid_renderer_1');
expect(devices[0].state.find((stateArg) => stateArg.featureId === 'playback')?.value).toEqual('playing');
expect(entities[0].id).toEqual('media_player.living_room_renderer');
expect(entities[0].state).toEqual('playing');
expect(entities[0].attributes?.volumeLevel).toEqual(0.42);
expect(entities[0].attributes?.mediaContentType).toEqual('music');
});
export default tap.start();