From 8ee69be58b27d2ec04a5fea46bfb11659c187dfe Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Thu, 27 Aug 2026 19:17:15 -0700 Subject: [PATCH] fix: Download recordings with a video file extension (#2712) - Closes: #2711 --- src/card-controller/view/item-manager.ts | 2 +- tests/card-controller/view/item-manager.test.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/card-controller/view/item-manager.ts b/src/card-controller/view/item-manager.ts index bbdfa450..3a9fbb5a 100644 --- a/src/card-controller/view/item-manager.ts +++ b/src/card-controller/view/item-manager.ts @@ -128,7 +128,7 @@ export class ViewItemManager { (cameraID ? toFilename(cameraID) : 'media') + (id ? `_${toFilename(id)}` : '') + (startTime ? `_${format(startTime, `yyyy-MM-dd-HH-mm-ss`)}` : '') + - ('.' + (item.getMediaType() === 'clip' ? 'mp4' : 'jpg')) + ('.' + (ViewItemClassifier.isVideo(item) ? 'mp4' : 'jpg')) ); } diff --git a/tests/card-controller/view/item-manager.test.ts b/tests/card-controller/view/item-manager.test.ts index cdd9455c..7474ed88 100644 --- a/tests/card-controller/view/item-manager.test.ts +++ b/tests/card-controller/view/item-manager.test.ts @@ -238,6 +238,22 @@ describe('ViewItemManager', () => { expect(downloadURL).toHaveBeenCalledWith('foo', 'camera_id.jpg'); }); + it('should generate filename for recording', async () => { + const api = createCardAPI(); + vi.mocked(api.getHASSManager().getHASS).mockReturnValue(createHASS()); + + const manager = new ViewItemManager(api); + const item = new TestViewMedia({ mediaType: ViewMediaType.Recording }); + + vi.mocked(api.getCameraManager().getMediaDownloadPath).mockResolvedValue({ + sign: false, + endpoint: 'foo', + }); + + expect(await manager.download(item)).toBe(true); + expect(downloadURL).toHaveBeenCalledWith('foo', 'camera_id.mp4'); + }); + it('should generate filename for folder without title', async () => { const api = createCardAPI(); vi.mocked(api.getHASSManager().getHASS).mockReturnValue(createHASS());