bake in python
This commit is contained in:
parent
050905a0f2
commit
9c88d0791f
@ -29,36 +29,18 @@ COPY . .
|
|||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
|
|
||||||
# === Python pytorch ultralytics stage ===
|
|
||||||
FROM python:3 AS pystuff
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Create a virtual environment for Python deps
|
|
||||||
# we use this venv to transfer built artifacts between Docker image layers
|
|
||||||
RUN python -m venv /app/venv
|
|
||||||
ENV PATH="/app/venv/bin:$PATH"
|
|
||||||
RUN . /app/venv/bin/activate
|
|
||||||
|
|
||||||
# COPY requirements.txt .
|
|
||||||
|
|
||||||
# Install python deps
|
|
||||||
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
||||||
python3 -m pip install uv && \
|
|
||||||
uv pip install torch --index-url https://download.pytorch.org/whl/cpu && \
|
|
||||||
uv pip install ultralytics && \
|
|
||||||
uv pip install vcsi
|
|
||||||
|
|
||||||
# we are avoiding installing using requirements.txt file because doing so with ultralytics would install 7GB worth of unecessary dependencies.
|
# we are avoiding installing using requirements.txt file because doing so with ultralytics would install 7GB worth of unecessary dependencies.
|
||||||
|
|
||||||
|
|
||||||
# === Runtime stage ===
|
# === Runtime stage ===
|
||||||
FROM node:22-slim
|
FROM node:22-slim AS release
|
||||||
|
|
||||||
# Set working directory
|
# Set working directory
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV PATH="/app/venv/bin:$PATH"
|
ENV PATH="/app/venv/bin:$PATH"
|
||||||
|
|
||||||
|
|
||||||
# Install only runtime dependencies
|
# Install only runtime dependencies
|
||||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
@ -66,9 +48,22 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
|
python3 \
|
||||||
|
python3-venv \
|
||||||
wget \
|
wget \
|
||||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN python3 -m venv /app/venv
|
||||||
|
|
||||||
|
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||||
|
python3 -m pip install uv && \
|
||||||
|
uv pip install torch --index-url https://download.pytorch.org/whl/cpu && \
|
||||||
|
uv pip install ultralytics && \
|
||||||
|
uv pip install vcsi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Install Shaka Packager
|
# Install Shaka Packager
|
||||||
RUN wget -q https://github.com/shaka-project/shaka-packager/releases/download/v3.4.2/packager-linux-x64 \
|
RUN wget -q https://github.com/shaka-project/shaka-packager/releases/download/v3.4.2/packager-linux-x64 \
|
||||||
-O /usr/local/bin/packager \
|
-O /usr/local/bin/packager \
|
||||||
@ -101,7 +96,8 @@ COPY --from=builder /app/generated ./generated
|
|||||||
COPY --from=builder /app/src ./src
|
COPY --from=builder /app/src ./src
|
||||||
COPY --from=builder /app/graphile.config.ts ./graphile.config.ts
|
COPY --from=builder /app/graphile.config.ts ./graphile.config.ts
|
||||||
COPY --from=builder /app/crontab ./crontab
|
COPY --from=builder /app/crontab ./crontab
|
||||||
COPY --from=pystuff /app/venv /app/venv
|
|
||||||
|
RUN . /app/venv/bin/activate
|
||||||
|
|
||||||
# Expose the port
|
# Expose the port
|
||||||
EXPOSE 5000
|
EXPOSE 5000
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
// build.mjs
|
/**
|
||||||
|
* build.mjs
|
||||||
|
*
|
||||||
|
* This bundles the javascript client. Only the JS client is handled here.
|
||||||
|
*
|
||||||
|
* we use two entrypoints, used by various pages. index.js is for every page, while vod.js is only for /vods/* pages.
|
||||||
|
*/
|
||||||
import esbuild from "esbuild";
|
import esbuild from "esbuild";
|
||||||
import copyStaticFiles from "esbuild-copy-static-files";
|
import copyStaticFiles from "esbuild-copy-static-files";
|
||||||
|
|
||||||
|
300
services/our/package-lock.json
generated
300
services/our/package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "futureporn-our",
|
"name": "futureporn-our",
|
||||||
"version": "2.8.2",
|
"version": "2.8.12",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "futureporn-our",
|
"name": "futureporn-our",
|
||||||
"version": "2.8.2",
|
"version": "2.8.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "3.726.1",
|
"@aws-sdk/client-s3": "3.726.1",
|
||||||
"@aws-sdk/s3-request-presigner": "^3.844.0",
|
"@aws-sdk/s3-request-presigner": "^3.844.0",
|
||||||
@ -21,7 +21,6 @@
|
|||||||
"@fastify/swagger": "^9.5.1",
|
"@fastify/swagger": "^9.5.1",
|
||||||
"@fastify/swagger-ui": "^5.2.3",
|
"@fastify/swagger-ui": "^5.2.3",
|
||||||
"@fastify/view": "^11.1.0",
|
"@fastify/view": "^11.1.0",
|
||||||
"@imgly/background-removal-node": "^1.4.5",
|
|
||||||
"@imqueue/pg-pubsub": "^1.10.0",
|
"@imqueue/pg-pubsub": "^1.10.0",
|
||||||
"@keyv/postgres": "^1.4.11",
|
"@keyv/postgres": "^1.4.11",
|
||||||
"@paralleldrive/cuid2": "^2.2.2",
|
"@paralleldrive/cuid2": "^2.2.2",
|
||||||
@ -2859,113 +2858,6 @@
|
|||||||
"url": "https://opencollective.com/libvips"
|
"url": "https://opencollective.com/libvips"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@imgly/background-removal-node": {
|
|
||||||
"version": "1.4.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@imgly/background-removal-node/-/background-removal-node-1.4.5.tgz",
|
|
||||||
"integrity": "sha512-/s9K88qhKy1jPhrSkBxurUqCVqJ8KHWCc+5yWdppdC4fuSrGC8mK8WQtmULs2ASEr8naY1qpvZu0EL5jr2Hqtg==",
|
|
||||||
"license": "SEE LICENSE IN LICENSE.md",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/lodash": "~4.14.195",
|
|
||||||
"@types/ndarray": "~1.0.14",
|
|
||||||
"@types/node": "~20.3.1",
|
|
||||||
"lodash": "~4.17.21",
|
|
||||||
"ndarray": "~1.0.19",
|
|
||||||
"onnxruntime-node": "~1.17.0",
|
|
||||||
"sharp": "~0.32.4",
|
|
||||||
"zod": "~3.21.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/@types/node": {
|
|
||||||
"version": "20.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz",
|
|
||||||
"integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/node-addon-api": {
|
|
||||||
"version": "6.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
|
|
||||||
"integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/onnxruntime-common": {
|
|
||||||
"version": "1.17.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.17.3.tgz",
|
|
||||||
"integrity": "sha512-IkbaDelNVX8cBfHFgsNADRIq2TlXMFWW+nG55mwWvQT4i0NZb32Jf35Pf6h9yjrnK78RjcnlNYaI37w394ovMw==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/onnxruntime-node": {
|
|
||||||
"version": "1.17.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.17.3.tgz",
|
|
||||||
"integrity": "sha512-NtbN1pfApTSEjVq46LrJ396aPP2Gjhy+oYZi5Bu1leDXAEvVap/BQ8CZELiLs7z0UnXy3xjJW23HiB4P3//FIw==",
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"os": [
|
|
||||||
"win32",
|
|
||||||
"darwin",
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"onnxruntime-common": "1.17.3",
|
|
||||||
"tar": "^7.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/sharp": {
|
|
||||||
"version": "0.32.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
|
|
||||||
"integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"dependencies": {
|
|
||||||
"color": "^4.2.3",
|
|
||||||
"detect-libc": "^2.0.2",
|
|
||||||
"node-addon-api": "^6.1.0",
|
|
||||||
"prebuild-install": "^7.1.1",
|
|
||||||
"semver": "^7.5.4",
|
|
||||||
"simple-get": "^4.0.1",
|
|
||||||
"tar-fs": "^3.0.4",
|
|
||||||
"tunnel-agent": "^0.6.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14.15.0"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://opencollective.com/libvips"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/tar-fs": {
|
|
||||||
"version": "3.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz",
|
|
||||||
"integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"pump": "^3.0.0",
|
|
||||||
"tar-stream": "^3.1.5"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"bare-fs": "^4.0.1",
|
|
||||||
"bare-path": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/tar-stream": {
|
|
||||||
"version": "3.1.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
|
|
||||||
"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"b4a": "^1.6.4",
|
|
||||||
"fast-fifo": "^1.2.0",
|
|
||||||
"streamx": "^2.15.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imgly/background-removal-node/node_modules/zod": {
|
|
||||||
"version": "3.21.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
|
|
||||||
"integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/colinhacks"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@imqueue/pg-pubsub": {
|
"node_modules/@imqueue/pg-pubsub": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@imqueue/pg-pubsub/-/pg-pubsub-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/@imqueue/pg-pubsub/-/pg-pubsub-1.10.0.tgz",
|
||||||
@ -3019,18 +2911,6 @@
|
|||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@isaacs/fs-minipass": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
|
|
||||||
"integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"minipass": "^7.0.4"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@jridgewell/gen-mapping": {
|
"node_modules/@jridgewell/gen-mapping": {
|
||||||
"version": "0.3.12",
|
"version": "0.3.12",
|
||||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
|
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
|
||||||
@ -4434,24 +4314,12 @@
|
|||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/lodash": {
|
|
||||||
"version": "4.14.202",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
|
|
||||||
"integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@types/ms": {
|
"node_modules/@types/ms": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
|
||||||
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
|
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/ndarray": {
|
|
||||||
"version": "1.0.14",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/ndarray/-/ndarray-1.0.14.tgz",
|
|
||||||
"integrity": "sha512-oANmFZMnFQvb219SSBIhI1Ih/r4CvHDOzkWyJS/XRqkMrGH5/kaPSA1hQhdIBzouaE+5KpE/f5ylI9cujmckQg==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.16.3",
|
"version": "22.16.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz",
|
||||||
@ -5256,12 +5124,6 @@
|
|||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/b4a": {
|
|
||||||
"version": "1.6.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
|
|
||||||
"integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
|
|
||||||
"license": "Apache-2.0"
|
|
||||||
},
|
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||||
@ -5286,36 +5148,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/bare-events": {
|
|
||||||
"version": "2.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.0.tgz",
|
|
||||||
"integrity": "sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"node_modules/bare-fs": {
|
|
||||||
"version": "4.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.6.tgz",
|
|
||||||
"integrity": "sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"optional": true,
|
|
||||||
"dependencies": {
|
|
||||||
"bare-events": "^2.5.4",
|
|
||||||
"bare-path": "^3.0.0",
|
|
||||||
"bare-stream": "^2.6.4"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"bare": ">=1.16.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"bare-buffer": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"bare-buffer": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/bare-module-resolve": {
|
"node_modules/bare-module-resolve": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.11.1.tgz",
|
||||||
@ -5357,28 +5189,6 @@
|
|||||||
"integrity": "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg==",
|
"integrity": "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg==",
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/bare-stream": {
|
|
||||||
"version": "2.6.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
|
|
||||||
"integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"optional": true,
|
|
||||||
"dependencies": {
|
|
||||||
"streamx": "^2.21.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"bare-buffer": "*",
|
|
||||||
"bare-events": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"bare-buffer": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"bare-events": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/bare-url": {
|
"node_modules/bare-url": {
|
||||||
"version": "2.1.6",
|
"version": "2.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.1.6.tgz",
|
||||||
@ -6014,15 +5824,6 @@
|
|||||||
"decamelize": "^1.2.0"
|
"decamelize": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/chownr": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
|
|
||||||
"license": "BlueOak-1.0.0",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/class-transformer": {
|
"node_modules/class-transformer": {
|
||||||
"version": "0.5.1",
|
"version": "0.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
|
||||||
@ -8397,12 +8198,6 @@
|
|||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/iota-array": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/ipaddr.js": {
|
"node_modules/ipaddr.js": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
|
||||||
@ -8430,12 +8225,6 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-buffer": {
|
|
||||||
"version": "1.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
|
||||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/is-extglob": {
|
"node_modules/is-extglob": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||||
@ -9122,33 +8911,6 @@
|
|||||||
"node": ">=16 || 14 >=14.17"
|
"node": ">=16 || 14 >=14.17"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minizlib": {
|
|
||||||
"version": "3.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
|
|
||||||
"integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"minipass": "^7.1.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mkdirp": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
|
|
||||||
"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"bin": {
|
|
||||||
"mkdirp": "dist/cjs/src/bin.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mkdirp-classic": {
|
"node_modules/mkdirp-classic": {
|
||||||
"version": "0.5.3",
|
"version": "0.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||||
@ -9274,16 +9036,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/ndarray": {
|
|
||||||
"version": "1.0.19",
|
|
||||||
"resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz",
|
|
||||||
"integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"iota-array": "^1.0.0",
|
|
||||||
"is-buffer": "^1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/neo-async": {
|
"node_modules/neo-async": {
|
||||||
"version": "2.6.2",
|
"version": "2.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
@ -10989,19 +10741,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/streamx": {
|
|
||||||
"version": "2.22.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
|
|
||||||
"integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"fast-fifo": "^1.3.2",
|
|
||||||
"text-decoder": "^1.1.0"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"bare-events": "^2.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/string_decoder": {
|
"node_modules/string_decoder": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||||
@ -11344,23 +11083,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tar": {
|
|
||||||
"version": "7.4.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
|
|
||||||
"integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@isaacs/fs-minipass": "^4.0.0",
|
|
||||||
"chownr": "^3.0.0",
|
|
||||||
"minipass": "^7.1.2",
|
|
||||||
"minizlib": "^3.0.1",
|
|
||||||
"mkdirp": "^3.0.1",
|
|
||||||
"yallist": "^5.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tar-fs": {
|
"node_modules/tar-fs": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
|
||||||
@ -11395,15 +11117,6 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/text-decoder": {
|
|
||||||
"version": "1.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
|
|
||||||
"integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"dependencies": {
|
|
||||||
"b4a": "^1.6.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/thenify": {
|
"node_modules/thenify": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
|
||||||
@ -12404,15 +12117,6 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/yallist": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
|
|
||||||
"license": "BlueOak-1.0.0",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/yaml": {
|
"node_modules/yaml": {
|
||||||
"version": "2.8.0",
|
"version": "2.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "futureporn-our",
|
"name": "futureporn-our",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2.8.12",
|
"version": "2.8.14",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "concurrently npm:dev:serve npm:dev:build:server npm:dev:build:client npm:dev:worker npm:dev:compose npm:dev:sftp npm:dev:qbittorrent npm:dev:tailscale",
|
"dev": "concurrently npm:dev:serve npm:dev:build:server npm:dev:build:client npm:dev:worker npm:dev:compose npm:dev:sftp npm:dev:qbittorrent npm:dev:tailscale",
|
||||||
@ -65,7 +65,6 @@
|
|||||||
"@fastify/swagger": "^9.5.1",
|
"@fastify/swagger": "^9.5.1",
|
||||||
"@fastify/swagger-ui": "^5.2.3",
|
"@fastify/swagger-ui": "^5.2.3",
|
||||||
"@fastify/view": "^11.1.0",
|
"@fastify/view": "^11.1.0",
|
||||||
"@imgly/background-removal-node": "^1.4.5",
|
|
||||||
"@imqueue/pg-pubsub": "^1.10.0",
|
"@imqueue/pg-pubsub": "^1.10.0",
|
||||||
"@keyv/postgres": "^1.4.11",
|
"@keyv/postgres": "^1.4.11",
|
||||||
"@paralleldrive/cuid2": "^2.2.2",
|
"@paralleldrive/cuid2": "^2.2.2",
|
||||||
|
@ -39,94 +39,6 @@ export default async function streamsRoutes(
|
|||||||
fastify: FastifyInstance,
|
fastify: FastifyInstance,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
|
||||||
fastify.post('/image', async function (req, reply) {
|
|
||||||
const data = await req.file();
|
|
||||||
if (!data) throw new Error('A file was not received');
|
|
||||||
|
|
||||||
// get the user id from the cookie
|
|
||||||
const twitchUser = req.session.get('twitch_user')
|
|
||||||
if (!twitchUser?.id) throw new Error('twitch id not found in cookie. please log in before trying again.');
|
|
||||||
|
|
||||||
const user = await prisma.user.findFirst({
|
|
||||||
where: {
|
|
||||||
twitchId: twitchUser.id
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!user?.id) throw new Error('failed to lookup user. please log in and try again.');
|
|
||||||
|
|
||||||
logger.debug(`Received /image data. filename=${data.filename}, mimetype=${data.mimetype}, waifu-name=${data.fields['waifu-name']}, remove-bg=${data.fields['remove-bg']}`, data);
|
|
||||||
|
|
||||||
let tmpFile = path.join(tmpdir(), nanoid());
|
|
||||||
await pipeline(data.file, fs.createWriteStream(tmpFile));
|
|
||||||
|
|
||||||
const waifuName = data.fields?.['waifu-name']?.value;
|
|
||||||
if (!waifuName) throw new Error('Missing waifu-name in the form fields');
|
|
||||||
|
|
||||||
|
|
||||||
const removeBg = Boolean(data.fields?.['remove-bg']?.value === "true");
|
|
||||||
|
|
||||||
|
|
||||||
if (removeBg) {
|
|
||||||
tmpFile = await run(tmpFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function buildUrl(key: string) {
|
|
||||||
return `${constants.cdnOrigin}/${key}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getS3Key(waifuName: string, filename: string, isWebp: boolean) {
|
|
||||||
logger.debug(`getS3Key called with ${waifuName} ${filename} ${isWebp}`)
|
|
||||||
const ext = (isWebp) ? 'webp' : filename.split('.').pop()?.toLowerCase();
|
|
||||||
return `img/${nanoid()}/${slug(waifuName).substring(0, 24)}.${ext}`
|
|
||||||
}
|
|
||||||
const mimetype = (removeBg) ? 'image/webp' : data.mimetype;
|
|
||||||
|
|
||||||
const pre: CS3Asset = {
|
|
||||||
file_path: tmpFile,
|
|
||||||
mimetype,
|
|
||||||
bytes: 0,
|
|
||||||
key: getS3Key(waifuName, data.filename, removeBg),
|
|
||||||
s3_resource: s3Resource
|
|
||||||
}
|
|
||||||
|
|
||||||
const uploadedAsset = await uploadFile(s3Client, s3Resource, pre, mimetype)
|
|
||||||
logger.debug('uploadedAsset as follows')
|
|
||||||
logger.debug(uploadedAsset)
|
|
||||||
|
|
||||||
const idk = await createRecord(waifuName, uploadedAsset.key, user.id)
|
|
||||||
logger.debug('idk as follows')
|
|
||||||
logger.debug(idk)
|
|
||||||
|
|
||||||
const url = buildUrl(idk.imageS3Key)
|
|
||||||
logger.trace('url as follows')
|
|
||||||
logger.trace(url)
|
|
||||||
|
|
||||||
|
|
||||||
reply.send({
|
|
||||||
url
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function createRecord(name: string, imageS3Key: string, authorId: number) {
|
|
||||||
|
|
||||||
const newWaifu = await prisma.waifu.create({
|
|
||||||
data: {
|
|
||||||
name: name,
|
|
||||||
imageS3Key,
|
|
||||||
authorId
|
|
||||||
},
|
|
||||||
})
|
|
||||||
logger.debug(newWaifu)
|
|
||||||
return newWaifu
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fastify.get('/streams', function (request, reply) {
|
fastify.get('/streams', function (request, reply) {
|
||||||
|
@ -1,10 +1,20 @@
|
|||||||
/**
|
/**
|
||||||
|
*
|
||||||
|
* # createTorrent
|
||||||
|
*
|
||||||
|
* ## notes
|
||||||
|
*
|
||||||
|
* ### torrents
|
||||||
* downloading a random sample of linux torrents,
|
* downloading a random sample of linux torrents,
|
||||||
* I see that most people create their torrent files using
|
* I see that most people create their torrent files using
|
||||||
* * transmission
|
* * transmission
|
||||||
* * mktorrent
|
* * mktorrent
|
||||||
* * qbittorrent
|
* * qbittorrent
|
||||||
* *
|
*
|
||||||
|
* ### .note
|
||||||
|
* FYI, this module creates two .node files when bundled by tsup.
|
||||||
|
* Graphile worker will warn about not being able to handle these.
|
||||||
|
* (ignore the warnings.)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
import {
|
|
||||||
removeBackground,
|
|
||||||
segmentForeground,
|
|
||||||
applySegmentationMask
|
|
||||||
} from '@imgly/background-removal-node';
|
|
||||||
import { nanoid } from 'nanoid';
|
|
||||||
import fs from 'node:fs';
|
|
||||||
import logger from './logger';
|
|
||||||
|
|
||||||
export async function run(imageFilePath: string): Promise<string> {
|
|
||||||
|
|
||||||
logger.info(`imageFilePath=${imageFilePath}`);
|
|
||||||
const config = {
|
|
||||||
debug: false,
|
|
||||||
// publicPath: ...,
|
|
||||||
progress: (key, current, total) => {
|
|
||||||
const [type, subtype] = key.split(':');
|
|
||||||
logger.info(
|
|
||||||
`progress:: ${type} ${subtype} ${((current / total) * 100).toFixed(0)}%`
|
|
||||||
);
|
|
||||||
},
|
|
||||||
model: 'small',
|
|
||||||
output: {
|
|
||||||
quality: 0.8,
|
|
||||||
format: 'image/webp' //image/jpeg, image/webp
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const blob = await removeBackground(imageFilePath, config);
|
|
||||||
|
|
||||||
|
|
||||||
// const mask = await segmentForeground(randomImage, config);
|
|
||||||
// const blob = await applySegmentationMask(randomImage, mask, config);
|
|
||||||
const buffer = await blob.arrayBuffer();
|
|
||||||
|
|
||||||
const format = config.output.format.split('/').pop();
|
|
||||||
const outFile = `tmp/${nanoid()}.${format}`;
|
|
||||||
await fs.promises.mkdir('tmp', { recursive: true });
|
|
||||||
await fs.promises.writeFile(outFile, Buffer.from(buffer));
|
|
||||||
logger.info(`Image saved to ${outFile}`);
|
|
||||||
return outFile
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user