@lodev09/react-native-exify 0.2.0 → 0.2.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @lodev09/react-native-exify
1
+ # React Native Exify
2
2
 
3
- A simple library to read and write image Exif metadata in React Native.
3
+ A simple library to read and write image Exif metadata in React Native. Inspired from [this thread](https://github.com/mrousavy/react-native-vision-camera/issues/780).
4
4
 
5
5
  ## Features
6
6
  - Read Exif data from an image
@@ -33,15 +33,17 @@ console.log(tags)
33
33
  ```ts
34
34
  const uri = 'file://path/to/image.jpg'
35
35
  const newTags: ExifTags = {
36
- GPSLatitude: 69.696969,
37
- GPSLongitude: 69.696969,
36
+ GPSLatitude: 69.69,
37
+ GPSLongitude: 69.69,
38
38
  UserComment: 'Someone wrote GPS here!',
39
39
  }
40
40
 
41
41
  const result = await writeAsync(uri, newTags)
42
- console.log(result)
42
+ console.log(result.tags)
43
43
  ```
44
44
 
45
+ See [example](example) for more detailed usage.
46
+
45
47
  💡 Note: On IOS, writing exif into an Asset file will duplicate the image.
46
48
  Try to write to a local file first before saving!
47
49
 
@@ -87,9 +87,9 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
87
87
  dependencies {
88
88
  // For < 0.71, this will be from the local maven repo
89
89
  // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
90
- //noinspection GradleDynamicVersion
90
+ // noinspection GradleDynamicVersion
91
91
  implementation "com.facebook.react:react-native:+"
92
92
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
93
- implementation 'androidx.exifinterface:exifinterface:1.3.7'
93
+ implementation "androidx.exifinterface:exifinterface:1.3.7"
94
94
  }
95
95
 
package/ios/Exify.swift CHANGED
@@ -11,14 +11,19 @@ import PhotosUI
11
11
 
12
12
  @objc(Exify)
13
13
  class Exify: NSObject {
14
-
15
- func readFromFile(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
16
- let metadata = getMetadata(from: URL(string: uri))
17
- resolve(getExifTags(from: metadata))
14
+
15
+ func readExif(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
16
+ guard let url = URL(string: uri) else {
17
+ resolve(nil)
18
+ return
19
+ }
20
+
21
+ readExifTags(from: url) { tags in
22
+ resolve(tags)
23
+ }
18
24
  }
19
25
 
20
- func readFromAsset(uri: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
21
- let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
26
+ func readExif(assetId: String, resolve: @escaping RCTPromiseResolveBlock) -> Void {
22
27
  guard let asset = getAssetBy(id: assetId) else {
23
28
  resolve(nil)
24
29
  return
@@ -33,13 +38,13 @@ class Exify: NSObject {
33
38
  return
34
39
  }
35
40
 
36
- let metadata = getMetadata(from: url)
37
- resolve(getExifTags(from: metadata))
41
+ readExifTags(from: url) { tags in
42
+ resolve(tags)
43
+ }
38
44
  }
39
45
  }
40
46
 
41
- func writeToAsset(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
42
- let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
47
+ func writeExif(assetId: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
43
48
  guard let asset = getAssetBy(id: assetId) else {
44
49
  reject("Error", "Cannot retrieve asset.", nil)
45
50
  return
@@ -82,7 +87,7 @@ class Exify: NSObject {
82
87
  }
83
88
  }
84
89
 
85
- func writeToLocal(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
90
+ func writeExif(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
86
91
  guard let url = URL(string: uri) else {
87
92
  reject("Error", "Invalid URL", nil)
88
93
  return
@@ -114,18 +119,20 @@ class Exify: NSObject {
114
119
  @objc(readAsync:withResolver:withRejecter:)
115
120
  func readAsync(uri: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
116
121
  if uri.starts(with: "ph://") {
117
- readFromAsset(uri: uri, resolve: resolve)
122
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
123
+ readExif(assetId: assetId, resolve: resolve)
118
124
  } else {
119
- readFromFile(uri: uri, resolve: resolve)
125
+ readExif(uri: uri, resolve: resolve)
120
126
  }
121
127
  }
122
128
 
123
129
  @objc(writeAsync:withExif:withResolver:withRejecter:)
124
130
  func writeAsync(uri: String, tags: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
125
131
  if uri.starts(with: "ph://") {
126
- writeToAsset(uri: uri, tags: tags, resolve: resolve, reject: reject)
132
+ let assetId = String(uri[uri.index(uri.startIndex, offsetBy: 5)...])
133
+ writeExif(assetId: assetId, tags: tags, resolve: resolve, reject: reject)
127
134
  } else {
128
- writeToLocal(uri: uri, tags: tags, resolve: resolve, reject: reject)
135
+ writeExif(uri: uri, tags: tags, resolve: resolve, reject: reject)
129
136
  }
130
137
  }
131
138
  }
@@ -61,17 +61,23 @@ func getExifTags(from metadata: NSDictionary) -> [String: Any] {
61
61
  return tags as! [String: Any]
62
62
  }
63
63
 
64
- func getMetadata(from url: URL?) -> NSMutableDictionary {
64
+ func readExifTags(from url: URL?, completionHandler: ([String: Any]?) -> Void) -> Void {
65
65
  guard let url, let sourceImage = CGImageSourceCreateWithURL(url as CFURL, nil),
66
66
  let metadataDict = CGImageSourceCopyPropertiesAtIndex(sourceImage, 0, nil) else {
67
- return [:]
67
+ return
68
68
  }
69
69
 
70
- return NSMutableDictionary(dictionary: metadataDict)
70
+ let tags = getExifTags(from: metadataDict)
71
+ completionHandler(tags)
71
72
  }
72
73
 
73
74
  func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDictionary?, Data?) -> Void) -> Void {
74
- let metadata = getMetadata(from: url)
75
+ guard let cgImageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else {
76
+ return
77
+ }
78
+
79
+ let metadataDict = CGImageSourceCopyPropertiesAtIndex(cgImageSource, 0, nil) ?? [:] as CFDictionary
80
+ let metadata = NSMutableDictionary(dictionary: metadataDict)
75
81
 
76
82
  // Append additional Exif data
77
83
  let exifDict = metadata[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary
@@ -117,8 +123,6 @@ func updateMetadata(url: URL, with tags: [String: Any], completionHanlder: (NSDi
117
123
  let destinationData = NSMutableData()
118
124
 
119
125
  guard let uiImage = UIImage(contentsOfFile: url.path),
120
- let sourceData = uiImage.jpegData(compressionQuality: 1.0) as CFData?,
121
- let cgImageSource = CGImageSourceCreateWithData(sourceData, nil),
122
126
  let sourceType = CGImageSourceGetType(cgImageSource),
123
127
  let destination = CGImageDestinationCreateWithData(destinationData, sourceType, 1, nil) else {
124
128
  return
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodev09/react-native-exify",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Read and write exif data into an image.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -116,7 +116,12 @@
116
116
  "publish": true
117
117
  },
118
118
  "github": {
119
- "release": true
119
+ "release": true,
120
+ "comments": {
121
+ "submit": true,
122
+ "issue": ":rocket: _This issue has been resolved in v${version}. See [${releaseName}](${releaseUrl}) for release notes._",
123
+ "pr": ":rocket: _This pull request is included in v${version}. See [${releaseName}](${releaseUrl}) for release notes._"
124
+ }
120
125
  },
121
126
  "plugins": {
122
127
  "@release-it/conventional-changelog": {