mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 11:29:46 +00:00
Merge branch 'ipfs-image-metadata' into 'main'
Add additional image metadata for images Closes #248 See merge request soapbox-pub/ditto!570
This commit is contained in:
commit
fe222f37e0
4 changed files with 239 additions and 0 deletions
|
|
@ -59,6 +59,7 @@
|
||||||
"@std/json": "jsr:@std/json@^0.223.0",
|
"@std/json": "jsr:@std/json@^0.223.0",
|
||||||
"@std/media-types": "jsr:@std/media-types@^0.224.1",
|
"@std/media-types": "jsr:@std/media-types@^0.224.1",
|
||||||
"@std/streams": "jsr:@std/streams@^0.223.0",
|
"@std/streams": "jsr:@std/streams@^0.223.0",
|
||||||
|
"blurhash": "npm:blurhash@2.0.5",
|
||||||
"comlink": "npm:comlink@^4.4.1",
|
"comlink": "npm:comlink@^4.4.1",
|
||||||
"comlink-async-generator": "npm:comlink-async-generator@^0.0.1",
|
"comlink-async-generator": "npm:comlink-async-generator@^0.0.1",
|
||||||
"commander": "npm:commander@12.1.0",
|
"commander": "npm:commander@12.1.0",
|
||||||
|
|
@ -85,6 +86,7 @@
|
||||||
"postgres": "https://gitlab.com/soapbox-pub/postgres.js/-/raw/e79d7d2039446fbf7a37d4eca0d17e94a94b8b53/deno/mod.js",
|
"postgres": "https://gitlab.com/soapbox-pub/postgres.js/-/raw/e79d7d2039446fbf7a37d4eca0d17e94a94b8b53/deno/mod.js",
|
||||||
"prom-client": "npm:prom-client@^15.1.2",
|
"prom-client": "npm:prom-client@^15.1.2",
|
||||||
"question-deno": "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/mod.ts",
|
"question-deno": "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/mod.ts",
|
||||||
|
"sharp": "npm:sharp@^0.33.5",
|
||||||
"tldts": "npm:tldts@^6.0.14",
|
"tldts": "npm:tldts@^6.0.14",
|
||||||
"tseep": "npm:tseep@^1.2.1",
|
"tseep": "npm:tseep@^1.2.1",
|
||||||
"type-fest": "npm:type-fest@^4.3.0",
|
"type-fest": "npm:type-fest@^4.3.0",
|
||||||
|
|
|
||||||
181
deno.lock
generated
181
deno.lock
generated
|
|
@ -36,6 +36,7 @@
|
||||||
"jsr:@nostrify/nostrify@~0.22.4": "0.22.4",
|
"jsr:@nostrify/nostrify@~0.22.4": "0.22.4",
|
||||||
"jsr:@nostrify/nostrify@~0.22.5": "0.22.5",
|
"jsr:@nostrify/nostrify@~0.22.5": "0.22.5",
|
||||||
"jsr:@nostrify/policies@0.33": "0.33.0",
|
"jsr:@nostrify/policies@0.33": "0.33.0",
|
||||||
|
"jsr:@nostrify/policies@0.33.1": "0.33.1",
|
||||||
"jsr:@nostrify/policies@0.34": "0.34.0",
|
"jsr:@nostrify/policies@0.34": "0.34.0",
|
||||||
"jsr:@nostrify/policies@0.35": "0.35.0",
|
"jsr:@nostrify/policies@0.35": "0.35.0",
|
||||||
"jsr:@nostrify/policies@0.36": "0.36.0",
|
"jsr:@nostrify/policies@0.36": "0.36.0",
|
||||||
|
|
@ -86,6 +87,7 @@
|
||||||
"npm:@scure/bip32@^1.4.0": "1.4.0",
|
"npm:@scure/bip32@^1.4.0": "1.4.0",
|
||||||
"npm:@scure/bip39@^1.3.0": "1.3.0",
|
"npm:@scure/bip39@^1.3.0": "1.3.0",
|
||||||
"npm:@types/node@*": "18.16.19",
|
"npm:@types/node@*": "18.16.19",
|
||||||
|
"npm:blurhash@2.0.5": "2.0.5",
|
||||||
"npm:comlink-async-generator@*": "0.0.1",
|
"npm:comlink-async-generator@*": "0.0.1",
|
||||||
"npm:comlink-async-generator@^0.0.1": "0.0.1",
|
"npm:comlink-async-generator@^0.0.1": "0.0.1",
|
||||||
"npm:comlink@^4.4.1": "4.4.1",
|
"npm:comlink@^4.4.1": "4.4.1",
|
||||||
|
|
@ -116,6 +118,7 @@
|
||||||
"npm:png-to-ico@^2.1.8": "2.1.8",
|
"npm:png-to-ico@^2.1.8": "2.1.8",
|
||||||
"npm:postgres@3.4.4": "3.4.4",
|
"npm:postgres@3.4.4": "3.4.4",
|
||||||
"npm:prom-client@^15.1.2": "15.1.2",
|
"npm:prom-client@^15.1.2": "15.1.2",
|
||||||
|
"npm:sharp@~0.33.5": "0.33.5",
|
||||||
"npm:tldts@^6.0.14": "6.1.18",
|
"npm:tldts@^6.0.14": "6.1.18",
|
||||||
"npm:tseep@^1.2.1": "1.2.1",
|
"npm:tseep@^1.2.1": "1.2.1",
|
||||||
"npm:type-fest@^4.3.0": "4.18.2",
|
"npm:type-fest@^4.3.0": "4.18.2",
|
||||||
|
|
@ -655,6 +658,96 @@
|
||||||
"@electric-sql/pglite@0.2.8": {
|
"@electric-sql/pglite@0.2.8": {
|
||||||
"integrity": "sha512-0wSmQu22euBRzR5ghqyIHnBH4MfwlkL5WstOrrA3KOsjEWEglvoL/gH92JajEUA6Ufei/+qbkB2hVloC/K/RxQ=="
|
"integrity": "sha512-0wSmQu22euBRzR5ghqyIHnBH4MfwlkL5WstOrrA3KOsjEWEglvoL/gH92JajEUA6Ufei/+qbkB2hVloC/K/RxQ=="
|
||||||
},
|
},
|
||||||
|
"@emnapi/runtime@1.3.1": {
|
||||||
|
"integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
|
||||||
|
"dependencies": [
|
||||||
|
"tslib"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-darwin-arm64@0.33.5": {
|
||||||
|
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-darwin-arm64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-darwin-x64@0.33.5": {
|
||||||
|
"integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-darwin-x64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-darwin-arm64@1.0.4": {
|
||||||
|
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-darwin-x64@1.0.4": {
|
||||||
|
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linux-arm64@1.0.4": {
|
||||||
|
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linux-arm@1.0.5": {
|
||||||
|
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linux-s390x@1.0.4": {
|
||||||
|
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linux-x64@1.0.4": {
|
||||||
|
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64@1.0.4": {
|
||||||
|
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="
|
||||||
|
},
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64@1.0.4": {
|
||||||
|
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="
|
||||||
|
},
|
||||||
|
"@img/sharp-linux-arm64@0.33.5": {
|
||||||
|
"integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linux-arm64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-linux-arm@0.33.5": {
|
||||||
|
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linux-arm"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-linux-s390x@0.33.5": {
|
||||||
|
"integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linux-s390x"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-linux-x64@0.33.5": {
|
||||||
|
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linux-x64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-linuxmusl-arm64@0.33.5": {
|
||||||
|
"integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-linuxmusl-x64@0.33.5": {
|
||||||
|
"integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-wasm32@0.33.5": {
|
||||||
|
"integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
|
||||||
|
"dependencies": [
|
||||||
|
"@emnapi/runtime"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@img/sharp-win32-ia32@0.33.5": {
|
||||||
|
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="
|
||||||
|
},
|
||||||
|
"@img/sharp-win32-x64@0.33.5": {
|
||||||
|
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="
|
||||||
|
},
|
||||||
"@isaacs/ttlcache@1.4.1": {
|
"@isaacs/ttlcache@1.4.1": {
|
||||||
"integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="
|
"integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="
|
||||||
},
|
},
|
||||||
|
|
@ -769,6 +862,9 @@
|
||||||
"bintrees@1.0.2": {
|
"bintrees@1.0.2": {
|
||||||
"integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
|
"integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
|
||||||
},
|
},
|
||||||
|
"blurhash@2.0.5": {
|
||||||
|
"integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w=="
|
||||||
|
},
|
||||||
"braces@3.0.2": {
|
"braces@3.0.2": {
|
||||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -791,6 +887,29 @@
|
||||||
"string-width"
|
"string-width"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"color-convert@2.0.1": {
|
||||||
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dependencies": [
|
||||||
|
"color-name"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"color-name@1.1.4": {
|
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||||
|
},
|
||||||
|
"color-string@1.9.1": {
|
||||||
|
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
|
||||||
|
"dependencies": [
|
||||||
|
"color-name",
|
||||||
|
"simple-swizzle"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"color@4.2.3": {
|
||||||
|
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
|
||||||
|
"dependencies": [
|
||||||
|
"color-convert",
|
||||||
|
"color-string"
|
||||||
|
]
|
||||||
|
},
|
||||||
"colorette@2.0.20": {
|
"colorette@2.0.20": {
|
||||||
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
|
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
|
||||||
},
|
},
|
||||||
|
|
@ -854,6 +973,9 @@
|
||||||
"delayed-stream@1.0.0": {
|
"delayed-stream@1.0.0": {
|
||||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
|
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
|
||||||
},
|
},
|
||||||
|
"detect-libc@2.0.3": {
|
||||||
|
"integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="
|
||||||
|
},
|
||||||
"dom-serializer@2.0.0": {
|
"dom-serializer@2.0.0": {
|
||||||
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
|
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -987,6 +1109,18 @@
|
||||||
"safer-buffer"
|
"safer-buffer"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"image-size@1.1.1": {
|
||||||
|
"integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==",
|
||||||
|
"dependencies": [
|
||||||
|
"queue"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"inherits@2.0.4": {
|
||||||
|
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||||
|
},
|
||||||
|
"is-arrayish@0.3.2": {
|
||||||
|
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
|
||||||
|
},
|
||||||
"is-fullwidth-code-point@4.0.0": {
|
"is-fullwidth-code-point@4.0.0": {
|
||||||
"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="
|
"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="
|
||||||
},
|
},
|
||||||
|
|
@ -1260,6 +1394,12 @@
|
||||||
"punycode@2.3.1": {
|
"punycode@2.3.1": {
|
||||||
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
|
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
|
||||||
},
|
},
|
||||||
|
"queue@6.0.2": {
|
||||||
|
"integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
|
||||||
|
"dependencies": [
|
||||||
|
"inherits"
|
||||||
|
]
|
||||||
|
},
|
||||||
"restore-cursor@4.0.0": {
|
"restore-cursor@4.0.0": {
|
||||||
"integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
|
"integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -1282,6 +1422,36 @@
|
||||||
"xmlchars"
|
"xmlchars"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"semver@7.6.3": {
|
||||||
|
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="
|
||||||
|
},
|
||||||
|
"sharp@0.33.5": {
|
||||||
|
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
|
||||||
|
"dependencies": [
|
||||||
|
"@img/sharp-darwin-arm64",
|
||||||
|
"@img/sharp-darwin-x64",
|
||||||
|
"@img/sharp-libvips-darwin-arm64",
|
||||||
|
"@img/sharp-libvips-darwin-x64",
|
||||||
|
"@img/sharp-libvips-linux-arm",
|
||||||
|
"@img/sharp-libvips-linux-arm64",
|
||||||
|
"@img/sharp-libvips-linux-s390x",
|
||||||
|
"@img/sharp-libvips-linux-x64",
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64",
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64",
|
||||||
|
"@img/sharp-linux-arm",
|
||||||
|
"@img/sharp-linux-arm64",
|
||||||
|
"@img/sharp-linux-s390x",
|
||||||
|
"@img/sharp-linux-x64",
|
||||||
|
"@img/sharp-linuxmusl-arm64",
|
||||||
|
"@img/sharp-linuxmusl-x64",
|
||||||
|
"@img/sharp-wasm32",
|
||||||
|
"@img/sharp-win32-ia32",
|
||||||
|
"@img/sharp-win32-x64",
|
||||||
|
"color",
|
||||||
|
"detect-libc",
|
||||||
|
"semver"
|
||||||
|
]
|
||||||
|
},
|
||||||
"shebang-command@2.0.0": {
|
"shebang-command@2.0.0": {
|
||||||
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -1297,6 +1467,12 @@
|
||||||
"signal-exit@4.1.0": {
|
"signal-exit@4.1.0": {
|
||||||
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
|
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
|
||||||
},
|
},
|
||||||
|
"simple-swizzle@0.2.2": {
|
||||||
|
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
|
||||||
|
"dependencies": [
|
||||||
|
"is-arrayish"
|
||||||
|
]
|
||||||
|
},
|
||||||
"slice-ansi@5.0.0": {
|
"slice-ansi@5.0.0": {
|
||||||
"integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
|
"integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -1385,6 +1561,9 @@
|
||||||
"tseep@1.2.1": {
|
"tseep@1.2.1": {
|
||||||
"integrity": "sha512-VFnsNcPGC4qFJ1nxbIPSjTmtRZOhlqLmtwRqtLVos8mbRHki8HO9cy9Z1e89EiWyxFmq6LBviI9TQjijxw/mEw=="
|
"integrity": "sha512-VFnsNcPGC4qFJ1nxbIPSjTmtRZOhlqLmtwRqtLVos8mbRHki8HO9cy9Z1e89EiWyxFmq6LBviI9TQjijxw/mEw=="
|
||||||
},
|
},
|
||||||
|
"tslib@2.6.2": {
|
||||||
|
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||||
|
},
|
||||||
"type-fest@3.13.1": {
|
"type-fest@3.13.1": {
|
||||||
"integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="
|
"integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="
|
||||||
},
|
},
|
||||||
|
|
@ -2106,6 +2285,7 @@
|
||||||
"npm:@isaacs/ttlcache@^1.4.1",
|
"npm:@isaacs/ttlcache@^1.4.1",
|
||||||
"npm:@noble/secp256k1@2",
|
"npm:@noble/secp256k1@2",
|
||||||
"npm:@scure/base@^1.1.6",
|
"npm:@scure/base@^1.1.6",
|
||||||
|
"npm:blurhash@2.0.5",
|
||||||
"npm:comlink-async-generator@^0.0.1",
|
"npm:comlink-async-generator@^0.0.1",
|
||||||
"npm:comlink@^4.4.1",
|
"npm:comlink@^4.4.1",
|
||||||
"npm:commander@12.1.0",
|
"npm:commander@12.1.0",
|
||||||
|
|
@ -2128,6 +2308,7 @@
|
||||||
"npm:path-to-regexp@^7.1.0",
|
"npm:path-to-regexp@^7.1.0",
|
||||||
"npm:png-to-ico@^2.1.8",
|
"npm:png-to-ico@^2.1.8",
|
||||||
"npm:prom-client@^15.1.2",
|
"npm:prom-client@^15.1.2",
|
||||||
|
"npm:sharp@~0.33.5",
|
||||||
"npm:tldts@^6.0.14",
|
"npm:tldts@^6.0.14",
|
||||||
"npm:tseep@^1.2.1",
|
"npm:tseep@^1.2.1",
|
||||||
"npm:type-fest@^4.3.0",
|
"npm:type-fest@^4.3.0",
|
||||||
|
|
|
||||||
|
|
@ -201,6 +201,13 @@ class Conf {
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Whether to analyze media metadata with [blurhash](https://www.npmjs.com/package/blurhash) and [sharp](https://www.npmjs.com/package/sharp).
|
||||||
|
* This is prone to security vulnerabilities, which is why it's not enabled by default.
|
||||||
|
*/
|
||||||
|
static get mediaAnalyze(): boolean {
|
||||||
|
return optionalBooleanSchema.parse(Deno.env.get('MEDIA_ANALYZE')) ?? false;
|
||||||
|
}
|
||||||
/** Max upload size for files in number of bytes. Default 100MiB. */
|
/** Max upload size for files in number of bytes. Default 100MiB. */
|
||||||
static get maxUploadSize(): number {
|
static get maxUploadSize(): number {
|
||||||
return Number(Deno.env.get('MAX_UPLOAD_SIZE') || 100 * 1024 * 1024);
|
return Number(Deno.env.get('MAX_UPLOAD_SIZE') || 100 * 1024 * 1024);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,16 @@
|
||||||
import { HTTPException } from '@hono/hono/http-exception';
|
import { HTTPException } from '@hono/hono/http-exception';
|
||||||
|
import { Stickynotes } from '@soapbox/stickynotes';
|
||||||
|
import { crypto } from '@std/crypto';
|
||||||
|
import { encodeHex } from '@std/encoding/hex';
|
||||||
|
import { encode } from 'blurhash';
|
||||||
|
import sharp from 'sharp';
|
||||||
|
|
||||||
import { AppContext } from '@/app.ts';
|
import { AppContext } from '@/app.ts';
|
||||||
import { Conf } from '@/config.ts';
|
import { Conf } from '@/config.ts';
|
||||||
import { DittoUpload, dittoUploads } from '@/DittoUploads.ts';
|
import { DittoUpload, dittoUploads } from '@/DittoUploads.ts';
|
||||||
|
|
||||||
|
const console = new Stickynotes('ditto:uploader');
|
||||||
|
|
||||||
interface FileMeta {
|
interface FileMeta {
|
||||||
pubkey: string;
|
pubkey: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
|
|
@ -36,6 +43,48 @@ export async function uploadFile(
|
||||||
tags.push(['alt', description]);
|
tags.push(['alt', description]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const x = tags.find(([key]) => key === 'x')?.[1];
|
||||||
|
const m = tags.find(([key]) => key === 'm')?.[1];
|
||||||
|
const dim = tags.find(([key]) => key === 'dim')?.[1];
|
||||||
|
const blurhash = tags.find(([key]) => key === 'blurhash')?.[1];
|
||||||
|
|
||||||
|
if (!x) {
|
||||||
|
const sha256 = encodeHex(await crypto.subtle.digest('SHA-256', file.stream()));
|
||||||
|
tags.push(['x', sha256]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m) {
|
||||||
|
tags.push(['m', file.type]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the uploader didn't already, try to get a blurhash and media dimensions.
|
||||||
|
// This requires `MEDIA_ANALYZE=true` to be configured because it comes with security tradeoffs.
|
||||||
|
if (Conf.mediaAnalyze && (!blurhash || !dim)) {
|
||||||
|
try {
|
||||||
|
const bytes = await new Response(file.stream()).bytes();
|
||||||
|
const img = sharp(bytes);
|
||||||
|
|
||||||
|
const { width, height } = await img.metadata();
|
||||||
|
|
||||||
|
if (!dim && (width && height)) {
|
||||||
|
tags.push(['dim', `${width}x${height}`]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!blurhash && (width && height)) {
|
||||||
|
const pixels = await img
|
||||||
|
.raw()
|
||||||
|
.ensureAlpha()
|
||||||
|
.toBuffer({ resolveWithObject: false })
|
||||||
|
.then((buffer) => new Uint8ClampedArray(buffer));
|
||||||
|
|
||||||
|
const blurhash = encode(pixels, width, height, 4, 4);
|
||||||
|
tags.push(['blurhash', blurhash]);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`Error parsing image metadata: ${e}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const upload = {
|
const upload = {
|
||||||
id: crypto.randomUUID(),
|
id: crypto.randomUUID(),
|
||||||
url,
|
url,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue