feat(server): use the earliest date between file creation and modification timestamps when missing exif tags (#14874)

* feat(server): Use the earliest date between file creation and modification timestamps when missing exif tags

* PR fixes

* PR fixes

* Switch log to debug

* fix linter for min date

* apply prettier
This commit is contained in:
Chuckame
2025-01-02 05:50:15 +01:00
committed by GitHub
parent 5111ceffac
commit 3c35b467f4
2 changed files with 48 additions and 7 deletions
+14 -7
View File
@@ -450,14 +450,14 @@ export class MetadataService extends BaseService {
}
} else {
const motionAssetId = this.cryptoRepository.randomUUID();
const createdAt = asset.fileCreatedAt ?? asset.createdAt;
const dates = this.getDates(asset, tags);
motionAsset = await this.assetRepository.create({
id: motionAssetId,
libraryId: asset.libraryId,
type: AssetType.VIDEO,
fileCreatedAt: createdAt,
fileModifiedAt: asset.fileModifiedAt,
localDateTime: createdAt,
fileCreatedAt: dates.dateTimeOriginal,
fileModifiedAt: dates.modifyDate,
localDateTime: dates.localDateTime,
checksum,
ownerId: asset.ownerId,
originalPath: StorageCore.getAndroidMotionPath(asset, motionAssetId),
@@ -589,9 +589,12 @@ export class MetadataService extends BaseService {
let dateTimeOriginal = dateTime?.toDate();
let localDateTime = dateTime?.toDateTime().setZone('UTC', { keepLocalTime: true }).toJSDate();
if (!localDateTime || !dateTimeOriginal) {
this.logger.warn(`Asset ${asset.id} has no valid date, falling back to asset.fileCreatedAt`);
dateTimeOriginal = asset.fileCreatedAt;
localDateTime = asset.fileCreatedAt;
this.logger.debug(
`No valid date found in exif tags from asset ${asset.id}, falling back to earliest timestamp between file creation and file modification`,
);
const earliestDate = this.earliestDate(asset.fileModifiedAt, asset.fileCreatedAt);
dateTimeOriginal = earliestDate;
localDateTime = earliestDate;
}
this.logger.verbose(`Asset ${asset.id} has a local time of ${localDateTime.toISOString()}`);
@@ -609,6 +612,10 @@ export class MetadataService extends BaseService {
};
}
private earliestDate(a: Date, b: Date) {
return new Date(Math.min(a.valueOf(), b.valueOf()));
}
private async getGeo(tags: ImmichTags, reverseGeocoding: SystemConfig['reverseGeocoding']) {
let latitude = validate(tags.GPSLatitude);
let longitude = validate(tags.GPSLongitude);