react-native-video-trim 4.1.0 → 5.0.1

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.
Files changed (99) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +89 -76
  3. package/VideoTrim.podspec +3 -3
  4. package/android/build.gradle +6 -53
  5. package/android/gradle.properties +1 -1
  6. package/android/src/main/AndroidManifest.xml +1 -1
  7. package/android/src/main/java/com/{margelo/nitro/videotrim/VideoTrim.kt → videotrim/VideoTrimModule.kt} +246 -232
  8. package/android/src/main/java/com/videotrim/VideoTrimPackage.kt +33 -0
  9. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/enums/ErrorCode.java +1 -1
  10. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/interfaces/IVideoTrimmerView.java +1 -1
  11. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/interfaces/VideoTrimListener.java +5 -4
  12. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/utils/MediaMetadataUtil.java +1 -1
  13. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/utils/StorageUtil.java +1 -1
  14. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/utils/VideoTrimmerUtil.java +20 -18
  15. package/android/src/main/java/com/{margelo/nitro/videotrim → videotrim}/widgets/VideoTrimmerView.java +44 -45
  16. package/ios/AssetLoader.h +19 -0
  17. package/ios/AssetLoader.mm +87 -0
  18. package/ios/ErrorCode.h +9 -0
  19. package/ios/ProgressAlertController.h +15 -0
  20. package/ios/ProgressAlertController.mm +78 -0
  21. package/ios/VideoTrim.h +31 -0
  22. package/ios/VideoTrim.mm +663 -0
  23. package/ios/VideoTrimmer.h +67 -0
  24. package/ios/VideoTrimmer.mm +863 -0
  25. package/ios/VideoTrimmerThumb.h +23 -0
  26. package/ios/VideoTrimmerThumb.mm +175 -0
  27. package/ios/VideoTrimmerViewController.h +52 -0
  28. package/ios/VideoTrimmerViewController.mm +533 -0
  29. package/lib/module/NativeVideoTrim.js +5 -0
  30. package/lib/module/NativeVideoTrim.js.map +1 -0
  31. package/lib/module/index.js +24 -24
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/typescript/src/NativeVideoTrim.d.ts +107 -0
  34. package/lib/typescript/src/NativeVideoTrim.d.ts.map +1 -0
  35. package/lib/typescript/src/index.d.ts +16 -10
  36. package/lib/typescript/src/index.d.ts.map +1 -1
  37. package/package.json +15 -18
  38. package/src/NativeVideoTrim.ts +113 -0
  39. package/src/index.tsx +29 -31
  40. package/android/CMakeLists.txt +0 -24
  41. package/android/src/main/cpp/cpp-adapter.cpp +0 -6
  42. package/android/src/main/java/com/margelo/nitro/videotrim/VideoTrimPackage.kt +0 -22
  43. package/ios/AssetLoader.swift +0 -99
  44. package/ios/ErrorCode.swift +0 -17
  45. package/ios/ProgressAlertController.swift +0 -100
  46. package/ios/VideoTrim.swift +0 -67
  47. package/ios/VideoTrimImpl.swift +0 -957
  48. package/ios/VideoTrimmer.swift +0 -872
  49. package/ios/VideoTrimmerThumb.swift +0 -175
  50. package/ios/VideoTrimmerViewController.swift +0 -557
  51. package/lib/module/VideoTrim.nitro.js +0 -4
  52. package/lib/module/VideoTrim.nitro.js.map +0 -1
  53. package/lib/typescript/src/VideoTrim.nitro.d.ts +0 -257
  54. package/lib/typescript/src/VideoTrim.nitro.d.ts.map +0 -1
  55. package/nitrogen/generated/android/c++/JEditorConfig.hpp +0 -237
  56. package/nitrogen/generated/android/c++/JFileValidationResult.hpp +0 -61
  57. package/nitrogen/generated/android/c++/JFunc_void.hpp +0 -74
  58. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__unordered_map_std__string__std__string_.hpp +0 -89
  59. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.cpp +0 -151
  60. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.hpp +0 -68
  61. package/nitrogen/generated/android/c++/JTrimOptions.hpp +0 -109
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/EditorConfig.kt +0 -72
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/FileValidationResult.kt +0 -28
  64. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void.kt +0 -80
  65. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void_std__string_std__unordered_map_std__string__std__string_.kt +0 -80
  66. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/HybridVideoTrimSpec.kt +0 -86
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/TrimOptions.kt +0 -40
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/videotrimOnLoad.kt +0 -35
  69. package/nitrogen/generated/android/videotrim+autolinking.cmake +0 -78
  70. package/nitrogen/generated/android/videotrim+autolinking.gradle +0 -27
  71. package/nitrogen/generated/android/videotrimOnLoad.cpp +0 -50
  72. package/nitrogen/generated/android/videotrimOnLoad.hpp +0 -25
  73. package/nitrogen/generated/ios/VideoTrim+autolinking.rb +0 -60
  74. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.cpp +0 -96
  75. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.hpp +0 -374
  76. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Umbrella.hpp +0 -56
  77. package/nitrogen/generated/ios/VideoTrimAutolinking.mm +0 -33
  78. package/nitrogen/generated/ios/VideoTrimAutolinking.swift +0 -25
  79. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.cpp +0 -11
  80. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.hpp +0 -127
  81. package/nitrogen/generated/ios/swift/EditorConfig.swift +0 -541
  82. package/nitrogen/generated/ios/swift/FileValidationResult.swift +0 -57
  83. package/nitrogen/generated/ios/swift/Func_void.swift +0 -46
  84. package/nitrogen/generated/ios/swift/Func_void_FileValidationResult.swift +0 -46
  85. package/nitrogen/generated/ios/swift/Func_void_bool.swift +0 -46
  86. package/nitrogen/generated/ios/swift/Func_void_double.swift +0 -46
  87. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +0 -46
  88. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +0 -46
  89. package/nitrogen/generated/ios/swift/Func_void_std__string_std__unordered_map_std__string__std__string_.swift +0 -54
  90. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +0 -46
  91. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec.swift +0 -54
  92. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec_cxx.swift +0 -241
  93. package/nitrogen/generated/ios/swift/TrimOptions.swift +0 -189
  94. package/nitrogen/generated/shared/c++/EditorConfig.hpp +0 -253
  95. package/nitrogen/generated/shared/c++/FileValidationResult.hpp +0 -77
  96. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.cpp +0 -27
  97. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.hpp +0 -80
  98. package/nitrogen/generated/shared/c++/TrimOptions.hpp +0 -125
  99. package/src/VideoTrim.nitro.ts +0 -263
