@@ -39,9 +39,12 @@ import { BasePrinterBackend } from './BasePrinterBackend';
3939 * Provides common implementation for printers using both FiveMClient and FlashForgeClient
4040 */
4141export abstract class DualAPIBackend extends BasePrinterBackend {
42+ private static readonly FALLBACK_CAMERA_RETRY_MS = 60_000 ;
43+
4244 protected fiveMClient ! : FiveMClient ;
4345 protected legacyClient ! : FlashForgeClient ;
4446 protected productInfo : Product | null = null ;
47+ private lastFallbackCameraProbeAt = 0 ;
4548
4649 /**
4750 * Cache for last known filament usage data while printing
@@ -861,6 +864,25 @@ export abstract class DualAPIBackend extends BasePrinterBackend {
861864 const info = _machineInfo as { CameraStreamUrl ?: unknown } | null ;
862865 const cameraStreamUrl = typeof info ?. CameraStreamUrl === 'string' ? info . CameraStreamUrl : '' ;
863866 this . updateOEMCameraStreamUrl ( cameraStreamUrl ) ;
867+
868+ if ( cameraStreamUrl . trim ( ) !== '' ) {
869+ this . updateFallbackCameraStreamUrl ( '' ) ;
870+ this . lastFallbackCameraProbeAt = 0 ;
871+ return ;
872+ }
873+
874+ if ( this . fallbackCameraStreamUrl . trim ( ) !== '' ) {
875+ return ;
876+ }
877+
878+ const now = Date . now ( ) ;
879+ if ( now - this . lastFallbackCameraProbeAt < DualAPIBackend . FALLBACK_CAMERA_RETRY_MS ) {
880+ return ;
881+ }
882+
883+ this . lastFallbackCameraProbeAt = now ;
884+ const detectedCameraStreamUrl = await this . fiveMClient . detectCameraStream ( ) ;
885+ this . updateFallbackCameraStreamUrl ( detectedCameraStreamUrl ) ;
864886 }
865887
866888 /**
@@ -889,6 +911,7 @@ export abstract class DualAPIBackend extends BasePrinterBackend {
889911 public async dispose ( ) : Promise < void > {
890912 // Clear filament usage cache on disconnect
891913 this . lastFilamentUsageCache = null ;
914+ this . lastFallbackCameraProbeAt = 0 ;
892915
893916 // Call parent dispose to clean up clients
894917 await super . dispose ( ) ;
0 commit comments