|
@@ -1,5 +1,6 @@
|
|
|
import 'dart:io' as io;
|
|
|
|
|
|
+import "package:computer/computer.dart";
|
|
|
import 'package:exif/exif.dart';
|
|
|
import 'package:intl/intl.dart';
|
|
|
import 'package:logging/logging.dart';
|
|
@@ -17,11 +18,11 @@ final _logger = Logger("ExifUtil");
|
|
|
|
|
|
Future<Map<String, IfdTag>> getExif(File file) async {
|
|
|
try {
|
|
|
- final originFile = await getFile(file, isOrigin: true);
|
|
|
+ final io.File? originFile = await getFile(file, isOrigin: true);
|
|
|
if (originFile == null) {
|
|
|
throw Exception("Failed to fetch origin file");
|
|
|
}
|
|
|
- final exif = await readExifFromFile(originFile);
|
|
|
+ final exif = await readExifAsync(originFile);
|
|
|
if (!file.isRemoteFile && io.Platform.isIOS) {
|
|
|
await originFile.delete();
|
|
|
}
|
|
@@ -34,7 +35,7 @@ Future<Map<String, IfdTag>> getExif(File file) async {
|
|
|
|
|
|
Future<Map<String, IfdTag>?> getExifFromSourceFile(io.File originFile) async {
|
|
|
try {
|
|
|
- final exif = await readExifFromFile(originFile);
|
|
|
+ final exif = await readExifAsync(originFile);
|
|
|
return exif;
|
|
|
} catch (e, s) {
|
|
|
_logger.severe("failed to get exif from origin file", e, s);
|
|
@@ -48,7 +49,7 @@ Future<DateTime?> getCreationTimeFromEXIF(
|
|
|
) async {
|
|
|
try {
|
|
|
assert(file != null || exifData != null);
|
|
|
- final exif = exifData ?? await readExifFromFile(file!);
|
|
|
+ final exif = exifData ?? await readExifAsync(file!);
|
|
|
final exifTime = exif.containsKey(kDateTimeOriginal)
|
|
|
? exif[kDateTimeOriginal]!.printable
|
|
|
: exif.containsKey(kImageDateTime)
|
|
@@ -72,6 +73,18 @@ Location? locationFromExif(Map<String, IfdTag> exif) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+Future<Map<String, IfdTag>> _readExifArgs(Map<String, dynamic> args) {
|
|
|
+ return readExifFromFile(args["file"]);
|
|
|
+}
|
|
|
+
|
|
|
+Future<Map<String, IfdTag>> readExifAsync(io.File file) async {
|
|
|
+ return await Computer.shared().compute(
|
|
|
+ _readExifArgs,
|
|
|
+ param: {"file": file},
|
|
|
+ taskName: "readExifAsync",
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
GPSData _gpsDataFromExif(Map<String, IfdTag> exif) {
|
|
|
final Map<String, dynamic> exifLocationData = {
|
|
|
"lat": null,
|