mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-09-26 19:41:29 +08:00

* Pull go2rtc dependency * Add go2rtc to local services and add to s6 * Add relay controller for go2rtc * Add restream role * Add restream role * Add restream to nginx * Add camera live source config * Disable RTMP by default and use restream * Use go2rtc for camera config * Fix go2rtc move * Start restream on frigate start * Send restream to camera level * Fix restream * Make sure jsmpeg works as expected * Make view rspect live size config * Tweak player options to fit live view * Adjust VideoPlayer to accept live option which disables irrelevant controls * Add multiple options from restream live view * Add base for webrtc option * Setup specific restream modules * Make mp4 the default streaming for now * Expose 8554 for rtsp relay from go2rtc * Formatting * Update docs to suggest new restream method. * Update docs to reflect restream role * Update docs to reflect restream role * Add webrtc player * Improvements to webRTC * Support webrtc * Cleanup * Adjust rtmp test and add restream test * Fix tests * Add restream tests * Add live view docs and show different options * Small docs tweak * Support all stream types * Update to beta 9 of go2rtc * Formatting * Make jsmpeg the default * Support wss if made from https * Support wss if made from https * Use onEffect * Set url outside onEffect * Fix passed deps * Update docs about required host mode * Try memo instead * Close websocket on changing camera * Formatting * Close pc connection * Set video source to null on cleanup * Use full path since go2rtc can't see PATH var * Adjust audio codec to enable browser audio by default * Cleanup stream creation * Add restream tests * Format tests * Mock requests * Adjust paths * Move stream configs to restream * Remove live source * Remove live config * Use live persistence for which view to use on each camera * Fix live sizes * Only use jsmpeg sizes for jsmpeg live * Set max live size * Remove access of live config * Add selector for live view source in web view * Remove RTMP from default list of roles * Update docs * Fix tests * Fix docs for live view modes * make default undefined to avoid race condition * Wait until camera source is loaded to avoid race condition * Fix tests * Add config to go2rtc * Work with config * Set full path for config * Set to use stun * Check for mounted file * Look for frigate-go2rtc * Update docs to reflect webRTC configuration. * Add link to go2rtc config * Update docs to be more clear * Update docs to be more clear * Update format Co-authored-by: Felipe Santos <felipecassiors@gmail.com> * Update live docs * Improve bash startup script * Add option to force audio compatibility * Formatting * Fix mapping * Fix broken link * Update go2rtc version * Get go2rtc webui working * Add support for mse * Remove mp4 option * Undo changes to video player * Update docs for new live view options * Make separate path for mse * Remove unused * Remove mp4 path * Try to get go2rtc proxy working * Try to get go2rtc proxy working * Remove unused callback * Allow websocket on restrea dashboard * Make mse default stream option * Fix mse sizing * don't assume roles is defined * Remove nginx mapping to go2rtc ui Co-authored-by: Felipe Santos <felipecassiors@gmail.com> Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
77 lines
3.0 KiB
JavaScript
77 lines
3.0 KiB
JavaScript
import { h } from 'preact';
|
|
import * as AutoUpdatingCameraImage from '../../components/AutoUpdatingCameraImage';
|
|
import * as Context from '../../context';
|
|
import * as Mqtt from '../../api/mqtt';
|
|
import Camera from '../Camera';
|
|
import * as JSMpegPlayer from '../../components/JSMpegPlayer';
|
|
import { fireEvent, render, screen, waitForElementToBeRemoved } from 'testing-library';
|
|
|
|
describe('Camera Route', () => {
|
|
let mockUsePersistence, mockSetOptions;
|
|
|
|
beforeEach(() => {
|
|
mockSetOptions = jest.fn();
|
|
mockUsePersistence = jest.spyOn(Context, 'usePersistence').mockImplementation(() => [{}, mockSetOptions, true]);
|
|
jest.spyOn(AutoUpdatingCameraImage, 'default').mockImplementation(({ searchParams }) => {
|
|
return <div data-testid="mock-image">{searchParams.toString()}</div>;
|
|
});
|
|
jest.spyOn(JSMpegPlayer, 'default').mockImplementation(() => {
|
|
return <div data-testid="mock-jsmpeg" />;
|
|
});
|
|
jest.spyOn(Mqtt, 'MqttProvider').mockImplementation(({ children }) => children);
|
|
});
|
|
|
|
test('reads camera feed options from persistence', async () => {
|
|
mockUsePersistence.mockReturnValue([
|
|
{
|
|
bbox: true,
|
|
timestamp: false,
|
|
zones: true,
|
|
mask: false,
|
|
motion: true,
|
|
regions: false,
|
|
},
|
|
mockSetOptions,
|
|
true,
|
|
]);
|
|
|
|
render(<Camera camera="front" />);
|
|
|
|
await waitForElementToBeRemoved(() => screen.queryByLabelText('Loading…'), { timeout: 10 });
|
|
|
|
fireEvent.click(screen.queryByText('Debug'));
|
|
fireEvent.click(screen.queryByText('Show Options'));
|
|
expect(screen.queryByTestId('mock-image')).toHaveTextContent(
|
|
'bbox=1×tamp=0&zones=1&mask=0&motion=1®ions=0'
|
|
);
|
|
});
|
|
|
|
test('updates camera feed options to persistence', async () => {
|
|
mockUsePersistence
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{}, mockSetOptions, true])
|
|
.mockReturnValueOnce([{ bbox: true }, mockSetOptions, true])
|
|
.mockReturnValueOnce([{ bbox: true, timestamp: true }, mockSetOptions, true]);
|
|
|
|
render(<Camera camera="front" />);
|
|
|
|
await waitForElementToBeRemoved(() => screen.queryByLabelText('Loading…'), { timeout: 10 });
|
|
|
|
fireEvent.click(screen.queryByText('Debug'));
|
|
fireEvent.click(screen.queryByText('Show Options'));
|
|
fireEvent.change(screen.queryByTestId('bbox-input'), { target: { checked: true } });
|
|
fireEvent.change(screen.queryByTestId('timestamp-input'), { target: { checked: true } });
|
|
fireEvent.click(screen.queryByText('Hide Options'));
|
|
|
|
expect(mockUsePersistence).toHaveBeenCalledTimes(10);
|
|
expect(mockSetOptions).toHaveBeenCalledTimes(2);
|
|
expect(screen.queryByTestId('mock-image')).toHaveTextContent('bbox=1×tamp=1');
|
|
});
|
|
});
|