Преглед на файлове

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
Russell Tan преди 1 година
родител
ревизия
f1b8a7ab54

+ 13 - 0
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<void> {
+        await queryRunner.query(`UPDATE "exif" SET latitude = NULL, longitude = NULL WHERE latitude = 0 AND longitude = 0;`);
+    }
+
+    public async down(): Promise<void> {
+        // Setting lat,lon to 0 not necessary
+    }
+
+}

+ 10 - 2
server/src/microservices/processors/metadata-extraction.processor.ts

@@ -308,8 +308,16 @@ export class MetadataExtractionProcessor {
 
 
     const latitude = getExifProperty('GPSLatitude');
     const latitude = getExifProperty('GPSLatitude');
     const longitude = getExifProperty('GPSLongitude');
     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')) {
     if (getExifProperty('MotionPhoto')) {
       // Seen on more recent Pixel phones: starting as early as Pixel 4a, possibly earlier.
       // Seen on more recent Pixel phones: starting as early as Pixel 4a, possibly earlier.
       const rawDirectory = getExifProperty('Directory');
       const rawDirectory = getExifProperty('Directory');

+ 12 - 0
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', () => {
 describe('parsing longitude from string input', () => {
   it('returns null for invalid inputs', () => {
   it('returns null for invalid inputs', () => {
     expect(parseLongitude('')).toBeNull();
     expect(parseLongitude('')).toBeNull();
@@ -44,3 +50,9 @@ describe('parsing longitude from string input', () => {
     expect(parseLongitude('-0.0')).toBeCloseTo(-0.0);
     expect(parseLongitude('-0.0')).toBeCloseTo(-0.0);
   });
   });
 });
 });
+
+describe('parsing longitude from null input', () => {
+  it('returns null for null input', () => {
+    expect(parseLongitude(null)).toBeNull();
+  });
+});

+ 9 - 2
server/src/microservices/utils/exif/coordinates.ts

@@ -1,6 +1,9 @@
 import { isNumberInRange } from '../numbers';
 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;
   const latitude = typeof input === 'string' ? Number.parseFloat(input) : input;
 
 
   if (isNumberInRange(latitude, -90, 90)) {
   if (isNumberInRange(latitude, -90, 90)) {
@@ -9,7 +12,11 @@ export function parseLatitude(input: string | number): number | null {
   return 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;
   const longitude = typeof input === 'string' ? Number.parseFloat(input) : input;
 
 
   if (isNumberInRange(longitude, -180, 180)) {
   if (isNumberInRange(longitude, -180, 180)) {