From 1975e7f940b2a1ccda0496e53eaae6e608f41126 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Thu, 6 Jun 2024 22:44:43 -0500 Subject: [PATCH] Add function for stripping GPS data from original files --- .vscode/settings.json | 2 ++ package.json | 1 + pnpm-lock.yaml | 56 ++++++++++++++++++++++++------------------- src/types/piexif.d.ts | 6 +++++ src/utility/exif.ts | 19 +++++++++++++++ tsconfig.json | 4 +--- 6 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 src/types/piexif.d.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index bb3ac392..920390c5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -30,6 +30,8 @@ "nanoids", "nextjs", "parameterizes", + "piexif", + "piexifjs", "presigner", "Provia", "qaub", diff --git a/package.json b/package.json index 7e48c9d3..98906589 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "next-auth": "5.0.0-beta.18", "next-themes": "^0.3.0", "pg": "^8.12.0", + "piexifjs": "^1.0.6", "postcss": "8.4.38", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96d53ed6..f07c44e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,6 +122,9 @@ importers: pg: specifier: ^8.12.0 version: 8.12.0 + piexifjs: + specifier: ^1.0.6 + version: 1.0.6 postcss: specifier: 8.4.38 version: 8.4.38 @@ -3447,6 +3450,9 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + piexifjs@1.0.6: + resolution: {integrity: sha512-0wVyH0cKohzBQ5Gi2V1BuxYpxWfxF3cSqfFXfPIpl5tl9XLS5z4ogqhUCD20AbHi0h9aJkqXNJnkVev6gwh2ag==} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4397,10 +4403,10 @@ snapshots: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/middleware-bucket-endpoint': 3.587.0 '@aws-sdk/middleware-expect-continue': 3.577.0 '@aws-sdk/middleware-flexible-checksums': 3.587.0 @@ -4455,13 +4461,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0)': + '@aws-sdk/client-sso-oidc@3.590.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -4498,7 +4504,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.590.0': @@ -4544,13 +4549,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.590.0': + '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/client-sso-oidc': 3.590.0 '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -4587,6 +4592,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.588.0': @@ -4618,14 +4624,14 @@ snapshots: '@smithy/util-stream': 3.0.1 tslib: 2.6.2 - '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0)': + '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0)) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -4636,14 +4642,14 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0)': + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0)) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -4663,10 +4669,10 @@ snapshots: '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))': + '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': dependencies: '@aws-sdk/client-sso': 3.590.0 - '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0)) + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0 @@ -4676,9 +4682,9 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0)': + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 @@ -4803,9 +4809,9 @@ snapshots: '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.590.0(@aws-sdk/client-sts@3.590.0))': + '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.590.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.590.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/client-sso-oidc': 3.590.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0 @@ -8544,6 +8550,8 @@ snapshots: picomatch@2.3.1: {} + piexifjs@1.0.6: {} + pify@2.3.0: {} pirates@4.0.6: {} diff --git a/src/types/piexif.d.ts b/src/types/piexif.d.ts new file mode 100644 index 00000000..10ad2c63 --- /dev/null +++ b/src/types/piexif.d.ts @@ -0,0 +1,6 @@ +declare module 'piexifjs' { + export function load(base64Url: string): Record + export function dump(exifObject: Record): string + export function insert(exifDataWithoutGps: string, base64Url: string): string + export function remove(exifData: string): string +} diff --git a/src/utility/exif.ts b/src/utility/exif.ts index 8760cfe5..0730ddc5 100644 --- a/src/utility/exif.ts +++ b/src/utility/exif.ts @@ -1,5 +1,6 @@ import { OrientationTypes, type ExifData } from 'ts-exif-parser'; import { formatNumberToFraction, roundToString } from './number'; +import * as PiExif from 'piexifjs'; const OFFSET_REGEX = /[+-]\d\d:\d\d/; @@ -56,3 +57,21 @@ export const formatExposureCompensation = (exposureCompensation?: number) => { return undefined; } }; + +export const removeGpsFromFile = async ( + fileBytes: ArrayBuffer +): Promise => { + const base64 = Buffer.from(fileBytes).toString('base64'); + const base64Url = `data:image/jpeg;base64,${base64}`; + + const exifObject = PiExif.load(base64Url) as Record; + delete exifObject.GPS; + const exifDataWithoutGps = PiExif.dump(exifObject); + + const data = PiExif.insert( + exifDataWithoutGps, + base64Url, + ); + + return fetch(data, { cache: 'no-store' }).then(res => res.blob()); +}; diff --git a/tsconfig.json b/tsconfig.json index f48e7ee6..72d3c462 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,10 +29,8 @@ "target": "ES2017" }, "include": [ - "next-env.d.ts", "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" + "**/*.tsx" ], "exclude": [ "node_modules"