Skip to content

Commit 33a22c0

Browse files
author
Luke Brandon Farrell
authored
Merge pull request #18 from Qeepsake/ph_asset_support_for_mime
fix(mime): added support for PHAsset URI ph:// to getMimeType
2 parents 8c1ce3f + 1c8f5c2 commit 33a22c0

File tree

2 files changed

+140
-100
lines changed

2 files changed

+140
-100
lines changed

README.md

+12-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ npm install @qeepsake/react-native-file-utils
1515
Gets the duration of the video in seconds.
1616

1717
```js
18-
import { getDuration } from '@qeepsake/react-native-file-utils';
18+
import { getVideoDuration } from '@qeepsake/react-native-file-utils';
1919

20-
const durationMs = await getDuration('file://<media-path>');
20+
const durationMs = await getVideoDuration('file://<media-path>');
2121
```
2222

2323
### Get the media file dimensions in pixels
@@ -52,6 +52,16 @@ import { getTimestamp } from '@qeepsake/react-native-file-utils';
5252
const timestamp = await getTimestamp('file://<media-path>', 'video');
5353
```
5454

55+
## Supported Schemes
56+
57+
In this table, you can see what type of URI can be handled by each method.
58+
59+
| Method Name | iOS | Android |
60+
| ----------- | ---------------------- | ---------- |
61+
| getTimestamp | `file://`, `assets-library://` | `file://`
62+
| getVideoDuration | `file://` | `file://`
63+
| getMimeType | `file://`, `ph://` | `file://`
64+
| getDimensions | `file://`, | `file://`
5565
## Contributing
5666

5767
See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.

ios/FileUtils.m

