@lodev09/react-native-exify 0.2.7 → 1.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.
- package/Exify.podspec +3 -23
- package/LICENSE +1 -1
- package/README.md +45 -18
- package/android/build.gradle +26 -53
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/lodev09/exify/ExifyModule.kt +154 -33
- package/android/src/main/java/com/lodev09/exify/ExifyPackage.kt +28 -10
- package/android/src/main/java/com/lodev09/exify/ExifyTags.kt +137 -135
- package/android/src/main/java/com/lodev09/exify/ExifyUtils.kt +31 -8
- package/ios/Exify.h +9 -0
- package/ios/Exify.mm +384 -25
- package/lib/module/index.js +12 -22
- package/lib/module/index.js.map +1 -1
- package/lib/module/package.json +1 -0
- package/lib/module/specs/NativeExifyModule.js +5 -0
- package/lib/module/specs/NativeExifyModule.js.map +1 -0
- package/lib/module/types.js +1 -1
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/index.d.ts +7 -9
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeExifyModule.d.ts +8 -0
- package/lib/typescript/src/specs/NativeExifyModule.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +2 -1
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +82 -95
- package/src/index.ts +12 -31
- package/src/specs/NativeExifyModule.ts +8 -0
- package/src/types.ts +141 -140
- package/android/gradle.properties +0 -5
- package/android/src/main/AndroidManifestNew.xml +0 -2
- package/ios/Exify-Bridging-Header.h +0 -11
- package/ios/Exify.swift +0 -134
- package/ios/ExifyUtils.swift +0 -140
- package/lib/commonjs/index.js +0 -53
- package/lib/commonjs/index.js.map +0 -1
- package/lib/commonjs/types.js +0 -2
- package/lib/commonjs/types.js.map +0 -1
package/ios/Exify.mm
CHANGED
|
@@ -1,28 +1,387 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return
|
|
1
|
+
#import "Exify.h"
|
|
2
|
+
|
|
3
|
+
static NSSet *tiffKeys;
|
|
4
|
+
|
|
5
|
+
__attribute__((constructor)) static void initTiffKeys(void) {
|
|
6
|
+
tiffKeys = [NSSet
|
|
7
|
+
setWithObjects:@"Make", @"Model", @"Software", @"DateTime", @"Artist",
|
|
8
|
+
@"Copyright", @"ImageDescription", @"Orientation",
|
|
9
|
+
@"XResolution", @"YResolution", @"ResolutionUnit",
|
|
10
|
+
@"Compression", @"PhotometricInterpretation",
|
|
11
|
+
@"TransferFunction", @"WhitePoint",
|
|
12
|
+
@"PrimaryChromaticities", @"HostComputer", nil];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#pragma mark - Helpers
|
|
16
|
+
|
|
17
|
+
static PHAsset *getAssetById(NSString *assetId) {
|
|
18
|
+
PHFetchOptions *options = [PHFetchOptions new];
|
|
19
|
+
options.includeHiddenAssets = YES;
|
|
20
|
+
options.includeAllBurstAssets = YES;
|
|
21
|
+
options.fetchLimit = 1;
|
|
22
|
+
|
|
23
|
+
PHFetchResult<PHAsset *> *result =
|
|
24
|
+
[PHAsset fetchAssetsWithLocalIdentifiers:@[ assetId ] options:options];
|
|
25
|
+
return result.firstObject;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static void addTagEntries(CFStringRef dictionary, NSDictionary *metadata,
|
|
29
|
+
NSMutableDictionary *tags) {
|
|
30
|
+
NSDictionary *entries = metadata[(__bridge NSString *)dictionary];
|
|
31
|
+
if (entries) {
|
|
32
|
+
[tags addEntriesFromDictionary:entries];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static NSDictionary *getExifTags(NSDictionary *metadata) {
|
|
37
|
+
NSMutableDictionary *tags = [NSMutableDictionary new];
|
|
38
|
+
|
|
39
|
+
NSString *compressionKey =
|
|
40
|
+
(__bridge NSString *)kCGImageDestinationLossyCompressionQuality;
|
|
41
|
+
for (NSString *key in metadata) {
|
|
42
|
+
id value = metadata[key];
|
|
43
|
+
if (![value isKindOfClass:[NSDictionary class]] &&
|
|
44
|
+
![key isEqualToString:compressionKey]) {
|
|
45
|
+
tags[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
addTagEntries(kCGImagePropertyExifDictionary, metadata, tags);
|
|
50
|
+
addTagEntries(kCGImagePropertyTIFFDictionary, metadata, tags);
|
|
51
|
+
addTagEntries(kCGImagePropertyPNGDictionary, metadata, tags);
|
|
52
|
+
|
|
53
|
+
if (@available(iOS 13.0, *)) {
|
|
54
|
+
addTagEntries(kCGImagePropertyHEICSDictionary, metadata, tags);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Prefix GPS keys with "GPS"
|
|
58
|
+
NSDictionary *gps =
|
|
59
|
+
metadata[(__bridge NSString *)kCGImagePropertyGPSDictionary];
|
|
60
|
+
if (gps) {
|
|
61
|
+
for (NSString *key in gps) {
|
|
62
|
+
tags[[@"GPS" stringByAppendingString:key]] = gps[key];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return [tags copy];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static NSDictionary *readExifTags(NSURL *url) {
|
|
70
|
+
if (!url)
|
|
71
|
+
return nil;
|
|
72
|
+
|
|
73
|
+
CGImageSourceRef source =
|
|
74
|
+
CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil);
|
|
75
|
+
if (!source)
|
|
76
|
+
return nil;
|
|
77
|
+
|
|
78
|
+
NSDictionary *metadata =
|
|
79
|
+
(__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(
|
|
80
|
+
source, 0, nil);
|
|
81
|
+
CFRelease(source);
|
|
82
|
+
|
|
83
|
+
if (!metadata)
|
|
84
|
+
return nil;
|
|
85
|
+
|
|
86
|
+
return getExifTags(metadata);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Returns @{@"metadata": NSDictionary, @"data": NSData} or nil on failure.
|
|
90
|
+
static NSDictionary *updateMetadata(NSURL *url, NSDictionary *tags) {
|
|
91
|
+
CGImageSourceRef imageSource =
|
|
92
|
+
CGImageSourceCreateWithURL((__bridge CFURLRef)url, nil);
|
|
93
|
+
if (!imageSource)
|
|
94
|
+
return nil;
|
|
95
|
+
|
|
96
|
+
CFStringRef sourceType = CGImageSourceGetType(imageSource);
|
|
97
|
+
if (!sourceType) {
|
|
98
|
+
CFRelease(imageSource);
|
|
99
|
+
return nil;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
CFDictionaryRef props =
|
|
103
|
+
CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil);
|
|
104
|
+
NSMutableDictionary *metadata =
|
|
105
|
+
props ? [NSMutableDictionary
|
|
106
|
+
dictionaryWithDictionary:(__bridge_transfer NSDictionary *)
|
|
107
|
+
props]
|
|
108
|
+
: [NSMutableDictionary new];
|
|
109
|
+
|
|
110
|
+
// Route tags into the correct sub-dictionaries
|
|
111
|
+
NSMutableDictionary *exifDict = [NSMutableDictionary
|
|
112
|
+
dictionaryWithDictionary:metadata[(__bridge NSString *)
|
|
113
|
+
kCGImagePropertyExifDictionary]
|
|
114
|
+
?: @{}];
|
|
115
|
+
NSMutableDictionary *tiffDict = [NSMutableDictionary
|
|
116
|
+
dictionaryWithDictionary:metadata[(__bridge NSString *)
|
|
117
|
+
kCGImagePropertyTIFFDictionary]
|
|
118
|
+
?: @{}];
|
|
119
|
+
NSMutableDictionary *gpsDict = [NSMutableDictionary
|
|
120
|
+
dictionaryWithDictionary:metadata[(__bridge NSString *)
|
|
121
|
+
kCGImagePropertyGPSDictionary]
|
|
122
|
+
?: @{}];
|
|
123
|
+
|
|
124
|
+
// Pre-read explicit GPS ref values so coordinate handlers can use them
|
|
125
|
+
NSString *latRef = tags[@"GPSLatitudeRef"];
|
|
126
|
+
NSString *lngRef = tags[@"GPSLongitudeRef"];
|
|
127
|
+
NSNumber *altRef = tags[@"GPSAltitudeRef"];
|
|
128
|
+
|
|
129
|
+
for (NSString *key in tags) {
|
|
130
|
+
id value = tags[key];
|
|
131
|
+
|
|
132
|
+
if ([key isEqualToString:@"GPSLatitude"]) {
|
|
133
|
+
double lat = [value doubleValue];
|
|
134
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSLatitude] = @(fabs(lat));
|
|
135
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSLatitudeRef] =
|
|
136
|
+
latRef ?: (lat >= 0 ? @"N" : @"S");
|
|
137
|
+
} else if ([key isEqualToString:@"GPSLongitude"]) {
|
|
138
|
+
double lng = [value doubleValue];
|
|
139
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSLongitude] = @(fabs(lng));
|
|
140
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSLongitudeRef] =
|
|
141
|
+
lngRef ?: (lng >= 0 ? @"E" : @"W");
|
|
142
|
+
} else if ([key isEqualToString:@"GPSAltitude"]) {
|
|
143
|
+
double alt = [value doubleValue];
|
|
144
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSAltitude] = @(fabs(alt));
|
|
145
|
+
gpsDict[(__bridge NSString *)kCGImagePropertyGPSAltitudeRef] =
|
|
146
|
+
altRef ?: @(alt >= 0 ? 0 : 1);
|
|
147
|
+
} else if ([key isEqualToString:@"GPSLatitudeRef"] ||
|
|
148
|
+
[key isEqualToString:@"GPSLongitudeRef"] ||
|
|
149
|
+
[key isEqualToString:@"GPSAltitudeRef"]) {
|
|
150
|
+
// Already handled above
|
|
151
|
+
} else if ([key hasPrefix:@"GPS"]) {
|
|
152
|
+
gpsDict[[key substringFromIndex:3]] = value;
|
|
153
|
+
} else if ([tiffKeys containsObject:key]) {
|
|
154
|
+
tiffDict[key] = value;
|
|
155
|
+
} else {
|
|
156
|
+
exifDict[key] = value;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
metadata[(__bridge NSString *)kCGImagePropertyExifDictionary] = exifDict;
|
|
161
|
+
metadata[(__bridge NSString *)kCGImagePropertyTIFFDictionary] = tiffDict;
|
|
162
|
+
metadata[(__bridge NSString *)kCGImagePropertyGPSDictionary] = gpsDict;
|
|
163
|
+
metadata[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] =
|
|
164
|
+
@(1);
|
|
165
|
+
|
|
166
|
+
// Write image with updated metadata
|
|
167
|
+
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil);
|
|
168
|
+
if (!cgImage) {
|
|
169
|
+
CFRelease(imageSource);
|
|
170
|
+
return nil;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
NSMutableData *destinationData = [NSMutableData new];
|
|
174
|
+
CGImageDestinationRef destination = CGImageDestinationCreateWithData(
|
|
175
|
+
(__bridge CFMutableDataRef)destinationData, sourceType, 1, nil);
|
|
176
|
+
|
|
177
|
+
if (!destination) {
|
|
178
|
+
CGImageRelease(cgImage);
|
|
179
|
+
CFRelease(imageSource);
|
|
180
|
+
return nil;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
CGImageDestinationAddImage(destination, cgImage,
|
|
184
|
+
(__bridge CFDictionaryRef)metadata);
|
|
185
|
+
CGImageDestinationFinalize(destination);
|
|
186
|
+
|
|
187
|
+
CFRelease(destination);
|
|
188
|
+
CGImageRelease(cgImage);
|
|
189
|
+
CFRelease(imageSource);
|
|
190
|
+
|
|
191
|
+
return @{@"metadata" : metadata, @"data" : destinationData};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#pragma mark - Exify Module
|
|
195
|
+
|
|
196
|
+
@implementation Exify
|
|
197
|
+
|
|
198
|
+
- (void)read:(NSString *)uri
|
|
199
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
200
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
201
|
+
if ([uri hasPrefix:@"ph://"]) {
|
|
202
|
+
NSString *assetId = [uri substringFromIndex:5];
|
|
203
|
+
PHAsset *asset = getAssetById(assetId);
|
|
204
|
+
if (!asset) {
|
|
205
|
+
RCTLogWarn(@"Exify: Could not retrieve asset");
|
|
206
|
+
reject(@"Error", @"Could not retrieve asset", nil);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
PHContentEditingInputRequestOptions *options =
|
|
211
|
+
[PHContentEditingInputRequestOptions new];
|
|
212
|
+
options.networkAccessAllowed = YES;
|
|
213
|
+
|
|
214
|
+
[asset requestContentEditingInputWithOptions:options
|
|
215
|
+
completionHandler:^(
|
|
216
|
+
PHContentEditingInput *contentInput,
|
|
217
|
+
NSDictionary *info) {
|
|
218
|
+
if (!contentInput ||
|
|
219
|
+
!contentInput.fullSizeImageURL) {
|
|
220
|
+
RCTLogWarn(@"Exify: Could not read asset "
|
|
221
|
+
"content");
|
|
222
|
+
reject(@"Error",
|
|
223
|
+
@"Could not read asset content", nil);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
NSDictionary *tags = readExifTags(
|
|
228
|
+
contentInput.fullSizeImageURL);
|
|
229
|
+
if (!tags) {
|
|
230
|
+
RCTLogWarn(@"Exify: Could not read metadata "
|
|
231
|
+
"from asset");
|
|
232
|
+
reject(@"Error",
|
|
233
|
+
@"Could not read metadata from asset",
|
|
234
|
+
nil);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
resolve(tags);
|
|
239
|
+
}];
|
|
240
|
+
} else {
|
|
241
|
+
if ([uri hasPrefix:@"/"] || ![uri containsString:@"://"]) {
|
|
242
|
+
RCTLogWarn(@"Exify: URI must include a scheme (e.g. file://): %@", uri);
|
|
243
|
+
reject(@"Error",
|
|
244
|
+
[NSString stringWithFormat:@"URI must include a scheme (e.g. "
|
|
245
|
+
@"file://): %@",
|
|
246
|
+
uri],
|
|
247
|
+
nil);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
NSURL *url = [NSURL URLWithString:uri];
|
|
252
|
+
if (!url) {
|
|
253
|
+
RCTLogWarn(@"Exify: Invalid URI: %@", uri);
|
|
254
|
+
reject(@"Error", [NSString stringWithFormat:@"Invalid URI: %@", uri],
|
|
255
|
+
nil);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
NSDictionary *tags = readExifTags(url);
|
|
260
|
+
if (!tags) {
|
|
261
|
+
RCTLogWarn(@"Exify: Could not read metadata from: %@", uri);
|
|
262
|
+
reject(
|
|
263
|
+
@"Error",
|
|
264
|
+
[NSString stringWithFormat:@"Could not read metadata from: %@", uri],
|
|
265
|
+
nil);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
resolve(tags);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
- (void)write:(NSString *)uri
|
|
274
|
+
tags:(NSDictionary *)tags
|
|
275
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
276
|
+
reject:(RCTPromiseRejectBlock)reject {
|
|
277
|
+
if ([uri hasPrefix:@"ph://"]) {
|
|
278
|
+
NSString *assetId = [uri substringFromIndex:5];
|
|
279
|
+
PHAsset *asset = getAssetById(assetId);
|
|
280
|
+
if (!asset) {
|
|
281
|
+
reject(@"Error", @"Cannot retrieve asset.", nil);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
PHContentEditingInputRequestOptions *options =
|
|
286
|
+
[PHContentEditingInputRequestOptions new];
|
|
287
|
+
options.networkAccessAllowed = YES;
|
|
288
|
+
|
|
289
|
+
[asset
|
|
290
|
+
requestContentEditingInputWithOptions:options
|
|
291
|
+
completionHandler:^(
|
|
292
|
+
PHContentEditingInput *contentInput,
|
|
293
|
+
NSDictionary *info) {
|
|
294
|
+
if (!contentInput ||
|
|
295
|
+
!contentInput.fullSizeImageURL) {
|
|
296
|
+
reject(@"Error",
|
|
297
|
+
@"Unable to read metadata from asset",
|
|
298
|
+
nil);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
NSDictionary *result = updateMetadata(
|
|
303
|
+
contentInput.fullSizeImageURL, tags);
|
|
304
|
+
if (!result) {
|
|
305
|
+
reject(@"Error", @"Could not update metadata",
|
|
306
|
+
nil);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
__block NSString *newAssetId = nil;
|
|
311
|
+
NSError *error = nil;
|
|
312
|
+
[[PHPhotoLibrary sharedPhotoLibrary]
|
|
313
|
+
performChangesAndWait:^{
|
|
314
|
+
PHAssetCreationRequest *request =
|
|
315
|
+
[PHAssetCreationRequest
|
|
316
|
+
creationRequestForAsset];
|
|
317
|
+
[request addResourceWithType:
|
|
318
|
+
PHAssetResourceTypePhoto
|
|
319
|
+
data:result[@"data"]
|
|
320
|
+
options:nil];
|
|
321
|
+
request.creationDate = [NSDate date];
|
|
322
|
+
newAssetId =
|
|
323
|
+
request.placeholderForCreatedAsset
|
|
324
|
+
.localIdentifier;
|
|
325
|
+
}
|
|
326
|
+
error:&error];
|
|
327
|
+
|
|
328
|
+
if (error) {
|
|
329
|
+
reject(@"Error",
|
|
330
|
+
@"Could not save to image file", error);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
resolve(@{
|
|
335
|
+
@"uri" : [NSString
|
|
336
|
+
stringWithFormat:@"ph://%@", newAssetId],
|
|
337
|
+
@"assetId" : newAssetId ?: @"",
|
|
338
|
+
@"tags" : getExifTags(result[@"metadata"]),
|
|
339
|
+
});
|
|
340
|
+
}];
|
|
341
|
+
} else {
|
|
342
|
+
if ([uri hasPrefix:@"/"] || ![uri containsString:@"://"]) {
|
|
343
|
+
RCTLogWarn(@"Exify: URI must include a scheme (e.g. file://): %@", uri);
|
|
344
|
+
reject(@"Error",
|
|
345
|
+
[NSString stringWithFormat:@"URI must include a scheme (e.g. "
|
|
346
|
+
@"file://): %@",
|
|
347
|
+
uri],
|
|
348
|
+
nil);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
NSURL *url = [NSURL URLWithString:uri];
|
|
353
|
+
if (!url) {
|
|
354
|
+
reject(@"Error", @"Invalid URL", nil);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
NSDictionary *result = updateMetadata(url, tags);
|
|
359
|
+
if (!result) {
|
|
360
|
+
reject(@"Error", @"Could not update metadata", nil);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
NSError *error = nil;
|
|
365
|
+
[result[@"data"] writeToURL:url options:NSDataWritingAtomic error:&error];
|
|
366
|
+
if (error) {
|
|
367
|
+
reject(@"Error", @"Could not save to image file", error);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
resolve(@{
|
|
372
|
+
@"uri" : uri,
|
|
373
|
+
@"tags" : getExifTags(result[@"metadata"]),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
379
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params {
|
|
380
|
+
return std::make_shared<facebook::react::NativeExifyModuleSpecJSI>(params);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
+ (NSString *)moduleName {
|
|
384
|
+
return @"Exify";
|
|
26
385
|
}
|
|
27
386
|
|
|
28
387
|
@end
|
package/lib/module/index.js
CHANGED
|
@@ -1,31 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
const LINKING_ERROR = `The package '@lodev09/react-native-exify' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
3
|
-
ios: "- You have run 'pod install'\n",
|
|
4
|
-
default: ''
|
|
5
|
-
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
6
|
-
const Exify = NativeModules.Exify ? NativeModules.Exify : new Proxy({}, {
|
|
7
|
-
get() {
|
|
8
|
-
throw new Error(LINKING_ERROR);
|
|
9
|
-
}
|
|
10
|
-
});
|
|
1
|
+
"use strict";
|
|
11
2
|
|
|
3
|
+
import Exify from "./specs/NativeExifyModule.js";
|
|
12
4
|
/**
|
|
13
|
-
*
|
|
14
|
-
* @param
|
|
15
|
-
* @param {ExifTags} tags the exif tags to be written
|
|
16
|
-
* @return {Promise<ExifyWriteResult>} the full exif tags of the image
|
|
5
|
+
* Read Exif metadata from an image.
|
|
6
|
+
* @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
|
|
17
7
|
*/
|
|
18
|
-
export function
|
|
19
|
-
return Exify.
|
|
8
|
+
export function read(uri) {
|
|
9
|
+
return Exify.read(uri);
|
|
20
10
|
}
|
|
21
11
|
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
24
|
-
* @param
|
|
25
|
-
* @
|
|
13
|
+
* Write Exif metadata into an image.
|
|
14
|
+
* @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
|
|
15
|
+
* @param tags Exif tags to write.
|
|
26
16
|
*/
|
|
27
|
-
export function
|
|
28
|
-
return Exify.
|
|
17
|
+
export function write(uri, tags) {
|
|
18
|
+
return Exify.write(uri, tags);
|
|
29
19
|
}
|
|
30
|
-
export * from
|
|
20
|
+
export * from "./types.js";
|
|
31
21
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Exify","read","uri","write","tags"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,8BAA2B;AAG7C;AACA;AACA;AACA;AACA,OAAO,SAASC,IAAIA,CAACC,GAAW,EAA4B;EAC1D,OAAOF,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,KAAKA,CAACD,GAAW,EAAEE,IAAc,EAA6B;EAC5E,OAAOJ,KAAK,CAACG,KAAK,CAACD,GAAG,EAAEE,IAAc,CAAC;AACzC;AAEA,cAAc,YAAS","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["specs/NativeExifyModule.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAOpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,OAAO,CAAC","ignoreList":[]}
|
package/lib/module/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import type { ExifTags, ExifyWriteResult } from './types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* @param
|
|
5
|
-
* @param {ExifTags} tags the exif tags to be written
|
|
6
|
-
* @return {Promise<ExifyWriteResult>} the full exif tags of the image
|
|
3
|
+
* Read Exif metadata from an image.
|
|
4
|
+
* @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
|
|
7
5
|
*/
|
|
8
|
-
export declare function
|
|
6
|
+
export declare function read(uri: string): Promise<ExifTags | null>;
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
11
|
-
* @param
|
|
12
|
-
* @
|
|
8
|
+
* Write Exif metadata into an image.
|
|
9
|
+
* @param uri Image URI with a scheme (e.g. `file://`, `ph://`, `content://`). Bare file paths are not supported.
|
|
10
|
+
* @param tags Exif tags to write.
|
|
13
11
|
*/
|
|
14
|
-
export declare function
|
|
12
|
+
export declare function write(uri: string, tags: ExifTags): Promise<ExifyWriteResult>;
|
|
15
13
|
export * from './types';
|
|
16
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5E;AAED,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
read(uri: string): Promise<Object | null>;
|
|
4
|
+
write(uri: string, tags: Object): Promise<Object>;
|
|
5
|
+
}
|
|
6
|
+
declare const _default: Spec;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=NativeExifyModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeExifyModule.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeExifyModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnD;;AAED,wBAA+D"}
|
|
@@ -63,7 +63,7 @@ export interface ExifTags {
|
|
|
63
63
|
LightSource?: number;
|
|
64
64
|
UserComment?: string;
|
|
65
65
|
GainControl?: number;
|
|
66
|
-
ISOSpeedRatings?:
|
|
66
|
+
ISOSpeedRatings?: string;
|
|
67
67
|
FocalPlaneResolutionUnit?: number;
|
|
68
68
|
FocalPlaneXResolution?: number;
|
|
69
69
|
YCbCrCoefficients?: number;
|
|
@@ -139,6 +139,7 @@ export interface ExifTags {
|
|
|
139
139
|
SubjectDistanceRange?: number;
|
|
140
140
|
XResolution?: number;
|
|
141
141
|
Software?: string;
|
|
142
|
+
HostComputer?: string;
|
|
142
143
|
[key: string]: unknown;
|
|
143
144
|
}
|
|
144
145
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,gBAAgB,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|