Skip to content

Commit 2c07ed2

Browse files
committed
Enhance recording functionality to support optional filename descriptions in LiveView and RecordingController
1 parent 338326c commit 2c07ed2

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

frontend/src/components/LiveView.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,14 @@ export default function LiveView({ setFileManagerInitialPath }) {
313313
setFileManagerInitialPath(lastSnapPath);
314314
}
315315
}
316-
const startRec = async (format) => {
316+
const startRec = async (description, format) => {
317317
try {
318-
const response = await fetch(
319-
`${hostIP}:${hostPort}/imswitch/api/RecordingController/startRecording?mSaveFormat=${encodeURIComponent(format)}`,
320-
);
318+
let url = `${hostIP}:${hostPort}/imswitch/api/RecordingController/startRecording?mSaveFormat=${format}`;
319+
// Add optional description if provided
320+
if (description && description.trim()) {
321+
url += `&fileName=${encodeURIComponent(description)}`;
322+
}
323+
const response = await fetch(url);
321324
if (!response.ok) {
322325
throw new Error(`Start recording failed: ${response.status}`);
323326
}

frontend/src/components/StreamControls.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export default function StreamControls({
362362
}}
363363
sx={{ minWidth: 200, flex: 1 }}
364364
disabled={!isLiveViewActive}
365-
helperText="Optional description. Filename: ISO8601_DetectorName_Description"
365+
helperText="For snapshots & recordings. Filename: ISO8601_DetectorName_Description"
366366
inputProps={{
367367
pattern: "[a-zA-Z0-9_.-]*",
368368
maxLength: 100,
@@ -426,7 +426,7 @@ export default function StreamControls({
426426
variant="contained"
427427
color="secondary"
428428
size="small"
429-
onClick={() => onStartRecord(recordFormat)}
429+
onClick={() => onStartRecord(snapFileName, recordFormat)}
430430
startIcon={<FiberManualRecord />}
431431
disabled={!isLiveViewActive}
432432
>

imswitch/imcontrol/controller/controllers/RecordingController.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -549,22 +549,43 @@ def snapNumpyToFastAPI(
549549
return Response(im_bytes, headers=headers, media_type="image/png")
550550

551551
@APIExport(runOnUIThread=True)
552-
def startRecording(self, mSaveFormat: int = SaveFormat.TIFF) -> None:
553-
"""Starts recording with the set settings to the set file path using RecordingService."""
554-
mSaveFormat = SaveFormat(mSaveFormat)
552+
@APIExport(runOnUIThread=True)
553+
def startRecording(self, mSaveFormat: int = SaveFormat.TIFF, fileName: Optional[str] = None) -> None:
554+
"""Starts recording with the set settings to the set file path using RecordingService.
555+
556+
Parameters:
557+
- mSaveFormat: Desired `SaveFormat` enum value (default: `SaveFormat.TIFF`).
558+
- fileName: Optional description to append to the generated filename.
559+
"""
560+
try:
561+
# Ensure mSaveFormat is an int
562+
mSaveFormat = int(mSaveFormat)
563+
mSaveFormat = SaveFormat(mSaveFormat)
564+
except (ValueError, TypeError) as e:
565+
self.__logger.error(f"Invalid save format: {mSaveFormat}, error: {e}")
566+
mSaveFormat = SaveFormat.TIFF
567+
568+
# Ensure fileName is a string or None
569+
if not isinstance(fileName, (str, type(None))):
570+
fileName = None
555571

556572
# we probably call from the FASTAPI server
557573
if self.recording: # Already recording
558574
return
559575

560-
timeStamp = datetime.datetime.now().strftime("%Y_%m_%d-%I-%M-%S_%p")
561-
folder = os.path.join(dirtools.UserFileDirs.getValidatedDataPath(), "recordings", timeStamp)
576+
# Use ISO 8601 date format, consistent with snap() method
577+
timeStampDay = datetime.datetime.now().strftime("%Y-%m-%d")
578+
folder = os.path.join(dirtools.UserFileDirs.getValidatedDataPath(), "recordings", timeStampDay)
562579
if not os.path.exists(folder):
563580
os.makedirs(folder)
564581
time.sleep(0.01)
565-
self.savename = os.path.join(folder, self.getFileName()) + "_rec"
566582

567583
detectorsBeingCaptured = self.getDetectorNamesToCapture()
584+
# Generate filename with detector info and description, consistent with snap()
585+
# Use "rec" as default description if none provided
586+
description = fileName if fileName else "rec"
587+
filename = self.getFileName(description=description, detector_names=detectorsBeingCaptured)
588+
self.savename = os.path.join(folder, filename)
568589
self.recMode = RecMode.UntilStop
569590
self.recordingArgs = {
570591
"detectorNames": detectorsBeingCaptured,

0 commit comments

Comments
 (0)