Fix invalid DateTimeOriginal in exif breaking DB logic

This commit is contained in:
Ming Ming 2022-07-11 22:07:42 +08:00
parent e0236e8644
commit c2cc6b5842
3 changed files with 37 additions and 18 deletions

View file

@ -1,6 +1,7 @@
import 'package:equatable/equatable.dart';
import 'package:exifdart/exifdart.dart';
import 'package:intl/intl.dart';
import 'package:logging/logging.dart';
import 'package:nc_photos/type.dart';
class Exif with EquatableMixin {
@ -96,10 +97,20 @@ class Exif with EquatableMixin {
String? get model => data["Model"];
/// 0x9003 DateTimeOriginal
DateTime? get dateTimeOriginal => data.containsKey("DateTimeOriginal") &&
(data["DateTimeOriginal"] as String).isNotEmpty
? dateTimeFormat.parse(data["DateTimeOriginal"]).toUtc()
: null;
DateTime? get dateTimeOriginal {
try {
return data.containsKey("DateTimeOriginal") &&
(data["DateTimeOriginal"] as String).isNotEmpty
? dateTimeFormat.parse(data["DateTimeOriginal"]).toUtc()
: null;
} catch (e, stackTrace) {
_log.severe(
"[dateTimeOriginal] Non standard valie: ${data["DateTimeOriginal"]}",
e,
stackTrace);
return null;
}
}
/// 0x829a ExposureTime
Rational? get exposureTime => data["ExposureTime"];
@ -127,4 +138,6 @@ class Exif with EquatableMixin {
final Map<String, dynamic> data;
static final dateTimeFormat = DateFormat("yyyy:MM:dd HH:mm:ss");
static final _log = Logger("entity.exif.Exif");
}

View file

@ -4,7 +4,6 @@ import 'package:equatable/equatable.dart';
import 'package:logging/logging.dart';
import 'package:nc_photos/account.dart';
import 'package:nc_photos/ci_string.dart';
import 'package:nc_photos/debug_util.dart';
import 'package:nc_photos/entity/exif.dart';
import 'package:nc_photos/json_util.dart' as json_util;
import 'package:nc_photos/or_null.dart';
@ -460,19 +459,11 @@ class File with EquatableMixin {
}
extension FileExtension on File {
DateTime get bestDateTime {
try {
return overrideDateTime ??
metadata?.exif?.dateTimeOriginal ??
lastModified ??
DateTime.now().toUtc();
} catch (e) {
_log.severe(
"[bestDateTime] Non standard EXIF DateTimeOriginal '${metadata?.exif?.data["DateTimeOriginal"]}' for file: ${logFilename(path)}",
e);
return lastModified ?? DateTime.now().toUtc();
}
}
DateTime get bestDateTime =>
overrideDateTime ??
metadata?.exif?.dateTimeOriginal ??
lastModified ??
DateTime.now().toUtc();
bool isOwned(CiString username) => ownerId == null || ownerId == username;

View file

@ -197,6 +197,21 @@ void main() {
[_Rational(2, 1), _Rational(3, 1), _Rational(4, 100)]);
});
});
group("dateTimeOriginal", () {
test("problematic value", () {
final exif = Exif({
"DateTimeOriginal": " ",
});
expect(exif.dateTimeOriginal, null);
});
test("empty value", () {
final exif = Exif({
"DateTimeOriginal": "",
});
expect(exif.dateTimeOriginal, null);
});
});
});
}