react-native-video-trim 3.0.10 → 4.0.0

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 (87) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +46 -57
  3. package/VideoTrim.podspec +24 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +76 -51
  6. package/android/gradle.properties +5 -5
  7. package/android/src/main/AndroidManifest.xml +4 -2
  8. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  9. package/android/src/main/java/com/margelo/nitro/videotrim/VideoTrim.kt +629 -0
  10. package/android/src/main/java/com/margelo/nitro/videotrim/VideoTrimPackage.kt +22 -0
  11. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/enums/ErrorCode.java +1 -1
  12. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/interfaces/IVideoTrimmerView.java +1 -1
  13. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/interfaces/VideoTrimListener.java +6 -5
  14. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/MediaMetadataUtil.java +1 -1
  15. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/StorageUtil.java +3 -1
  16. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/VideoTrimmerUtil.java +22 -20
  17. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/widgets/VideoTrimmerView.java +38 -66
  18. package/ios/AssetLoader.swift +2 -2
  19. package/ios/ErrorCode.swift +2 -2
  20. package/ios/ProgressAlertController.swift +2 -2
  21. package/ios/VideoTrim.swift +48 -838
  22. package/ios/VideoTrimImpl.swift +860 -0
  23. package/ios/VideoTrimmer.swift +2 -3
  24. package/ios/VideoTrimmerThumb.swift +33 -26
  25. package/ios/VideoTrimmerViewController.swift +47 -28
  26. package/lib/module/VideoTrim.nitro.js +4 -0
  27. package/lib/module/VideoTrim.nitro.js.map +1 -0
  28. package/lib/module/index.js +71 -22
  29. package/lib/module/index.js.map +1 -1
  30. package/lib/module/package.json +1 -0
  31. package/lib/typescript/package.json +1 -0
  32. package/lib/typescript/{index.d.ts → src/VideoTrim.nitro.d.ts} +63 -89
  33. package/lib/typescript/src/VideoTrim.nitro.d.ts.map +1 -0
  34. package/lib/typescript/src/index.d.ts +41 -0
  35. package/lib/typescript/src/index.d.ts.map +1 -0
  36. package/nitrogen/generated/android/c++/JEditorConfig.hpp +229 -0
  37. package/nitrogen/generated/android/c++/JFileValidationResult.hpp +61 -0
  38. package/nitrogen/generated/android/c++/JFunc_void.hpp +74 -0
  39. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__unordered_map_std__string__std__string_.hpp +89 -0
  40. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.cpp +131 -0
  41. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.hpp +67 -0
  42. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/EditorConfig.kt +70 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/FileValidationResult.kt +28 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void.kt +80 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void_std__string_std__unordered_map_std__string__std__string_.kt +80 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/HybridVideoTrimSpec.kt +82 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/videotrimOnLoad.kt +35 -0
  48. package/nitrogen/generated/android/videotrim+autolinking.cmake +78 -0
  49. package/nitrogen/generated/android/videotrim+autolinking.gradle +27 -0
  50. package/nitrogen/generated/android/videotrimOnLoad.cpp +50 -0
  51. package/nitrogen/generated/android/videotrimOnLoad.hpp +25 -0
  52. package/nitrogen/generated/ios/VideoTrim+autolinking.rb +60 -0
  53. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.cpp +88 -0
  54. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.hpp +331 -0
  55. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Umbrella.hpp +53 -0
  56. package/nitrogen/generated/ios/VideoTrimAutolinking.mm +33 -0
  57. package/nitrogen/generated/ios/VideoTrimAutolinking.swift +25 -0
  58. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.cpp +11 -0
  59. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.hpp +116 -0
  60. package/nitrogen/generated/ios/swift/EditorConfig.swift +519 -0
  61. package/nitrogen/generated/ios/swift/FileValidationResult.swift +57 -0
  62. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  63. package/nitrogen/generated/ios/swift/Func_void_FileValidationResult.swift +46 -0
  64. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  65. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  66. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  67. package/nitrogen/generated/ios/swift/Func_void_std__string_std__unordered_map_std__string__std__string_.swift +54 -0
  68. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +46 -0
  69. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec.swift +53 -0
  70. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec_cxx.swift +222 -0
  71. package/nitrogen/generated/shared/c++/EditorConfig.hpp +245 -0
  72. package/nitrogen/generated/shared/c++/FileValidationResult.hpp +77 -0
  73. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.cpp +26 -0
  74. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.hpp +76 -0
  75. package/package.json +75 -71
  76. package/src/VideoTrim.nitro.ts +244 -0
  77. package/src/index.tsx +87 -258
  78. package/android/src/main/AndroidManifestDeprecated.xml +0 -3
  79. package/android/src/main/java/com/videotrim/VideoTrimModule.java +0 -603
  80. package/android/src/main/java/com/videotrim/VideoTrimPackage.java +0 -28
  81. package/ios/VideoTrim-Bridging-Header.h +0 -2
  82. package/ios/VideoTrim.mm +0 -17
  83. package/ios/VideoTrim.xcodeproj/project.pbxproj +0 -283
  84. package/lib/commonjs/index.js +0 -87
  85. package/lib/commonjs/index.js.map +0 -1
  86. package/lib/typescript/index.d.ts.map +0 -1
  87. package/react-native-video-trim.podspec +0 -43
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Mai Trung Duc
3
+ Copyright (c) 2025 Mai Trung Duc
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
6
6
  in the Software without restriction, including without limitation the rights
package/README.md CHANGED
@@ -1,3 +1,26 @@
1
+ - [Installation](#installation)
2
+ * [For iOS (React Native CLI project)](#for-ios-react-native-cli-project)
3
+ * [For Expo project](#for-expo-project)
4
+ * [Usage](#usage)
5
+ - [Methods](#methods)
6
+ * [showEditor(videoPath: string, config?: EditorConfig, onEvent?: (eventName: string, payload: Record<string, string>) => void)](#showeditorvideopath-string-config-editorconfig-onevent-eventname-string-payload-record--void)
7
+ * [isValidFile(videoPath: string)](#isvalidfilevideopath-string)
8
+ * [closeEditor()](#closeeditor)
9
+ * [listFiles()](#listfiles)
10
+ * [cleanFiles()](#cleanfiles)
11
+ * [deleteFile()](#deletefile)
12
+ - [Callbacks (New arch)](#callbacks-new-arch)
13
+ * [showEditor](#showeditor)
14
+ * [closeEditor](#closeeditor-1)
15
+ - [Events (Old arch)](#events-old-arch)
16
+ - [Audio support](#audio-support)
17
+ - [Cancel trimming](#cancel-trimming)
18
+ - [Fail to load media](#fail-to-load-media)
19
+ - [Android: update SDK version](#android-update-sdk-version)
20
+ - [Thanks](#thanks)
21
+
22
+ <!-- TOC end -->
23
+
1
24
  # React Native Video Trim
2
25
  <div align="center">
3
26
  <h2>Video trimmer for your React Native app</h2>
@@ -19,7 +42,7 @@
19
42
  <img src="images/share_sheet.png" width="300" />
20
43
  </div>
21
44
 
22
- ## Installation
45
+ # Installation
23
46
 
24
47
  ```sh
25
48
  # new arch
@@ -36,6 +59,9 @@ yarn add react-native-video-trim react-native-nitro-modules
36
59
  # old arch
37
60
  yarn add react-native-video-trim@^3.0.0
38
61
  ```
62
+
63
+ > `react-native-nitro-modules` is required in New Arch as this library relies on [Nitro Modules](https://nitro.margelo.com/).
64
+
39
65
  ## For iOS (React Native CLI project)
40
66
  Run the following command to setup for iOS:
41
67
  ```
@@ -79,62 +105,8 @@ import {
79
105
  } from 'react-native';
80
106
  import { isValidFile, showEditor } from 'react-native-video-trim';
81
107
  import { launchImageLibrary } from 'react-native-image-picker';
82
- import { useEffect } from 'react';
83
108
 
84
109
  export default function App() {
85
- useEffect(() => {
86
- const eventEmitter = new NativeEventEmitter(NativeModules.VideoTrim);
87
- const subscription = eventEmitter.addListener('VideoTrim', (event) => {
88
- switch (event.name) {
89
- case 'onLoad': {
90
- // on media loaded successfully
91
- console.log('onLoadListener', event);
92
- break;
93
- }
94
- case 'onShow': {
95
- console.log('onShowListener', event);
96
- break;
97
- }
98
- case 'onHide': {
99
- console.log('onHide', event);
100
- break;
101
- }
102
- case 'onStartTrimming': {
103
- console.log('onStartTrimming', event);
104
- break;
105
- }
106
- case 'onFinishTrimming': {
107
- console.log('onFinishTrimming', event);
108
- break;
109
- }
110
- case 'onCancelTrimming': {
111
- console.log('onCancelTrimming', event);
112
- break;
113
- }
114
- case 'onCancel': {
115
- console.log('onCancel', event);
116
- break;
117
- }
118
- case 'onError': {
119
- console.log('onError', event);
120
- break;
121
- }
122
- case 'onLog': {
123
- console.log('onLog', event);
124
- break;
125
- }
126
- case 'onStatistics': {
127
- console.log('onStatistics', event);
128
- break;
129
- }
130
- }
131
- });
132
-
133
- return () => {
134
- subscription.remove();
135
- };
136
- }, []);
137
-
138
110
  return (
139
111
  <View style={styles.container}>
140
112
  <TouchableOpacity
@@ -150,7 +122,11 @@ export default function App() {
150
122
 
151
123
  showEditor(result.assets![0]?.uri || '', {
152
124
  maxDuration: 20,
153
- });
125
+ },
126
+ (eventName, payload) => {
127
+ console.log('Event:', eventName, 'Payload:', payload);
128
+ }
129
+ );
154
130
  }}
155
131
  style={{ padding: 10, backgroundColor: 'red' }}
156
132
  >
@@ -183,7 +159,7 @@ const styles = StyleSheet.create({
183
159
 
184
160
  # Methods
185
161
 
186
- ## showEditor(videoPath: string, config?: EditorConfig)
162
+ ## showEditor(videoPath: string, config?: EditorConfig, onEvent?: (eventName: string, payload: Record<string, string>) => void)
187
163
  Main method to show Video Editor UI.
188
164
 
189
165
  *Params*:
@@ -286,8 +262,21 @@ Delete a file in app storage. Return `true` if success
286
262
 
287
263
  ## showEditor
288
264
 
265
+ ```ts
266
+ showEditor('file', config, (eventName, payload) => {
267
+ console.log(eventName, payload)
268
+ })
269
+ ```
270
+
289
271
  ## closeEditor
290
272
 
273
+ ```ts
274
+ closeEditor(() => {
275
+ console.log('Editor closed')
276
+ })
277
+ ```
278
+
279
+
291
280
  # Events (Old arch)
292
281
  To listen for events you interest, do the following:
293
282
  ```js
@@ -0,0 +1,24 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "VideoTrim"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => "https://github.com/maitrungduc1410/react-native-video-trim.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
+
18
+ s.dependency 'ffmpeg-mobile-min', '~> 6.0'
19
+
20
+ load 'nitrogen/generated/ios/VideoTrim+autolinking.rb'
21
+ add_nitrogen_files(s)
22
+
23
+ install_modules_dependencies(s)
24
+ end
@@ -0,0 +1,24 @@
1
+ project(videotrim)
2
+ cmake_minimum_required(VERSION 3.9.0)
3
+
4
+ set(PACKAGE_NAME videotrim)
5
+ set(CMAKE_VERBOSE_MAKEFILE ON)
6
+ set(CMAKE_CXX_STANDARD 20)
7
+
8
+ # Define C++ library and add all sources
9
+ add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp)
10
+
11
+ # Add Nitrogen specs :)
12
+ include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/videotrim+autolinking.cmake)
13
+
14
+ # Set up local includes
15
+ include_directories("src/main/cpp" "../cpp")
16
+
17
+ find_library(LOG_LIB log)
18
+
19
+ # Link all libraries together
20
+ target_link_libraries(
21
+ ${PACKAGE_NAME}
22
+ ${LOG_LIB}
23
+ android # <-- Android core
24
+ )
@@ -1,70 +1,94 @@
1
1
  buildscript {
2
+ ext.getExtOrDefault = {name ->
3
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['VideoTrim_' + name]
4
+ }
5
+
2
6
  repositories {
3
7
  google()
4
8
  mavenCentral()
5
9
  }
6
10
 
7
11
  dependencies {
8
- classpath "com.android.tools.build:gradle:7.2.1"
12
+ classpath "com.android.tools.build:gradle:8.7.2"
13
+ // noinspection DifferentKotlinGradleVersion
14
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
9
15
  }
10
16
  }
11
17
 
12
- def isNewArchitectureEnabled() {
13
- return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
18
+ def reactNativeArchitectures() {
19
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
20
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
14
21
  }
15
22
 
16
23
  apply plugin: "com.android.library"
24
+ apply plugin: "kotlin-android"
25
+ apply from: '../nitrogen/generated/android/videotrim+autolinking.gradle'
17
26
 
18
-
19
- def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') }
20
-
21
- if (isNewArchitectureEnabled()) {
22
- apply plugin: "com.facebook.react"
23
- }
24
-
25
- def getExtOrDefault(name) {
26
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["VideoTrim_" + name]
27
- }
27
+ apply plugin: "com.facebook.react"
28
28
 
29
29
  def getExtOrIntegerDefault(name) {
30
30
  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["VideoTrim_" + name]).toInteger()
31
31
  }
32
32
 
33
- def supportsNamespace() {
34
- def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
35
- def major = parsed[0].toInteger()
36
- def minor = parsed[1].toInteger()
37
-
38
- // Namespace support was added in 7.3.0
39
- if (major == 7 && minor >= 3) {
40
- return true
41
- }
33
+ android {
34
+ namespace "com.margelo.nitro.videotrim"
42
35
 
43
- return major >= 8
44
- }
36
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
45
37
 
46
- def safeExtGet(String prop, String fallback) {
47
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
48
- }
38
+ defaultConfig {
39
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
40
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
49
41
 
50
- android {
51
- if (supportsNamespace()) {
52
- namespace "com.videotrim"
53
- } else {
54
- sourceSets {
55
- main {
56
- manifest.srcFile "src/main/AndroidManifestDeprecated.xml"
42
+ externalNativeBuild {
43
+ cmake {
44
+ cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
45
+ arguments "-DANDROID_STL=c++_shared"
46
+ abiFilters (*reactNativeArchitectures())
47
+
48
+ buildTypes {
49
+ debug {
50
+ cppFlags "-O1 -g"
51
+ }
52
+ release {
53
+ cppFlags "-O2"
54
+ }
55
+ }
57
56
  }
58
57
  }
59
58
  }
60
59
 
61
- compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
60
+ externalNativeBuild {
61
+ cmake {
62
+ path "CMakeLists.txt"
63
+ }
64
+ }
62
65
 
63
- defaultConfig {
64
- minSdkVersion getExtOrIntegerDefault("minSdkVersion")
65
- targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
66
- buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
66
+ packagingOptions {
67
+ excludes = [
68
+ "META-INF",
69
+ "META-INF/**",
70
+ "**/libc++_shared.so",
71
+ "**/libfbjni.so",
72
+ "**/libjsi.so",
73
+ "**/libfolly_json.so",
74
+ "**/libfolly_runtime.so",
75
+ "**/libglog.so",
76
+ "**/libhermes.so",
77
+ "**/libhermes-executor-debug.so",
78
+ "**/libhermes_executor.so",
79
+ "**/libreactnative.so",
80
+ "**/libreactnativejni.so",
81
+ "**/libturbomodulejsijni.so",
82
+ "**/libreact_nativemodule_core.so",
83
+ "**/libjscexecutor.so"
84
+ ]
67
85
  }
86
+
87
+ buildFeatures {
88
+ buildConfig true
89
+ prefab true
90
+ }
91
+
68
92
  buildTypes {
69
93
  release {
70
94
  minifyEnabled false
@@ -80,6 +104,14 @@ android {
80
104
  targetCompatibility JavaVersion.VERSION_1_8
81
105
  }
82
106
 
107
+ sourceSets {
108
+ main {
109
+ java.srcDirs += [
110
+ "generated/java",
111
+ "generated/jni"
112
+ ]
113
+ }
114
+ }
83
115
  }
84
116
 
85
117
  repositories {
@@ -87,20 +119,13 @@ repositories {
87
119
  google()
88
120
  }
89
121
 
122
+ def kotlin_version = getExtOrDefault("kotlinVersion")
90
123
 
91
124
  dependencies {
92
- // For < 0.71, this will be from the local maven repo
93
- // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
94
- //noinspection GradleDynamicVersion
95
- implementation "com.facebook.react:react-native:+"
96
- implementation 'androidx.recyclerview:recyclerview:1.3.1'
125
+ implementation "com.facebook.react:react-android"
126
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
127
+ implementation project(":react-native-nitro-modules")
128
+
97
129
  implementation 'io.github.maitrungduc1410:ffmpeg-kit-min:6.0.0'
98
130
  }
99
131
 
100
- if (isNewArchitectureEnabled()) {
101
- react {
102
- jsRootDir = file("../src/")
103
- libraryName = "VideoTrim"
104
- codegenJavaPackageName = "com.videotrim"
105
- }
106
- }
@@ -1,5 +1,5 @@
1
- VideoTrim_kotlinVersion=1.7.0
2
- VideoTrim_minSdkVersion=21
3
- VideoTrim_targetSdkVersion=31
4
- VideoTrim_compileSdkVersion=31
5
- VideoTrim_ndkversion=21.4.7075529
1
+ VideoTrim_kotlinVersion=2.0.21
2
+ VideoTrim_minSdkVersion=24
3
+ VideoTrim_targetSdkVersion=34
4
+ VideoTrim_compileSdkVersion=35
5
+ VideoTrim_ndkVersion=27.1.12297006
@@ -1,6 +1,8 @@
1
- <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.videotrim">
1
+ <manifest
2
+ xmlns:android="http://schemas.android.com/apk/res/android"
3
+ package="com.margelo.nitro.videotrim">
2
4
 
3
- <uses-permission android:name="android.permission.VIBRATE" />
5
+ <uses-permission android:name="android.permission.VIBRATE" />
4
6
 
5
7
  <application>
6
8
  <!-- FileProvider setup -->
@@ -0,0 +1,6 @@
1
+ #include <jni.h>
2
+ #include "videotrimOnLoad.hpp"
3
+
4
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
5
+ return margelo::nitro::videotrim::initialize(vm);
6
+ }