@@ -43,6 +43,12 @@ final class CameraViewModel: NSObject, ObservableObject {
4343 deinit {
4444 // Ensure brightness is restored if we used screen torch
4545 setScreenTorchEnabled ( false )
46+
47+ // Remove orientation observer
48+ if let observer = orientationObserver {
49+ NotificationCenter . default. removeObserver ( observer)
50+ }
51+ UIDevice . current. endGeneratingDeviceOrientationNotifications ( )
4652 }
4753
4854 // MARK: - Grid
@@ -365,6 +371,15 @@ extension CameraViewModel {
365371 print ( " Video concatenation completed successfully " )
366372 print ( " Output URL: \( outputURL) " )
367373 self . saveVideoToPhotos ( outputURL)
374+
375+ // CLEANUP segments ONLY after successful export
376+ for segment in self . segments {
377+ try ? FileManager . default. removeItem ( at: segment. url)
378+ }
379+ DispatchQueue . main. async {
380+ self . segments. removeAll ( )
381+ }
382+
368383 // Clean up temp file after a delay to ensure save completes
369384 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 2.0 ) {
370385 try ? FileManager . default. removeItem ( at: outputURL)
@@ -386,6 +401,15 @@ extension CameraViewModel {
386401 case . success( let filteredURL) :
387402 print ( " Filter applied successfully, saving filtered video " )
388403 self . saveVideoToPhotos ( filteredURL)
404+
405+ // CLEANUP segments ONLY after successful filtered export
406+ for segment in self . segments {
407+ try ? FileManager . default. removeItem ( at: segment. url)
408+ }
409+ DispatchQueue . main. async {
410+ self . segments. removeAll ( )
411+ }
412+
389413 // Clean up temp files after a delay
390414 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 2.0 ) {
391415 try ? FileManager . default. removeItem ( at: filteredURL)
@@ -395,23 +419,22 @@ extension CameraViewModel {
395419 print ( " Filter application failed: \( error) " )
396420 print ( " Saving unfiltered video instead " )
397421 self . saveVideoToPhotos ( outputURL)
422+
423+ // Even on failure, if we are saving the raw one, we cleanup segments after saving
424+ for segment in self . segments {
425+ try ? FileManager . default. removeItem ( at: segment. url)
426+ }
427+ DispatchQueue . main. async {
428+ self . segments. removeAll ( )
429+ }
430+
398431 // Clean up temp file after a delay
399432 DispatchQueue . main. asyncAfter ( deadline: . now( ) + 2.0 ) {
400433 try ? FileManager . default. removeItem ( at: outputURL)
401434 }
402435 }
403436 }
404437 }
405-
406- // Clean up individual segment files
407- for segment in segments {
408- try ? FileManager . default. removeItem ( at: segment. url)
409- }
410-
411- // Clear segments after processing
412- DispatchQueue . main. async {
413- self . segments. removeAll ( )
414- }
415438 }
416439
417440 private func applyFilter( _ filterType: VideoFilter , to composition: AVMutableComposition , completion: @escaping ( Result < URL , Error > ) -> Void ) {
0 commit comments