+128-98
Original file line numberDiff line numberDiff line change
@@ -61,105 +61,31 @@ @implementation FileUtils
6161
rejecter:(RCTPromiseRejectBlock)reject
6262
)
6363
{
64-
NSMutableDictionary *ListOfMimeTypes = [[NSMutableDictionary alloc] init];
65-
[ListOfMimeTypes setObject:@"image/jpeg" forKey:@"jpg"];
66-
[ListOfMimeTypes setObject:@"html" forKey:@"text/html"];
67-
[ListOfMimeTypes setObject:@"htm" forKey:@"text/html"];
68-
[ListOfMimeTypes setObject:@"shtml" forKey:@"text/html"];
69-
[ListOfMimeTypes setObject:@"css" forKey:@"text/css"];
70-
[ListOfMimeTypes setObject:@"xml" forKey:@"text/xml"];
71-
[ListOfMimeTypes setObject:@"gif" forKey:@"image/gif"];
72-
[ListOfMimeTypes setObject:@"jpeg" forKey:@"image/jpeg"];
73-
[ListOfMimeTypes setObject:@"jpg" forKey:@"image/jpeg"];
74-
[ListOfMimeTypes setObject:@"js" forKey:@"application/javascript"];
75-
[ListOfMimeTypes setObject:@"atom" forKey:@"application/atom+xml"];
76-
[ListOfMimeTypes setObject:@"rss" forKey:@"application/rss+xml"];
77-
[ListOfMimeTypes setObject:@"mml" forKey:@"text/mathml"];
78-
[ListOfMimeTypes setObject:@"txt" forKey:@"text/plain"];
79-
[ListOfMimeTypes setObject:@"jad" forKey:@"text/vnd.sun.j2me.app-descriptor"];
80-
[ListOfMimeTypes setObject:@"wml" forKey:@"text/vnd.wap.wml"];
81-
[ListOfMimeTypes setObject:@"htc" forKey:@"text/x-component"];
82-
[ListOfMimeTypes setObject:@"png" forKey:@"image/png"];
83-
[ListOfMimeTypes setObject:@"tif" forKey:@"image/tiff"];
84-
[ListOfMimeTypes setObject:@"tiff" forKey:@"image/tiff"];
85-
[ListOfMimeTypes setObject:@"wbmp" forKey:@"image/vnd.wap.wbmp"];
86-
[ListOfMimeTypes setObject:@"ico" forKey:@"image/x-icon"];
87-
[ListOfMimeTypes setObject:@"jng" forKey:@"image/x-jng"];
88-
[ListOfMimeTypes setObject:@"bmp" forKey:@"image/x-ms-bmp"];
89-
[ListOfMimeTypes setObject:@"svg" forKey:@"image/svg+xml"];
90-
[ListOfMimeTypes setObject:@"svgz" forKey:@"image/svg+xml"];
91-
[ListOfMimeTypes setObject:@"webp" forKey:@"image/webp"];
92-
[ListOfMimeTypes setObject:@"woff" forKey:@"application/font-woff"];
93-
[ListOfMimeTypes setObject:@"jar" forKey:@"application/java-archive"];
94-
[ListOfMimeTypes setObject:@"war" forKey:@"application/java-archive"];
95-
[ListOfMimeTypes setObject:@"ear" forKey:@"application/java-archive"];
96-
[ListOfMimeTypes setObject:@"json" forKey:@"application/json"];
97-
[ListOfMimeTypes setObject:@"hqx" forKey:@"application/mac-binhex40"];
98-
[ListOfMimeTypes setObject:@"doc" forKey:@"application/msword"];
99-
[ListOfMimeTypes setObject:@"pdf" forKey:@"application/pdf"];
100-
[ListOfMimeTypes setObject:@"ps" forKey:@"application/postscript"];
101-
[ListOfMimeTypes setObject:@"eps" forKey:@"application/postscript"];
102-
[ListOfMimeTypes setObject:@"ai" forKey:@"application/postscript"];
103-
[ListOfMimeTypes setObject:@"rtf" forKey:@"application/rtf"];
104-
[ListOfMimeTypes setObject:@"m3u8" forKey:@"application/vnd.apple.mpegurl"];
105-
[ListOfMimeTypes setObject:@"xls" forKey:@"application/vnd.ms-excel"];
106-
[ListOfMimeTypes setObject:@"eot" forKey:@"application/vnd.ms-fontobject"];
107-
[ListOfMimeTypes setObject:@"ppt" forKey:@"application/vnd.ms-powerpoint"];
108-
[ListOfMimeTypes setObject:@"wmlc" forKey:@"application/vnd.wap.wmlc"];
109-
[ListOfMimeTypes setObject:@"kml" forKey:@"application/vnd.google-earth.kml+xml"];
110-
[ListOfMimeTypes setObject:@"kmz" forKey:@"application/vnd.google-earth.kmz"];
111-
[ListOfMimeTypes setObject:@"7z" forKey:@"application/x-7z-compressed"];
112-
[ListOfMimeTypes setObject:@"cco" forKey:@"application/x-cocoa"];
113-
[ListOfMimeTypes setObject:@"jardiff" forKey:@"application/x-java-archive-diff"];
114-
[ListOfMimeTypes setObject:@"jnlp" forKey:@"application/x-java-jnlp-file"];
115-
[ListOfMimeTypes setObject:@"run" forKey:@"application/x-makeself"];
116-
[ListOfMimeTypes setObject:@"pl" forKey:@"application/x-perl"];
117-
[ListOfMimeTypes setObject:@"pm" forKey:@"application/x-perl"];
118-
[ListOfMimeTypes setObject:@"prc" forKey:@"application/x-pilot"];
119-
[ListOfMimeTypes setObject:@"pdb" forKey:@"application/x-pilot"];
120-
[ListOfMimeTypes setObject:@"rar" forKey:@"application/x-rar-compressed"];
121-
[ListOfMimeTypes setObject:@"rpm" forKey:@"application/x-redhat-package-manager"];
122-
[ListOfMimeTypes setObject:@"sea" forKey:@"application/x-sea"];
123-
[ListOfMimeTypes setObject:@"swf" forKey:@"application/x-shockwave-flash"];
124-
[ListOfMimeTypes setObject:@"sit" forKey:@"application/x-stuffit"];
125-
[ListOfMimeTypes setObject:@"tcl" forKey:@"application/x-tcl"];
126-
[ListOfMimeTypes setObject:@"tk" forKey:@"application/x-tcl"];
127-
[ListOfMimeTypes setObject:@"der" forKey:@"application/x-x509-ca-cert"];
128-
[ListOfMimeTypes setObject:@"pem" forKey:@"application/x-x509-ca-cert"];
129-
[ListOfMimeTypes setObject:@"crt" forKey:@"application/x-x509-ca-cert"];
130-
[ListOfMimeTypes setObject:@"xpi" forKey:@"application/x-xpinstall"];
131-
[ListOfMimeTypes setObject:@"xhtml" forKey:@"application/xhtml+xml"];
132-
[ListOfMimeTypes setObject:@"xspf" forKey:@"application/xspf+xml"];
133-
[ListOfMimeTypes setObject:@"zip" forKey:@"application/zip"];
134-
[ListOfMimeTypes setObject:@"epub" forKey:@"application/epub+zip"];
135-
[ListOfMimeTypes setObject:@"docx" forKey:@"application/vnd.openxmlformats-officedocument.wordprocessingml.document"];
136-
[ListOfMimeTypes setObject:@"xlsx" forKey:@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"];
137-
[ListOfMimeTypes setObject:@"pptx" forKey:@"application/vnd.openxmlformats-officedocument.presentationml.presentation"];
138-
[ListOfMimeTypes setObject:@"mid" forKey:@"audio/midi"];
139-
[ListOfMimeTypes setObject:@"midi" forKey:@"audio/midi"];
140-
[ListOfMimeTypes setObject:@"kar" forKey:@"audio/midi"];
141-
[ListOfMimeTypes setObject:@"mp3" forKey:@"audio/mpeg"];
142-
[ListOfMimeTypes setObject:@"ogg" forKey:@"audio/ogg"];
143-
[ListOfMimeTypes setObject:@"m4a" forKey:@"audio/x-m4a"];
144-
[ListOfMimeTypes setObject:@"ra" forKey:@"audio/x-realaudio"];
145-
[ListOfMimeTypes setObject:@"3gpp" forKey:@"video/3gpp"];
146-
[ListOfMimeTypes setObject:@"3gp" forKey:@"video/3gpp"];
147-
[ListOfMimeTypes setObject:@"ts" forKey:@"video/mp2t"];
148-
[ListOfMimeTypes setObject:@"mp4" forKey:@"video/mp4"];
149-
[ListOfMimeTypes setObject:@"mpeg" forKey:@"video/mpeg"];
150-
[ListOfMimeTypes setObject:@"mpg" forKey:@"video/mpeg"];
151-
[ListOfMimeTypes setObject:@"mov" forKey:@"video/quicktime"];
152-
[ListOfMimeTypes setObject:@"webm" forKey:@"video/webm"];
153-
[ListOfMimeTypes setObject:@"flv" forKey:@"video/x-flv"];
154-
[ListOfMimeTypes setObject:@"m4v" forKey:@"video/x-m4v"];
155-
[ListOfMimeTypes setObject:@"mng" forKey:@"video/x-mng"];
156-
[ListOfMimeTypes setObject:@"asx" forKey:@"video/x-ms-asf"];
157-
[ListOfMimeTypes setObject:@"asf" forKey:@"video/x-ms-asf"];
158-
[ListOfMimeTypes setObject:@"wmv" forKey:@"video/x-ms-wmv"];
159-
[ListOfMimeTypes setObject:@"avi" forKey:@"video/x-msvideo"];
64+
if([path hasPrefix:@"ph://"]){
65+
NSString *localIdentifier = [path stringByReplacingOccurrencesOfString:@"ph://" withString:@""];
66+
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil];
67+
PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc]init];
68+
[fetchResult.firstObject requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
69+
NSURL *referenceUrl = contentEditingInput.fullSizeImageURL;
70+
[self getMimeTypeFromReferenceUrl:referenceUrl resolver:resolve rejecter:reject];
71+
}];
72+
} else if([path hasPrefix:@"file://"]) {
73+
NSURL *referenceUrl = [NSURL URLWithString:path];
74+
[self getMimeTypeFromReferenceUrl:referenceUrl resolver:resolve rejecter:reject];
75+
} else {
76+
reject(
77+
@"GET_MIME_TYPE_NOT_SUPPORTED",
78+
@"The path provided is not supported. Please provide either a file:// or ph:// (PHAsset)",
79+
nil
80+
);
81+
}
82+
}
16083

