Add function for stripping GPS data from original files

This commit is contained in:
Sam Becker 2024-06-06 22:44:43 -05:00
parent 701055a35b
commit 1975e7f940
6 changed files with 61 additions and 27 deletions

View File

@ -30,6 +30,8 @@
"nanoids",
"nextjs",
"parameterizes",
"piexif",
"piexifjs",
"presigner",
"Provia",
"qaub",

View File

@ -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",

56
pnpm-lock.yaml generated
View File

@ -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: {}

6
src/types/piexif.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
declare module 'piexifjs' {
export function load(base64Url: string): Record<string, any>
export function dump(exifObject: Record<string, any>): string
export function insert(exifDataWithoutGps: string, base64Url: string): string
export function remove(exifData: string): string
}

View File

@ -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<Blob> => {
const base64 = Buffer.from(fileBytes).toString('base64');
const base64Url = `data:image/jpeg;base64,${base64}`;
const exifObject = PiExif.load(base64Url) as Record<string, any>;
delete exifObject.GPS;
const exifDataWithoutGps = PiExif.dump(exifObject);
const data = PiExif.insert(
exifDataWithoutGps,
base64Url,
);
return fetch(data, { cache: 'no-store' }).then(res => res.blob());
};

View File

@ -29,10 +29,8 @@
"target": "ES2017"
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
"**/*.tsx"
],
"exclude": [
"node_modules"