mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-01-22 16:56:19 +01:00
65 lines
2.2 KiB
Dart
65 lines
2.2 KiB
Dart
import 'package:exifdart/exifdart.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:image_size_getter/image_size_getter.dart';
|
|
import 'package:nc_photos/account.dart';
|
|
import 'package:nc_photos/entity/file.dart';
|
|
|
|
abstract class MetadataLoader {
|
|
/// Load metadata for [file] from cache
|
|
///
|
|
/// If the file is not found in cache after a certain amount of time, an
|
|
/// exception will be thrown
|
|
Future<Map<String, dynamic>> loadCacheFile(Account account, File file);
|
|
|
|
/// Download and load metadata for [file]
|
|
///
|
|
/// This function will always try to download the file, no matter it's cached
|
|
/// or not
|
|
Future<Map<String, dynamic>> loadNewFile(Account account, File file);
|
|
|
|
/// Load metadata for [file], either from cache or a new download
|
|
Future<Map<String, dynamic>> loadFile(Account account, File file);
|
|
|
|
void cancel();
|
|
|
|
@protected
|
|
static Future<Map<String, dynamic>> loadMetadata({
|
|
AbstractBlobReader Function() exifdartReaderBuilder,
|
|
AsyncImageInput Function() imageSizeGetterInputBuilder,
|
|
}) async {
|
|
final metadata = await readMetadata(exifdartReaderBuilder());
|
|
int imageWidth, imageHeight;
|
|
if (metadata.imageWidth == null || metadata.imageHeight == null) {
|
|
final resolution =
|
|
await AsyncImageSizeGetter.getSize(imageSizeGetterInputBuilder());
|
|
// image size getter doesn't handle exif orientation
|
|
if (metadata.exif?.containsKey("Orientation") == true &&
|
|
metadata.exif["Orientation"] >= 5 &&
|
|
metadata.exif["Orientation"] <= 8) {
|
|
// 90 deg CW/CCW
|
|
imageWidth = resolution.height;
|
|
imageHeight = resolution.width;
|
|
} else {
|
|
imageWidth = resolution.width;
|
|
imageHeight = resolution.height;
|
|
}
|
|
} else {
|
|
if (metadata.rotateAngleCcw != null &&
|
|
metadata.rotateAngleCcw % 180 != 0) {
|
|
imageWidth = metadata.imageHeight;
|
|
imageHeight = metadata.imageWidth;
|
|
} else {
|
|
imageWidth = metadata.imageWidth;
|
|
imageHeight = metadata.imageHeight;
|
|
}
|
|
}
|
|
return {
|
|
if (metadata.exif != null) "exif": metadata.exif,
|
|
if (imageWidth > 0 && imageHeight > 0)
|
|
"resolution": {
|
|
"width": imageWidth,
|
|
"height": imageHeight,
|
|
},
|
|
};
|
|
}
|
|
}
|