161-
NSURL *referenceUrl = [NSURL URLWithString:path];
162-
CFStringRef fileExtension = (__bridge CFStringRef)[referenceUrl pathExtension];
84+
- (void) getMimeTypeFromReferenceUrl:(NSURL *)url
85+
resolver: (RCTPromiseResolveBlock)resolve
86+
rejecter:(RCTPromiseRejectBlock)reject {
87+
NSMutableDictionary *ListOfMimeTypes = [self createListOfMIMETypes];
88+
CFStringRef fileExtension = (__bridge CFStringRef)[url pathExtension];
16389
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);
16490
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
16591

@@ -179,6 +105,7 @@ @implementation FileUtils
179105
}
180106
}
181107

108+
182109
/**
183110
* Gets the original date time of the video or image file based on the path passed in. The timestamp is retrieved from the Exif data on the
184111
* image or video file. Note: Either asset-libarary path or full file path may be passed in.
@@ -298,4 +225,107 @@ @implementation FileUtils
298225
return;
299226
}
300227

228+
- (NSMutableDictionary* ) createListOfMIMETypes {
229+
NSMutableDictionary *ListOfMimeTypes = [[NSMutableDictionary alloc] init];
230+
[ListOfMimeTypes setObject:@"image/jpeg" forKey:@"jpg"];
231+
[ListOfMimeTypes setObject:@"text/html" forKey:@"html"];
232+
[ListOfMimeTypes setObject:@"text/htm" forKey:@"html"];
233+
[ListOfMimeTypes setObject:@"text/html" forKey:@"shtml"];
234+
[ListOfMimeTypes setObject:@"text/css" forKey:@"css"];
235+
[ListOfMimeTypes setObject:@"text/xml" forKey:@"xml"];
236+
[ListOfMimeTypes setObject:@"image/gif" forKey:@"gif"];
237+
[ListOfMimeTypes setObject:@"image/jpeg" forKey:@"jpeg"];
238+
[ListOfMimeTypes setObject:@"image/jpeg" forKey:@"jpg"];
239+
[ListOfMimeTypes setObject:@"image/heic" forKey:@"heic"];
240+
[ListOfMimeTypes setObject:@"image/heif" forKey:@"heif"];
241+
[ListOfMimeTypes setObject:@"application/javascript" forKey:@"js"];
242+
[ListOfMimeTypes setObject:@"application/atom+xml" forKey:@"atom"];
243+
[ListOfMimeTypes setObject:@"application/rss+xml" forKey:@"rss"];
244+
[ListOfMimeTypes setObject:@"text/mathml" forKey:@"mml"];
245+
[ListOfMimeTypes setObject:@"text/plain" forKey:@"txt"];
246+
[ListOfMimeTypes setObject:@"text/vnd.sun.j2me.app-descriptor" forKey:@"jad"];
247+
[ListOfMimeTypes setObject:@"text/vnd.wap.wml" forKey:@"wml"];
248+
[ListOfMimeTypes setObject:@"text/x-component" forKey:@"htc"];
249+
[ListOfMimeTypes setObject:@"image/png" forKey:@"png"];
250+
[ListOfMimeTypes setObject:@"image/tiff" forKey:@"tif"];
251+
[ListOfMimeTypes setObject:@"image/tiff" forKey:@"tiff"];
252+
[ListOfMimeTypes setObject:@"image/vnd.wap.wbmp" forKey:@"wbmp"];
253+
[ListOfMimeTypes setObject:@"image/x-icon" forKey:@"ico"];
254+
[ListOfMimeTypes setObject:@"image/x-jng" forKey:@"jng"];
255+
[ListOfMimeTypes setObject:@"image/x-ms-bmp" forKey:@"bmp"];
256+
[ListOfMimeTypes setObject:@"image/svg+xml" forKey:@"svg"];
257+
[ListOfMimeTypes setObject:@"image/svg+xml" forKey:@"svgz"];
258+
[ListOfMimeTypes setObject:@"image/webp" forKey:@"webp"];
259+
[ListOfMimeTypes setObject:@"application/font-woff" forKey:@"woff"];
260+
[ListOfMimeTypes setObject:@"application/java-archive" forKey:@"jar"];
261+
[ListOfMimeTypes setObject:@"application/java-archive" forKey:@"war"];
262+
[ListOfMimeTypes setObject:@"application/java-archive" forKey:@"ear"];
263+
[ListOfMimeTypes setObject:@"application/json" forKey:@"json"];
264+
[ListOfMimeTypes setObject:@"application/mac-binhex40" forKey:@"hqx"];
265+
[ListOfMimeTypes setObject:@"application/msword" forKey:@"doc"];
266+
[ListOfMimeTypes setObject:@"application/pdf" forKey:@"pdf"];
267+
[ListOfMimeTypes setObject:@"application/postscript" forKey:@"ps"];
268+
[ListOfMimeTypes setObject:@"application/postscript" forKey:@"eps"];
269+
[ListOfMimeTypes setObject:@"application/postscript" forKey:@"ai"];
270+
[ListOfMimeTypes setObject:@"application/rtf" forKey:@"rtf"];
271+
[ListOfMimeTypes setObject:@"application/vnd.apple.mpegurl" forKey:@"m3u8"];
272+
[ListOfMimeTypes setObject:@"application/vnd.ms-excel" forKey:@"xls"];
273+
[ListOfMimeTypes setObject:@"application/vnd.ms-fontobject" forKey:@"eot"];
274+
[ListOfMimeTypes setObject:@"application/vnd.ms-powerpoint" forKey:@"ppt"];
275+
[ListOfMimeTypes setObject:@"application/vnd.wap.wmlc" forKey:@"wmlc"];
276+
[ListOfMimeTypes setObject:@"application/vnd.google-earth.kml+xml" forKey:@"kml"];
277+
[ListOfMimeTypes setObject:@"application/vnd.google-earth.kmz" forKey:@"kmz"];
278+
[ListOfMimeTypes setObject:@"application/x-7z-compressed" forKey:@"7z"];
279+
[ListOfMimeTypes setObject:@"application/x-cocoa" forKey:@"cco"];
280+
[ListOfMimeTypes setObject:@"application/x-java-archive-diff" forKey:@"jardiff"];
281+
[ListOfMimeTypes setObject:@"application/x-java-jnlp-file" forKey:@"jnlp"];
282+
[ListOfMimeTypes setObject:@"application/x-makeself" forKey:@"run"];
283+
[ListOfMimeTypes setObject:@"application/x-perl" forKey:@"pl"];
284+
[ListOfMimeTypes setObject:@"application/x-perl" forKey:@"pm"];
285+
[ListOfMimeTypes setObject:@"application/x-pilot" forKey:@"prc"];
286+
[ListOfMimeTypes setObject:@"application/x-pilot" forKey:@"pdb"];
287+
[ListOfMimeTypes setObject:@"application/x-rar-compressed" forKey:@"rar"];
288+
[ListOfMimeTypes setObject:@"application/x-redhat-package-manager" forKey:@"rpm"];
289+
[ListOfMimeTypes setObject:@"application/x-sea" forKey:@"sea"];
290+
[ListOfMimeTypes setObject:@"application/x-shockwave-flash" forKey:@"swf"];
291+
[ListOfMimeTypes setObject:@"application/x-stuffit" forKey:@"sit"];
292+
[ListOfMimeTypes setObject:@"application/x-tcl" forKey:@"tcl"];
293+
[ListOfMimeTypes setObject:@"application/x-tcl" forKey:@"tk"];
294+
[ListOfMimeTypes setObject:@"application/x-x509-ca-cert" forKey:@"der"];
295+
[ListOfMimeTypes setObject:@"application/x-x509-ca-cert" forKey:@"pem"];
296+
[ListOfMimeTypes setObject:@"application/x-x509-ca-cert" forKey:@"crt"];
297+
[ListOfMimeTypes setObject:@"application/x-xpinstall" forKey:@"xpi"];
298+
[ListOfMimeTypes setObject:@"application/xhtml+xml" forKey:@"xhtml"];
299+
[ListOfMimeTypes setObject:@"application/xspf+xml" forKey:@"xspf"];
300+
[ListOfMimeTypes setObject:@"application/zip" forKey:@"zip"];
301+
[ListOfMimeTypes setObject:@"application/epub+zip" forKey:@"epub"];
302+
[ListOfMimeTypes setObject:@"application/vnd.openxmlformats-officedocument.wordprocessingml.document" forKey:@"docx"];
303+
[ListOfMimeTypes setObject:@"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" forKey:@"xlsx"];
304+
[ListOfMimeTypes setObject:@"application/vnd.openxmlformats-officedocument.presentationml.presentation" forKey:@"pptx"];
305+
[ListOfMimeTypes setObject:@"audio/midi" forKey:@"mid"];
306+
[ListOfMimeTypes setObject:@"audio/midi" forKey:@"midi"];
307+
[ListOfMimeTypes setObject:@"audio/midi" forKey:@"kar"];
308+
[ListOfMimeTypes setObject:@"audio/mpeg" forKey:@"mp3"];
309+
[ListOfMimeTypes setObject:@"audio/ogg" forKey:@"ogg"];
310+
[ListOfMimeTypes setObject:@"audio/x-m4a" forKey:@"m4a"];
311+
[ListOfMimeTypes setObject:@"audio/x-realaudio" forKey:@"ra"];
312+
[ListOfMimeTypes setObject:@"video/3gpp" forKey:@"3gpp"];
313+
[ListOfMimeTypes setObject:@"video/3gpp" forKey:@"3gp"];
314+
[ListOfMimeTypes setObject:@"video/mp2t" forKey:@"ts"];
315+
[ListOfMimeTypes setObject:@"video/mp4" forKey:@"mp4"];
316+
[ListOfMimeTypes setObject:@"video/mpeg" forKey:@"mpeg"];
317+
[ListOfMimeTypes setObject:@"video/mpeg" forKey:@"mpg"];
318+
[ListOfMimeTypes setObject:@"video/quicktime" forKey:@"mov"];
319+
[ListOfMimeTypes setObject:@"video/webm" forKey:@"webm"];
320+
[ListOfMimeTypes setObject:@"video/x-flv" forKey:@"flv"];
321+
[ListOfMimeTypes setObject:@"video/x-m4v" forKey:@"m4v"];
322+
[ListOfMimeTypes setObject:@"video/x-mng" forKey:@"mng"];
323+
[ListOfMimeTypes setObject:@"video/x-ms-asf" forKey:@"asx"];
324+
[ListOfMimeTypes setObject:@"video/x-ms-asf" forKey:@"asf"];
325+
[ListOfMimeTypes setObject:@"video/x-ms-wmv" forKey:@"wmv"];
326+
[ListOfMimeTypes setObject:@"video/x-msvideo" forKey:@"avi"];
327+
328+
return ListOfMimeTypes;
329+
}
330+
301331
@end

0 commit comments

Comments
 (0)