From f1b8a7ab5474fa3364fe3a5835374b85232d1dd0 Mon Sep 17 00:00:00 2001 From: Russell Tan Date: Mon, 14 Aug 2023 18:37:17 -0700 Subject: [PATCH] fix(server): Does not assign lat/lon if they are at 0,0 #2991 (#3669) * fix(server): Does not assign lat/lon if they are at 0,0 #2991 * Adds migration file to fix null island rows * Removed down migration * Leave empty down function --- .../migrations/1692057328660-fixGPSNullIsland.ts | 13 +++++++++++++ .../processors/metadata-extraction.processor.ts | 12 ++++++++++-- .../microservices/utils/exif/coordinates.spec.ts | 12 ++++++++++++ server/src/microservices/utils/exif/coordinates.ts | 11 +++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 server/src/infra/migrations/1692057328660-fixGPSNullIsland.ts diff --git a/server/src/infra/migrations/1692057328660-fixGPSNullIsland.ts b/server/src/infra/migrations/1692057328660-fixGPSNullIsland.ts new file mode 100644 index 0000000000..74dc40a474 --- /dev/null +++ b/server/src/infra/migrations/1692057328660-fixGPSNullIsland.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from "typeorm" + +export class FixGPSNullIsland1692057328660 implements MigrationInterface { + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`UPDATE "exif" SET latitude = NULL, longitude = NULL WHERE latitude = 0 AND longitude = 0;`); + } + + public async down(): Promise { + // Setting lat,lon to 0 not necessary + } + +} diff --git a/server/src/microservices/processors/metadata-extraction.processor.ts b/server/src/microservices/processors/metadata-extraction.processor.ts index a37ee6a23a..a5f3ed4dd3 100644 --- a/server/src/microservices/processors/metadata-extraction.processor.ts +++ b/server/src/microservices/processors/metadata-extraction.processor.ts @@ -308,8 +308,16 @@ export class MetadataExtractionProcessor { const latitude = getExifProperty('GPSLatitude'); const longitude = getExifProperty('GPSLongitude'); - newExif.latitude = latitude !== null ? parseLatitude(latitude) : null; - newExif.longitude = longitude !== null ? parseLongitude(longitude) : null; + const lat = parseLatitude(latitude); + const lon = parseLongitude(longitude); + + if (lat === 0 && lon === 0) { + this.logger.warn(`Latitude & Longitude were on Null Island (${lat},${lon}), not assigning coordinates`); + } else { + newExif.latitude = lat; + newExif.longitude = lon; + } + if (getExifProperty('MotionPhoto')) { // Seen on more recent Pixel phones: starting as early as Pixel 4a, possibly earlier. const rawDirectory = getExifProperty('Directory'); diff --git a/server/src/microservices/utils/exif/coordinates.spec.ts b/server/src/microservices/utils/exif/coordinates.spec.ts index 975d1e9969..223a7671ec 100644 --- a/server/src/microservices/utils/exif/coordinates.spec.ts +++ b/server/src/microservices/utils/exif/coordinates.spec.ts @@ -23,6 +23,12 @@ describe('parsing latitude from string input', () => { }); }); +describe('parsing latitude from null input', () => { + it('returns null for null input', () => { + expect(parseLatitude(null)).toBeNull(); + }); +}); + describe('parsing longitude from string input', () => { it('returns null for invalid inputs', () => { expect(parseLongitude('')).toBeNull(); @@ -44,3 +50,9 @@ describe('parsing longitude from string input', () => { expect(parseLongitude('-0.0')).toBeCloseTo(-0.0); }); }); + +describe('parsing longitude from null input', () => { + it('returns null for null input', () => { + expect(parseLongitude(null)).toBeNull(); + }); +}); diff --git a/server/src/microservices/utils/exif/coordinates.ts b/server/src/microservices/utils/exif/coordinates.ts index 3a07b0c173..03aeb17f09 100644 --- a/server/src/microservices/utils/exif/coordinates.ts +++ b/server/src/microservices/utils/exif/coordinates.ts @@ -1,6 +1,9 @@ import { isNumberInRange } from '../numbers'; -export function parseLatitude(input: string | number): number | null { +export function parseLatitude(input: string | number | null): number | null { + if (input === null) { + return null; + } const latitude = typeof input === 'string' ? Number.parseFloat(input) : input; if (isNumberInRange(latitude, -90, 90)) { @@ -9,7 +12,11 @@ export function parseLatitude(input: string | number): number | null { return null; } -export function parseLongitude(input: string | number): number | null { +export function parseLongitude(input: string | number | null): number | null { + if (input === null) { + return null; + } + const longitude = typeof input === 'string' ? Number.parseFloat(input) : input; if (isNumberInRange(longitude, -180, 180)) {