@@ -1,99 +0,0 @@
1
- //
2
- // AssetLoader.swift
3
- // VideoTrim
4
- //
5
- // Created by Duc Trung Mai on 20/5/25.
6
- //
7
-
8
- import AVFoundation
9
-
10
- protocol AssetLoaderDelegate: AnyObject {
11
- func assetLoader(_ loader: AssetLoader, didFailWithError error: Error, forKey key: String)
12
- func assetLoaderDidSucceed(_ loader: AssetLoader)
13
- }
14
-
15
- class AssetLoader: NSObject {
16
- var asset: AVURLAsset?
17
- weak var delegate: AssetLoaderDelegate?
18
-
19
- func loadAsset(url: URL, isVideoType: Bool) {
20
- // Creating AVURLAsset (not blocking the main thread)
21
- asset = AVURLAsset(url: url, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
22
- let keys = ["duration", "tracks"]
23
-
24
- // Asynchronous property loading
25
- asset?.loadValuesAsynchronously(forKeys: keys) {
26
- DispatchQueue.main.async {
27
- self.assetLoaded(isVideoType: isVideoType)
28
- }
29
- }
30
- }
31
-
32
- private func assetLoaded(isVideoType: Bool) {
33
- guard let asset = asset else { return }
34
-
35
- let keys = ["duration", "tracks"]
36
- for key in keys {
37
- var error: NSError?
38
- let status = asset.statusOfValue(forKey: key, error: &error)
39
-
40
- if status == .failed {
41
- if let error = error {
42
- delegate?.assetLoader(self, didFailWithError: error, forKey: key)
43
- }
44
- return
45
- } else if status == .cancelled {
46
- delegate?.assetLoader(self, didFailWithError: NSError(domain: "AssetLoader", code: -1, userInfo: [NSLocalizedDescriptionKey: "\(key) loading was cancelled"]), forKey: key)
47
- return
48
- } else if status != .loaded {
49
- delegate?.assetLoader(self, didFailWithError: NSError(domain: "AssetLoader", code: -1, userInfo: [NSLocalizedDescriptionKey: "\(key) is in an unknown state"]), forKey: key)
50
- return
51
- }
52
- }
53
-
54
- if isVideoType {
55
- // Process the tracks to load the remaining properties
56
- self.processAssetTracks()
57
- } else {
58
- delegate?.assetLoaderDidSucceed(self)
59
- }
60
- }
61
-
62
- private func processAssetTracks() {
63
- guard let asset = asset else { return }
64
-
65
- let videoTracks = asset.tracks(withMediaType: .video)
66
- guard let videoTrack = videoTracks.first else {
67
- delegate?.assetLoader(self, didFailWithError: NSError(domain: "AssetLoader", code: -1, userInfo: [NSLocalizedDescriptionKey: "No video tracks found"]), forKey: "tracks")
68
- return
69
- }
70
-
71
- let trackKeys = ["naturalSize", "preferredTransform"]
72
- videoTrack.loadValuesAsynchronously(forKeys: trackKeys) {
73
- DispatchQueue.main.async {
74
- self.trackPropertiesLoaded(track: videoTrack)
75
- }
76
- }
77
- }
78
-
79
- private func trackPropertiesLoaded(track: AVAssetTrack) {
80
- var error: NSError?
81
-
82
- let naturalSizeStatus = track.statusOfValue(forKey: "naturalSize", error: &error)
83
- let preferredTransformStatus = track.statusOfValue(forKey: "preferredTransform", error: &error)
84
-
85
- if naturalSizeStatus == .loaded, preferredTransformStatus == .loaded {
86
- let naturalSize = track.naturalSize
87
- let preferredTransform = track.preferredTransform
88
-
89
- print("Natural size: \(naturalSize)")
90
- print("Preferred transform: \(preferredTransform)")
91
- delegate?.assetLoaderDidSucceed(self)
92
- } else {
93
- if let error = error {
94
- let failedKey = naturalSizeStatus != .loaded ? "naturalSize" : "preferredTransform"
95
- delegate?.assetLoader(self, didFailWithError: error, forKey: failedKey)
96
- }
97
- }
98
- }
99
- }
@@ -1,17 +0,0 @@
1
- //
2
- // ErrorCode.swift
3
- // VideoTrim
4
- //
5
- // Created by Duc Trung Mai on 20/5/25.
6
- //
7
-
8
- import Foundation
9
-
10
- enum ErrorCode: String {
11
- case trimmingFailed = "TRIMMING_FAILED"
12
- case failToLoadMedia = "FAIL_TO_LOAD_MEDIA"
13
- case failToSaveToPhoto = "FAIL_TO_SAVE_TO_PHOTO"
14
- case failToShare = "FAIL_TO_SHARE"
15
- case noPhotoPermission = "NO_PHOTO_PERMISSION"
16
- case invalidFilePath = "INVALID_FILE_PATH"
17
- }
@@ -1,100 +0,0 @@
1
- //
2
- // ProgressAlertController.swift
3
- // VideoTrim
4
- //
5
- // Created by Duc Trung Mai on 20/5/25.
6
- //
7
-
8
- import UIKit
9
-
10
- class ProgressAlertController: UIViewController {
11
- var onDismiss: (() -> Void)?
12
-
13
- private let titleLabel = UILabel()
14
- private let progressBar = UIProgressView(progressViewStyle: .default)
15
- private let actionButton = UIButton(type: .system)
16
-
17
- override func viewDidLoad() {
18
- super.viewDidLoad()
19
-
20
- setupBackground()
21
- setupAlertView()
22
- }
23
-
24
- private func setupBackground() {
25
- view.backgroundColor = UIColor.black.withAlphaComponent(0.4)
26
- }
27
-
28
- private func setupAlertView() {
29
- let alertView = UIView()
30
- alertView.backgroundColor = UIColor(red: 28/255, green: 28/255, blue: 30/255, alpha: 1.0)
31
- alertView.layer.cornerRadius = 12
32
- alertView.translatesAutoresizingMaskIntoConstraints = false
33
- view.addSubview(alertView)
34
-
35
- // AlertView Constraints
36
- NSLayoutConstraint.activate([
37
- alertView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
38
- alertView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
39
- alertView.widthAnchor.constraint(equalToConstant: 270)
40
- ])
41
-
42
- // Title Label
43
- titleLabel.translatesAutoresizingMaskIntoConstraints = false
44
- titleLabel.textAlignment = .center
45
- titleLabel.font = UIFont.systemFont(ofSize: 18)
46
- titleLabel.numberOfLines = 0
47
- titleLabel.textColor = .white
48
- alertView.addSubview(titleLabel)
49
-
50
- // Progress Bar
51
- progressBar.translatesAutoresizingMaskIntoConstraints = false
52
- alertView.addSubview(progressBar)
53
-
54
- // Action Button
55
- actionButton.setTitle("Cancel", for: .normal)
56
- actionButton.setTitleColor(.systemPink, for: .normal)
57
- actionButton.titleLabel?.font = UIFont.systemFont(ofSize: 16)
58
- actionButton.addTarget(self, action: #selector(dismissAlert), for: .touchUpInside)
59
- actionButton.translatesAutoresizingMaskIntoConstraints = false
60
- actionButton.isHidden = true
61
- alertView.addSubview(actionButton)
62
-
63
- // Constraints for titleLabel, progressBar, and actionButton
64
- NSLayoutConstraint.activate([
65
- titleLabel.topAnchor.constraint(equalTo: alertView.topAnchor, constant: 16),
66
- titleLabel.leadingAnchor.constraint(equalTo: alertView.leadingAnchor, constant: 16),
67
- titleLabel.trailingAnchor.constraint(equalTo: alertView.trailingAnchor, constant: -16),
68
-
69
- progressBar.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),
70
- progressBar.leadingAnchor.constraint(equalTo: alertView.leadingAnchor, constant: 16),
71
- progressBar.trailingAnchor.constraint(equalTo: alertView.trailingAnchor, constant: -16),
72
-
73
- actionButton.topAnchor.constraint(equalTo: progressBar.bottomAnchor, constant: 16),
74
- actionButton.bottomAnchor.constraint(equalTo: alertView.bottomAnchor, constant: -16),
75
- actionButton.centerXAnchor.constraint(equalTo: alertView.centerXAnchor)
76
- ])
77
- }
78
-
79
- @objc private func dismissAlert() {
80
- self.onDismiss?()
81
- }
82
-
83
- func setTitle(_ text: String) {
84
- titleLabel.text = text
85
- }
86
-
87
- func setCancelTitle(_ text: String) {
88
- actionButton.setTitle(text, for: .normal)
89
- }
90
-
91
- func setProgress(_ progress: Float) {
92
- progressBar.setProgress(progress, animated: true)
93
- }
94
-
95
- func showCancelBtn() {
96
- // Ensure that the button is properly added to the view hierarchy and that the layout has been updated before hiding the button
97
- view.layoutIfNeeded()
98
- actionButton.isHidden = false
99
- }
100
- }
@@ -1,67 +0,0 @@
1
- import NitroModules
2
- import ffmpegkit
3
- import Photos
4
-
5
- class VideoTrim: HybridVideoTrimSpec {
6
-
7
- private let impl = VideoTrimImpl()
8
-
9
- public func showEditor(
10
- filePath: String,
11
- config: EditorConfig,
12
- onEvent: @escaping (_ eventName: String, _ payload: Dictionary<String, String>) -> Void
13
- ) throws {
14
- impl.showEditor(uri: filePath, editorConfig: config, onEvent: onEvent)
15
- }
16
-
17
- func listFiles() throws -> Promise<[String]> {
18
- return Promise.async {
19
- // This runs on a separate Thread, and can use `await` syntax!
20
- let files = self.impl.listFiles().map { $0.absoluteString }
21
- return files
22
- }
23
- }
24
-
25
- public func cleanFiles() throws -> Promise<Double> {
26
- return Promise.async {
27
- // This runs on a separate Thread, and can use `await` syntax!
28
- let files = self.impl.listFiles()
29
- var successCount = 0
30
- for file in files {
31
- let state = self.impl.deleteFile(url: file)
32
-
33
- if state == 0 {
34
- successCount += 1
35
- }
36
- }
37
-
38
- return Double(successCount)
39
- }
40
- }
41
-
42
- public func deleteFile(filePath: String) throws -> Promise<Bool> {
43
- return Promise.async {
44
- // This runs on a separate Thread, and can use `await` syntax!
45
- let state = self.impl.deleteFile(url: URL(string: filePath)!)
46
- return state == 0
47
- }
48
- }
49
-
50
- public func closeEditor(onComplete: @escaping () -> Void) throws {
51
- impl.closeEditor(onComplete)
52
- }
53
-
54
- public func isValidFile(url: String) throws -> Promise<FileValidationResult> {
55
- return Promise.async {
56
- // This runs on a separate Thread, and can use```` `await` syntax!
57
- return await self.impl.isValidFile(uri: url)
58
- }
59
- }
60
-
61
- func trim(url: String, options: TrimOptions) throws -> NitroModules.Promise<String> {
62
- return Promise.async {
63
- // This runs on a separate Thread, and can use```` `await` syntax!
64
- return try await self.impl.trim(url: url, options: options)
65
- }
66
- }
67
- }