From 9c88d0791fd580a52a8d0df3b4ce071814b49025 Mon Sep 17 00:00:00 2001 From: CJ_Clippy Date: Fri, 26 Sep 2025 05:14:08 -0800 Subject: [PATCH] bake in python --- services/our/Dockerfile | 38 ++- services/our/build.mjs | 8 +- services/our/package-lock.json | 300 +----------------------- services/our/package.json | 3 +- services/our/src/plugins/streams.ts | 88 ------- services/our/src/tasks/createTorrent.ts | 12 +- services/our/src/utils/remove-bg.ts | 45 ---- 7 files changed, 38 insertions(+), 456 deletions(-) delete mode 100644 services/our/src/utils/remove-bg.ts diff --git a/services/our/Dockerfile b/services/our/Dockerfile index 3856f11..ae353a1 100644 --- a/services/our/Dockerfile +++ b/services/our/Dockerfile @@ -29,36 +29,18 @@ COPY . . 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. # === Runtime stage === -FROM node:22-slim +FROM node:22-slim AS release # Set working directory WORKDIR /app ENV PATH="/app/venv/bin:$PATH" + # Install only runtime dependencies RUN --mount=type=cache,target=/var/cache/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 \ ca-certificates \ ffmpeg \ + python3 \ + python3-venv \ wget \ && 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 RUN wget -q https://github.com/shaka-project/shaka-packager/releases/download/v3.4.2/packager-linux-x64 \ -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/graphile.config.ts ./graphile.config.ts COPY --from=builder /app/crontab ./crontab -COPY --from=pystuff /app/venv /app/venv + +RUN . /app/venv/bin/activate # Expose the port EXPOSE 5000 diff --git a/services/our/build.mjs b/services/our/build.mjs index ac358d9..0357186 100644 --- a/services/our/build.mjs +++ b/services/our/build.mjs @@ -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 copyStaticFiles from "esbuild-copy-static-files"; diff --git a/services/our/package-lock.json b/services/our/package-lock.json index 6012635..2945061 100644 --- a/services/our/package-lock.json +++ b/services/our/package-lock.json @@ -1,12 +1,12 @@ { "name": "futureporn-our", - "version": "2.8.2", + "version": "2.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "futureporn-our", - "version": "2.8.2", + "version": "2.8.12", "dependencies": { "@aws-sdk/client-s3": "3.726.1", "@aws-sdk/s3-request-presigner": "^3.844.0", @@ -21,7 +21,6 @@ "@fastify/swagger": "^9.5.1", "@fastify/swagger-ui": "^5.2.3", "@fastify/view": "^11.1.0", - "@imgly/background-removal-node": "^1.4.5", "@imqueue/pg-pubsub": "^1.10.0", "@keyv/postgres": "^1.4.11", "@paralleldrive/cuid2": "^2.2.2", @@ -2859,113 +2858,6 @@ "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": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@imqueue/pg-pubsub/-/pg-pubsub-1.10.0.tgz", @@ -3019,18 +2911,6 @@ "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": { "version": "0.3.12", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", @@ -4434,24 +4314,12 @@ "@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": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "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": { "version": "22.16.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz", @@ -5256,12 +5124,6 @@ "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": { "version": "1.0.2", "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": { "version": "1.11.1", "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==", "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": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.1.6.tgz", @@ -6014,15 +5824,6 @@ "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": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", @@ -8397,12 +8198,6 @@ "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": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -8430,12 +8225,6 @@ "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": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -9122,33 +8911,6 @@ "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": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -9274,16 +9036,6 @@ "dev": true, "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": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -10989,19 +10741,6 @@ "dev": true, "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": { "version": "1.3.0", "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": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", @@ -11395,15 +11117,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": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -12404,15 +12117,6 @@ "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": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", diff --git a/services/our/package.json b/services/our/package.json index 5126a98..8a4b25c 100644 --- a/services/our/package.json +++ b/services/our/package.json @@ -1,7 +1,7 @@ { "name": "futureporn-our", "private": true, - "version": "2.8.12", + "version": "2.8.14", "type": "module", "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", @@ -65,7 +65,6 @@ "@fastify/swagger": "^9.5.1", "@fastify/swagger-ui": "^5.2.3", "@fastify/view": "^11.1.0", - "@imgly/background-removal-node": "^1.4.5", "@imqueue/pg-pubsub": "^1.10.0", "@keyv/postgres": "^1.4.11", "@paralleldrive/cuid2": "^2.2.2", diff --git a/services/our/src/plugins/streams.ts b/services/our/src/plugins/streams.ts index b0fdea5..9ee4526 100644 --- a/services/our/src/plugins/streams.ts +++ b/services/our/src/plugins/streams.ts @@ -39,94 +39,6 @@ export default async function streamsRoutes( fastify: FastifyInstance, ): Promise { - 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) { diff --git a/services/our/src/tasks/createTorrent.ts b/services/our/src/tasks/createTorrent.ts index 3186d60..67969b5 100644 --- a/services/our/src/tasks/createTorrent.ts +++ b/services/our/src/tasks/createTorrent.ts @@ -1,10 +1,20 @@ /** + * + * # createTorrent + * + * ## notes + * + * ### torrents * downloading a random sample of linux torrents, * I see that most people create their torrent files using * * transmission * * mktorrent * * 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.) * */ diff --git a/services/our/src/utils/remove-bg.ts b/services/our/src/utils/remove-bg.ts deleted file mode 100644 index e7c7051..0000000 --- a/services/our/src/utils/remove-bg.ts +++ /dev/null @@ -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 { - - 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 - - -} -