react-native-video-trim 6.2.1 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/VideoTrim.swift +41 -22
- package/package.json +1 -1
package/ios/VideoTrim.swift
CHANGED
|
@@ -8,6 +8,7 @@ let FILE_PREFIX = "trimmedVideo"
|
|
|
8
8
|
public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDelegate {
|
|
9
9
|
// MARK: instance private props
|
|
10
10
|
private var isShowing = false
|
|
11
|
+
private var isTrimming = false
|
|
11
12
|
private var vc: VideoTrimmerViewController?
|
|
12
13
|
private var outputFile: URL?
|
|
13
14
|
private var editorConfig: NSDictionary?
|
|
@@ -260,6 +261,9 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
260
261
|
}
|
|
261
262
|
|
|
262
263
|
private func trim(viewController: VideoTrimmerViewController, inputFile: URL, videoDuration: Double, startTime: Double, endTime: Double, isVideoType: Bool) {
|
|
264
|
+
guard !isTrimming else { return }
|
|
265
|
+
isTrimming = true
|
|
266
|
+
|
|
263
267
|
vc?.pausePlayer()
|
|
264
268
|
|
|
265
269
|
let timestamp = Int(Date().timeIntervalSince1970)
|
|
@@ -297,7 +301,9 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
297
301
|
self.emitEventToJS("onCancelTrimming", eventData: nil)
|
|
298
302
|
}
|
|
299
303
|
|
|
300
|
-
progressAlert.dismiss(animated: true)
|
|
304
|
+
progressAlert.dismiss(animated: true) {
|
|
305
|
+
self.isTrimming = false
|
|
306
|
+
}
|
|
301
307
|
})
|
|
302
308
|
|
|
303
309
|
// Create Cancel button with action handlder
|
|
@@ -318,7 +324,9 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
318
324
|
self.emitEventToJS("onCancelTrimming", eventData: nil)
|
|
319
325
|
}
|
|
320
326
|
|
|
321
|
-
progressAlert.dismiss(animated: true)
|
|
327
|
+
progressAlert.dismiss(animated: true) {
|
|
328
|
+
self.isTrimming = false
|
|
329
|
+
}
|
|
322
330
|
}
|
|
323
331
|
|
|
324
332
|
}
|
|
@@ -358,14 +366,11 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
358
366
|
|
|
359
367
|
ffmpegSession = FFmpegKit.execute(withArgumentsAsync: cmds, withCompleteCallback: { session in
|
|
360
368
|
|
|
361
|
-
// always hide progressAlert
|
|
362
|
-
DispatchQueue.main.async {
|
|
363
|
-
progressAlert.dismiss(animated: true)
|
|
364
|
-
}
|
|
365
|
-
|
|
366
369
|
let state = session?.getState()
|
|
367
370
|
let returnCode = session?.getReturnCode()
|
|
368
371
|
|
|
372
|
+
var shouldCloseEditor = false
|
|
373
|
+
|
|
369
374
|
if ReturnCode.isSuccess(returnCode) {
|
|
370
375
|
let eventPayload: [String: Any] = ["outputPath": self.outputFile!.absoluteString, "startTime": (startTime * 1000).rounded(), "endTime": (endTime * 1000).rounded(), "duration": (videoDuration * 1000).rounded()]
|
|
371
376
|
self.emitEventToJS("onFinishTrimming", eventData: eventPayload)
|
|
@@ -396,20 +401,24 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
396
401
|
}
|
|
397
402
|
}
|
|
398
403
|
} else if self.openDocumentsOnFinish {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
404
|
+
DispatchQueue.main.async {
|
|
405
|
+
progressAlert.dismiss(animated: true) {
|
|
406
|
+
self.isTrimming = false
|
|
407
|
+
self.saveFileToFilesApp(fileURL: self.outputFile!)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
402
410
|
return
|
|
403
411
|
} else if self.openShareSheetOnFinish {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
412
|
+
DispatchQueue.main.async {
|
|
413
|
+
progressAlert.dismiss(animated: true) {
|
|
414
|
+
self.isTrimming = false
|
|
415
|
+
self.shareFile(fileURL: self.outputFile!)
|
|
416
|
+
}
|
|
417
|
+
}
|
|
407
418
|
return
|
|
408
419
|
}
|
|
409
420
|
|
|
410
|
-
|
|
411
|
-
self.closeEditor(delay: 500)
|
|
412
|
-
}
|
|
421
|
+
shouldCloseEditor = self.closeWhenFinish
|
|
413
422
|
|
|
414
423
|
} else if ReturnCode.isCancel(returnCode) {
|
|
415
424
|
// CANCEL
|
|
@@ -417,8 +426,15 @@ public class VideoTrim: RCTEventEmitter, AssetLoaderDelegate, UIDocumentPickerDe
|
|
|
417
426
|
} else {
|
|
418
427
|
// FAILURE
|
|
419
428
|
self.onError(message: "Command failed with state \(String(describing: FFmpegKitConfig.sessionState(toString: state ?? .failed))) and rc \(String(describing: returnCode)).\(String(describing: session?.getFailStackTrace()))", code: .trimmingFailed)
|
|
420
|
-
|
|
421
|
-
|
|
429
|
+
shouldCloseEditor = self.closeWhenFinish
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
DispatchQueue.main.async {
|
|
433
|
+
progressAlert.dismiss(animated: true) {
|
|
434
|
+
self.isTrimming = false
|
|
435
|
+
if shouldCloseEditor {
|
|
436
|
+
self.closeEditor()
|
|
437
|
+
}
|
|
422
438
|
}
|
|
423
439
|
}
|
|
424
440
|
|
|
@@ -809,15 +825,18 @@ extension VideoTrim {
|
|
|
809
825
|
@objc(closeEditor:)
|
|
810
826
|
public func closeEditor(delay: Int = 0) {
|
|
811
827
|
guard let vc = vc else { return }
|
|
812
|
-
|
|
813
|
-
// even the file is successfully saved
|
|
814
|
-
// that's why we need a small delay here to ensure vc will be dismissed
|
|
815
|
-
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(delay)) {
|
|
828
|
+
let dismissBlock = {
|
|
816
829
|
vc.dismiss(animated: true, completion: {
|
|
817
830
|
self.emitEventToJS("onHide", eventData: nil)
|
|
818
831
|
self.isShowing = false
|
|
819
832
|
})
|
|
820
833
|
}
|
|
834
|
+
|
|
835
|
+
if delay > 0 {
|
|
836
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(delay), execute: dismissBlock)
|
|
837
|
+
} else {
|
|
838
|
+
DispatchQueue.main.async(execute: dismissBlock)
|
|
839
|
+
}
|
|
821
840
|
}
|
|
822
841
|
|
|
823
842
|
// Old Arch
|