@@ -298,6 +298,7 @@ pub async fn start_recording(
298
298
sharing : None , // TODO: Is this gonna be problematic as it was previously always set
299
299
pretty_name : format ! ( "{target_name} {date_time}" ) ,
300
300
inner : RecordingMetaInner :: InProgress { recording : true } ,
301
+ upload : None ,
301
302
} ;
302
303
303
304
meta. save_for_project ( )
@@ -370,6 +371,7 @@ pub async fn start_recording(
370
371
spawn_actor ( {
371
372
let state_mtx = Arc :: clone ( & state_mtx) ;
372
373
let general_settings = general_settings. cloned ( ) ;
374
+ let recording_dir = recording_dir. clone ( ) ;
373
375
async move {
374
376
fail ! ( "recording::spawn_actor" ) ;
375
377
let mut state = state_mtx. write ( ) . await ;
@@ -477,13 +479,13 @@ pub async fn start_recording(
477
479
478
480
let actor_done_rx = match spawn_actor_res {
479
481
Ok ( rx) => rx,
480
- Err ( e ) => {
481
- let _ = RecordingEvent :: Failed { error : e . clone ( ) } . emit ( & app) ;
482
+ Err ( err ) => {
483
+ let _ = RecordingEvent :: Failed { error : err . clone ( ) } . emit ( & app) ;
482
484
483
485
let mut dialog = MessageDialogBuilder :: new (
484
486
app. dialog ( ) . clone ( ) ,
485
487
"An error occurred" . to_string ( ) ,
486
- e . clone ( ) ,
488
+ err . clone ( ) ,
487
489
)
488
490
. kind ( tauri_plugin_dialog:: MessageDialogKind :: Error ) ;
489
491
@@ -494,9 +496,9 @@ pub async fn start_recording(
494
496
dialog. blocking_show ( ) ;
495
497
496
498
let mut state = state_mtx. write ( ) . await ;
497
- let _ = handle_recording_end ( app, None , & mut state) . await ;
499
+ let _ = handle_recording_end ( app, Err ( err . clone ( ) ) , & mut state, recording_dir ) . await ;
498
500
499
- return Err ( e ) ;
501
+ return Err ( err ) ;
500
502
}
501
503
} ;
502
504
@@ -522,7 +524,7 @@ pub async fn start_recording(
522
524
let mut dialog = MessageDialogBuilder :: new (
523
525
app. dialog ( ) . clone ( ) ,
524
526
"An error occurred" . to_string ( ) ,
525
- e,
527
+ e. clone ( ) ,
526
528
)
527
529
. kind ( tauri_plugin_dialog:: MessageDialogKind :: Error ) ;
528
530
@@ -533,7 +535,9 @@ pub async fn start_recording(
533
535
dialog. blocking_show ( ) ;
534
536
535
537
// this clears the current recording for us
536
- handle_recording_end ( app, None , & mut state) . await . ok ( ) ;
538
+ handle_recording_end ( app, Err ( e) , & mut state, recording_dir)
539
+ . await
540
+ . ok ( ) ;
537
541
}
538
542
// Actor hasn't errored, it's just finished
539
543
v => {
@@ -581,8 +585,9 @@ pub async fn stop_recording(app: AppHandle, state: MutableState<'_, App>) -> Res
581
585
} ;
582
586
583
587
let completed_recording = current_recording. stop ( ) . await . map_err ( |e| e. to_string ( ) ) ?;
588
+ let recording_dir = completed_recording. project_path ( ) . clone ( ) ;
584
589
585
- handle_recording_end ( app, Some ( completed_recording) , & mut state) . await ?;
590
+ handle_recording_end ( app, Ok ( completed_recording) , & mut state, recording_dir ) . await ?;
586
591
587
592
Ok ( ( ) )
588
593
}
@@ -669,17 +674,24 @@ pub async fn delete_recording(app: AppHandle, state: MutableState<'_, App>) -> R
669
674
// runs when a recording ends, whether from success or failure
670
675
async fn handle_recording_end (
671
676
handle : AppHandle ,
672
- recording : Option < CompletedRecording > ,
677
+ recording : Result < CompletedRecording , String > ,
673
678
app : & mut App ,
679
+ recording_dir : PathBuf ,
674
680
) -> Result < ( ) , String > {
675
681
// Clear current recording, just in case :)
676
682
app. clear_current_recording ( ) ;
677
683
678
- let res = if let Some ( recording ) = recording {
684
+ let res = match recording {
679
685
// we delay reporting errors here so that everything else happens first
680
- Some ( handle_recording_finish ( & handle, recording) . await )
681
- } else {
682
- None
686
+ Ok ( recording) => Some ( handle_recording_finish ( & handle, recording) . await ) ,
687
+ Err ( error) => {
688
+ // TODO: Error handling
689
+ let mut project_meta = RecordingMeta :: load_for_project ( & recording_dir) . unwrap ( ) ;
690
+ project_meta. inner = RecordingMetaInner :: Failed { error } ;
691
+ project_meta. save_for_project ( ) . unwrap ( ) ;
692
+
693
+ None
694
+ }
683
695
} ;
684
696
685
697
let _ = RecordingStopped . emit ( & handle) ;
@@ -743,8 +755,6 @@ async fn handle_recording_finish(
743
755
None ,
744
756
) ) ;
745
757
746
- let target_name = completed_recording. target_name ( ) . clone ( ) ;
747
-
748
758
let ( meta_inner, sharing) = match completed_recording {
749
759
CompletedRecording :: Studio { recording, .. } => {
750
760
let recordings = ProjectRecordingsMeta :: new ( & recording_dir, & recording. meta ) ?;
@@ -766,7 +776,6 @@ async fn handle_recording_finish(
766
776
video_upload_info,
767
777
..
768
778
} => {
769
- // shareable_link = Some(video_upload_info.link.clone());
770
779
let app = app. clone ( ) ;
771
780
let output_path = recording_dir. join ( "content/output.mp4" ) ;
772
781
@@ -796,58 +805,58 @@ async fn handle_recording_finish(
796
805
797
806
let _ = screenshot_task. await ;
798
807
799
- if video_upload_succeeded {
800
- if let Ok ( result) =
801
- compress_image ( display_screenshot) . await
802
- . map_err ( |err|
803
- error ! ( "Error compressing thumbnail for instant mode progressive upload: {err}" )
804
- ) {
805
- let ( stream, total_size) = bytes_into_stream ( result) ;
806
- do_presigned_upload (
807
- & app,
808
- stream,
809
- total_size,
810
- crate :: upload:: PresignedS3PutRequest {
811
- video_id : video_upload_info. id . clone ( ) ,
812
- subpath : "screenshot/screen-capture.jpg" . to_string ( ) ,
813
- method : PresignedS3PutRequestMethod :: Put ,
814
- meta : None ,
815
- } ,
816
- |p| { } // TODO: Progress reporting
817
- )
818
- . await
819
- . map_err ( |err| {
820
- error ! ( "Error updating thumbnail for instant mode progressive upload: {err}" )
821
- } )
822
- . ok ( ) ;
823
- }
824
- } else {
825
- if let Ok ( meta) = build_video_meta ( & output_path)
826
- . map_err ( |err| error ! ( "Error getting video metdata: {}" , err) )
827
- {
828
- // The upload_video function handles screenshot upload, so we can pass it along
829
- match upload_video (
830
- & app,
831
- video_upload_info. id . clone ( ) ,
832
- output_path,
833
- display_screenshot. clone ( ) ,
834
- video_upload_info. config . clone ( ) ,
835
- meta,
836
- None ,
837
- )
838
- . await
839
- {
840
- Ok ( _) => {
841
- info ! (
842
- "Final video upload with screenshot completed successfully"
843
- )
844
- }
845
- Err ( e) => {
846
- error ! ( "Error in final upload with screenshot: {}" , e)
847
- }
848
- }
849
- }
850
- }
808
+ // if video_upload_succeeded {
809
+ // if let Ok(result) =
810
+ // compress_image(display_screenshot).await
811
+ // .map_err(|err|
812
+ // error!("Error compressing thumbnail for instant mode progressive upload: {err}")
813
+ // ) {
814
+ // let (stream, total_size) = bytes_into_stream(result);
815
+ // do_presigned_upload(
816
+ // &app,
817
+ // stream,
818
+ // total_size,
819
+ // crate::upload::PresignedS3PutRequest {
820
+ // video_id: video_upload_info.id.clone(),
821
+ // subpath: "screenshot/screen-capture.jpg".to_string(),
822
+ // method: PresignedS3PutRequestMethod::Put,
823
+ // meta: None,
824
+ // },
825
+ // |p| {} // TODO: Progress reporting
826
+ // )
827
+ // .await
828
+ // .map_err(|err| {
829
+ // error!("Error updating thumbnail for instant mode progressive upload: {err}")
830
+ // })
831
+ // .ok();
832
+ // }
833
+ // } else {
834
+ // if let Ok(meta) = build_video_meta(&output_path)
835
+ // .map_err(|err| error!("Error getting video metdata: {}", err))
836
+ // {
837
+ // // The upload_video function handles screenshot upload, so we can pass it along
838
+ // match upload_video(
839
+ // &app,
840
+ // video_upload_info.id.clone(),
841
+ // output_path,
842
+ // display_screenshot.clone(),
843
+ // video_upload_info.config.clone(),
844
+ // meta,
845
+ // None,
846
+ // )
847
+ // .await
848
+ // {
849
+ // Ok(_) => {
850
+ // info!(
851
+ // "Final video upload with screenshot completed successfully"
852
+ // )
853
+ // }
854
+ // Err(e) => {
855
+ // error!("Error in final upload with screenshot: {}", e)
856
+ // }
857
+ // }
858
+ // }
859
+ // }
851
860
}
852
861
} ) ;
853
862
@@ -864,6 +873,7 @@ async fn handle_recording_finish(
864
873
// TODO: Can we avoid reloading it from disk by parsing as arg?
865
874
let mut meta = RecordingMeta :: load_for_project ( & recording_dir) . unwrap ( ) ;
866
875
meta. inner = meta_inner;
876
+ meta. sharing = sharing;
867
877
meta. save_for_project ( )
868
878
. map_err ( |e| format ! ( "Failed to save recording meta: {e}" ) ) ?;
869
879
@@ -973,6 +983,7 @@ pub fn generate_zoom_segments_from_clicks(
973
983
pretty_name : String :: new ( ) ,
974
984
sharing : None ,
975
985
inner : RecordingMetaInner :: Studio ( recording. meta . clone ( ) ) ,
986
+ upload : None ,
976
987
} ;
977
988
978
989
generate_zoom_segments_for_project ( & recording_meta, recordings)
0 commit comments